From 6adcdfcaaa5e1e2f9eb67c1c8a6a466df332df50 Mon Sep 17 00:00:00 2001 From: rocky Date: Mon, 2 Jan 2023 18:21:32 -0500 Subject: [PATCH 001/209] Allow fontsize on Asymptote pen creation... Use that in asy inset_box in creating labels. In general, we trying to make SVG and Aysmptote more the same. In the process add some comments and type annotations. --- mathics/format/asy.py | 6 +++++- mathics/format/asy_fns.py | 14 ++++++++++---- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/mathics/format/asy.py b/mathics/format/asy.py index 5223cbba8..3b328ee4b 100644 --- a/mathics/format/asy.py +++ b/mathics/format/asy.py @@ -411,7 +411,11 @@ def inset_box(self, **options) -> str: x, y = self.pos.pos() opacity_value = self.opacity.opacity if self.opacity else None content = self.content.boxes_to_tex(evaluation=self.graphics.evaluation) - pen = asy_create_pens(edge_color=self.color, edge_opacity=opacity_value) + # FIXME: don't hard code text_style_opts, but allow these to be adjustable. + font_size = 3 + pen = asy_create_pens( + edge_color=self.color, edge_opacity=opacity_value, fontsize=font_size + ) asy = """// InsetBox label("$%s$", (%s,%s), (%s,%s), %s);\n""" % ( content, diff --git a/mathics/format/asy_fns.py b/mathics/format/asy_fns.py index f6f2935dd..85f484bf3 100644 --- a/mathics/format/asy_fns.py +++ b/mathics/format/asy_fns.py @@ -5,6 +5,9 @@ """ from itertools import chain +from typing import Optional, Type, Union + +RealType = Type[Union[int, float]] def asy_add_bezier_fn(self) -> str: @@ -103,13 +106,14 @@ def asy_color(self): def asy_create_pens( - edge_color=None, - face_color=None, - edge_opacity=None, - face_opacity=None, + edge_color: Optional[str] = None, + face_color: Optional[str] = None, + edge_opacity: Optional[RealType] = None, + face_opacity: Optional[RealType] = None, stroke_width=None, is_face_element=False, dotfactor=None, + fontsize: Optional[RealType] = None, ) -> str: """ Return an asymptote string fragment that creates a drawing pen. @@ -132,6 +136,8 @@ def asy_create_pens( opacity = edge_opacity if opacity is not None and opacity != 1: pen += f"+opacity({asy_number(opacity)})" + if fontsize is not None: + pen += f"+fontsize({fontsize})" if stroke_width is not None: pen += f"+linewidth({asy_number(stroke_width)})" result.append(pen) From e114bc4316434fe9f21c34454e0d17c5b6739f93 Mon Sep 17 00:00:00 2001 From: rocky Date: Mon, 2 Jan 2023 18:30:27 -0500 Subject: [PATCH 002/209] Annotation and style-like changes --- mathics/builtin/box/graphics.py | 96 ++++++++++++++++++++------------- 1 file changed, 58 insertions(+), 38 deletions(-) diff --git a/mathics/builtin/box/graphics.py b/mathics/builtin/box/graphics.py index f36ea2620..ce5de82a0 100644 --- a/mathics/builtin/box/graphics.py +++ b/mathics/builtin/box/graphics.py @@ -692,26 +692,38 @@ def boxes_to_svg(self, elements=None, **options) -> str: svg_body = format_fn(self, elements, data=data, **options) return svg_body - def create_axes(self, elements, graphics_options, xmin, xmax, ymin, ymax): + def create_axes(self, elements, graphics_options, xmin, xmax, ymin, ymax) -> tuple: + + # Note that Asymptote has special commands for drawing axes, like "xaxis" + # "yaxis", "xtick" "labelx", "labely". Entend our language + # here and use those in render-like routines. + use_log_for_y_axis = graphics_options.get("System`LogPlot", False) - axes = graphics_options.get("System`Axes") - if axes is SymbolTrue: + axes_option = graphics_options.get("System`Axes") + + if axes_option is SymbolTrue: axes = (True, True) - elif axes.has_form("List", 2): - axes = (axes.elements[0] is SymbolTrue, axes.elements[1] is SymbolTrue) + elif axes_option.has_form("List", 2): + axes = ( + axes_option.elements[0] is SymbolTrue, + axes_option.elements[1] is SymbolTrue, + ) else: axes = (False, False) - ticks_style = graphics_options.get("System`TicksStyle") - axes_style = graphics_options.get("System`AxesStyle") + + ticks_style_option = graphics_options.get("System`TicksStyle") + axes_style_option = graphics_options.get("System`AxesStyle") label_style = graphics_options.get("System`LabelStyle") - if ticks_style.has_form("List", 2): - ticks_style = ticks_style.elements + + if ticks_style_option.has_form("List", 2): + ticks_style = ticks_style_option.elements else: - ticks_style = [ticks_style] * 2 - if axes_style.has_form("List", 2): - axes_style = axes_style.elements + ticks_style = [ticks_style_option] * 2 + + if axes_style_option.has_form("List", 2): + axes_style = axes_style_option.elements else: - axes_style = [axes_style] * 2 + axes_style = [axes_style_option] * 2 ticks_style = [elements.create_style(s) for s in ticks_style] axes_style = [elements.create_style(s) for s in axes_style] @@ -723,12 +735,16 @@ def add_element(element): element.is_completely_visible = True elements.elements.append(element) + # Units seem to be in point size units + ticks_x, ticks_x_small, origin_x = self.axis_ticks(xmin, xmax) ticks_y, ticks_y_small, origin_y = self.axis_ticks(ymin, ymax) axes_extra = 6 + tick_small_size = 3 tick_large_size = 5 + tick_label_d = 2 ticks_x_int = all(floor(x) == x for x in ticks_x) @@ -791,8 +807,10 @@ def add_element(element): ) ) ticks_lines = [] + tick_label_style = ticks_style[index].clone() tick_label_style.extend(label_style) + for x in ticks: ticks_lines.append( [ @@ -816,6 +834,7 @@ def add_element(element): content = String( "%g" % tick_value ) # fix e.g. 0.6000000000000001 + add_element( InsetBox( elements, @@ -839,31 +858,32 @@ def add_element(element): add_element(LineBox(elements, axes_style[0], lines=ticks_lines)) return axes - """if axes[1]: - add_element(LineBox(elements, axes_style[1], lines=[[Coords(elements, pos=(origin_x,ymin), d=(0,-axes_extra)), - Coords(elements, pos=(origin_x,ymax), d=(0,axes_extra))]])) - ticks = [] - tick_label_style = ticks_style[1].clone() - tick_label_style.extend(label_style) - for k in range(start_k_y, start_k_y+steps_y+1): - if k != origin_k_y: - y = k * step_y - if y > ymax: - break - pos = (origin_x,y) - ticks.append([Coords(elements, pos=pos), - Coords(elements, pos=pos, d=(tick_large_size,0))]) - add_element(InsetBox(elements, tick_label_style, content=Real(y), pos=Coords(elements, pos=pos, - d=(-tick_label_d,0)), opos=(1,0))) - for k in range(start_k_y_small, start_k_y_small+steps_y_small+1): - if k % sub_y != 0: - y = k * step_y_small - if y > ymax: - break - pos = (origin_x,y) - ticks.append([Coords(elements, pos=pos), - Coords(elements, pos=pos, d=(tick_small_size,0))]) - add_element(LineBox(elements, axes_style[1], lines=ticks))""" + # Old code? + # if axes[1]: + # add_element(LineBox(elements, axes_style[1], lines=[[Coords(elements, pos=(origin_x,ymin), d=(0,-axes_extra)), + # Coords(elements, pos=(origin_x,ymax), d=(0,axes_extra))]])) + # ticks = [] + # tick_label_style = ticks_style[1].clone() + # tick_label_style.extend(label_style) + # for k in range(start_k_y, start_k_y+steps_y+1): + # if k != origin_k_y: + # y = k * step_y + # if y > ymax: + # break + # pos = (origin_x,y) + # ticks.append([Coords(elements, pos=pos), + # Coords(elements, pos=pos, d=(tick_large_size,0))]) + # add_element(InsetBox(elements, tick_label_style, content=Real(y), pos=Coords(elements, pos=pos, + # d=(-tick_label_d,0)), opos=(1,0))) + # for k in range(start_k_y_small, start_k_y_small+steps_y_small+1): + # if k % sub_y != 0: + # y = k * step_y_small + # if y > ymax: + # break + # pos = (origin_x,y) + # ticks.append([Coords(elements, pos=pos), + # Coords(elements, pos=pos, d=(tick_small_size,0))]) + # add_element(LineBox(elements, axes_style[1], lines=ticks)) class FilledCurveBox(_GraphicsElementBox): From 45c1ec03557b0e0137f0f6e08020302b0ecab8a2 Mon Sep 17 00:00:00 2001 From: rocky Date: Mon, 2 Jan 2023 20:28:07 -0500 Subject: [PATCH 003/209] Adjust tests. and comment graphics routine a little better --- mathics/builtin/box/graphics.py | 2 ++ test/format/test_format.py | 12 ++++++------ 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/mathics/builtin/box/graphics.py b/mathics/builtin/box/graphics.py index ce5de82a0..52a34e2c7 100644 --- a/mathics/builtin/box/graphics.py +++ b/mathics/builtin/box/graphics.py @@ -711,6 +711,8 @@ def create_axes(self, elements, graphics_options, xmin, xmax, ymin, ymax) -> tup else: axes = (False, False) + # The Style option pushes its setting down into graphics components + # like ticks, axes, and labels. ticks_style_option = graphics_options.get("System`TicksStyle") axes_style_option = graphics_options.get("System`AxesStyle") label_style = graphics_options.get("System`LabelStyle") diff --git a/test/format/test_format.py b/test/format/test_format.py index 5d3539399..eaca6fec2 100644 --- a/test/format/test_format.py +++ b/test/format/test_format.py @@ -588,10 +588,10 @@ "System`OutputForm": '', }, "latex": { - "System`StandardForm": '\n\\begin{asy}\nusepackage("amsmath");\nsize(4.9cm, 5.8333cm);\n\n// InsetBox\nlabel("$a^b$", (147.0,175.0), (0,0), rgb(0, 0, 0));\n\nclip(box((136.5,162.5), (157.5,187.5)));\n\n\\end{asy}\n', - "System`TraditionalForm": '\n\\begin{asy}\nusepackage("amsmath");\nsize(4.9cm, 5.8333cm);\n\n// InsetBox\nlabel("$a^b$", (147.0,175.0), (0,0), rgb(0, 0, 0));\n\nclip(box((136.5,162.5), (157.5,187.5)));\n\n\\end{asy}\n', + "System`StandardForm": '\n\\begin{asy}\nusepackage("amsmath");\nsize(4.9cm, 5.8333cm);\n\n// InsetBox\nlabel("$a^b$", (147.0,175.0), (0,0), rgb(0, 0, 0)+fontsize(3));\n\nclip(box((136.5,162.5), (157.5,187.5)));\n\n\\end{asy}\n', + "System`TraditionalForm": '\n\\begin{asy}\nusepackage("amsmath");\nsize(4.9cm, 5.8333cm);\n\n// InsetBox\nlabel("$a^b$", (147.0,175.0), (0,0), rgb(0, 0, 0)+fontsize(3));\n\nclip(box((136.5,162.5), (157.5,187.5)));\n\n\\end{asy}\n', "System`InputForm": "\\text{Graphics}\\left[\\left\\{\\text{Text}\\left[\\text{Power}\\left[a, b\\right], \\left\\{0, 0\\right\\}\\right]\\right\\}\\right]", - "System`OutputForm": '\n\\begin{asy}\nusepackage("amsmath");\nsize(4.9cm, 5.8333cm);\n\n// InsetBox\nlabel("$a^b$", (147.0,175.0), (0,0), rgb(0, 0, 0));\n\nclip(box((136.5,162.5), (157.5,187.5)));\n\n\\end{asy}\n', + "System`OutputForm": '\n\\begin{asy}\nusepackage("amsmath");\nsize(4.9cm, 5.8333cm);\n\n// InsetBox\nlabel("$a^b$", (147.0,175.0), (0,0), rgb(0, 0, 0)+fontsize(3));\n\nclip(box((136.5,162.5), (157.5,187.5)));\n\n\\end{asy}\n', }, }, "TableForm[{Graphics[{Text[a^b,{0,0}]}], Graphics[{Text[a^b,{0,0}]}]}]": { @@ -609,10 +609,10 @@ "System`OutputForm": '\n\n\n', }, "latex": { - "System`StandardForm": '\\begin{array}{c} \n\\begin{asy}\nusepackage("amsmath");\nsize(2.45cm, 2.9167cm);\n\n// InsetBox\nlabel("$a^b$", (73.5,87.5), (0,0), rgb(0, 0, 0));\n\nclip(box((63,75), (84,100)));\n\n\\end{asy}\n\\\\ \n\\begin{asy}\nusepackage("amsmath");\nsize(2.45cm, 2.9167cm);\n\n// InsetBox\nlabel("$a^b$", (73.5,87.5), (0,0), rgb(0, 0, 0));\n\nclip(box((63,75), (84,100)));\n\n\\end{asy}\n\\end{array}', - "System`TraditionalForm": '\\begin{array}{c} \n\\begin{asy}\nusepackage("amsmath");\nsize(2.45cm, 2.9167cm);\n\n// InsetBox\nlabel("$a^b$", (73.5,87.5), (0,0), rgb(0, 0, 0));\n\nclip(box((63,75), (84,100)));\n\n\\end{asy}\n\\\\ \n\\begin{asy}\nusepackage("amsmath");\nsize(2.45cm, 2.9167cm);\n\n// InsetBox\nlabel("$a^b$", (73.5,87.5), (0,0), rgb(0, 0, 0));\n\nclip(box((63,75), (84,100)));\n\n\\end{asy}\n\\end{array}', + "System`StandardForm": '\\begin{array}{c} \n\\begin{asy}\nusepackage("amsmath");\nsize(2.45cm, 2.9167cm);\n\n// InsetBox\nlabel("$a^b$", (73.5,87.5), (0,0), rgb(0, 0, 0)+fontsize(3));\n\nclip(box((63,75), (84,100)));\n\n\\end{asy}\n\\\\ \n\\begin{asy}\nusepackage("amsmath");\nsize(2.45cm, 2.9167cm);\n\n// InsetBox\nlabel("$a^b$", (73.5,87.5), (0,0), rgb(0, 0, 0)+fontsize(3));\n\nclip(box((63,75), (84,100)));\n\n\\end{asy}\n\\end{array}', + "System`TraditionalForm": '\\begin{array}{c} \n\\begin{asy}\nusepackage("amsmath");\nsize(2.45cm, 2.9167cm);\n\n// InsetBox\nlabel("$a^b$", (73.5,87.5), (0,0), rgb(0, 0, 0)+fontsize(3));\n\nclip(box((63,75), (84,100)));\n\n\\end{asy}\n\\\\ \n\\begin{asy}\nusepackage("amsmath");\nsize(2.45cm, 2.9167cm);\n\n// InsetBox\nlabel("$a^b$", (73.5,87.5), (0,0), rgb(0, 0, 0)+fontsize(3));\n\nclip(box((63,75), (84,100)));\n\n\\end{asy}\n\\end{array}', "System`InputForm": "\\text{TableForm}\\left[\\left\\{\\text{Graphics}\\left[\\left\\{\\text{Text}\\left[\\text{Power}\\left[a, b\\right], \\left\\{0, 0\\right\\}\\right]\\right\\}\\right], \\text{Graphics}\\left[\\left\\{\\text{Text}\\left[\\text{Power}\\left[a, b\\right], \\left\\{0, 0\\right\\}\\right]\\right\\}\\right]\\right\\}\\right]", - "System`OutputForm": '\\begin{array}{c} \n\\begin{asy}\nusepackage("amsmath");\nsize(2.45cm, 2.9167cm);\n\n// InsetBox\nlabel("$a^b$", (73.5,87.5), (0,0), rgb(0, 0, 0));\n\nclip(box((63,75), (84,100)));\n\n\\end{asy}\n\\\\ \n\\begin{asy}\nusepackage("amsmath");\nsize(2.45cm, 2.9167cm);\n\n// InsetBox\nlabel("$a^b$", (73.5,87.5), (0,0), rgb(0, 0, 0));\n\nclip(box((63,75), (84,100)));\n\n\\end{asy}\n\\end{array}', + "System`OutputForm": '\\begin{array}{c} \n\\begin{asy}\nusepackage("amsmath");\nsize(2.45cm, 2.9167cm);\n\n// InsetBox\nlabel("$a^b$", (73.5,87.5), (0,0), rgb(0, 0, 0)+fontsize(3));\n\nclip(box((63,75), (84,100)));\n\n\\end{asy}\n\\\\ \n\\begin{asy}\nusepackage("amsmath");\nsize(2.45cm, 2.9167cm);\n\n// InsetBox\nlabel("$a^b$", (73.5,87.5), (0,0), rgb(0, 0, 0)+fontsize(3));\n\nclip(box((63,75), (84,100)));\n\n\\end{asy}\n\\end{array}', }, }, } From 1f8100feb1bc384bbb2ce87d846fca2b1c36ec4d Mon Sep 17 00:00:00 2001 From: rocky Date: Mon, 2 Jan 2023 20:53:38 -0500 Subject: [PATCH 004/209] Small changes to Result class. This came up when I was considering a larger refactor of testing and doc generation --- mathics/core/evaluation.py | 167 ++++++++++++++++++++----------------- 1 file changed, 91 insertions(+), 76 deletions(-) diff --git a/mathics/core/evaluation.py b/mathics/core/evaluation.py index d69d1b13c..c5c5fc7a0 100644 --- a/mathics/core/evaluation.py +++ b/mathics/core/evaluation.py @@ -5,7 +5,7 @@ import time from queue import Queue from threading import Thread, stack_size as set_thread_stack_size -from typing import Tuple +from typing import List, Tuple from mathics_scanner import TranslateError @@ -142,7 +142,7 @@ def run_with_timeout_and_stack(request, timeout, evaluation): raise result[0].with_traceback(result[1], result[2]) -class Out(KeyComparable): +class _Out(KeyComparable): def __init__(self) -> None: self.is_message = False self.is_print = False @@ -152,80 +152,6 @@ def get_sort_key(self) -> Tuple[bool, bool, str]: return (self.is_message, self.is_print, self.text) -class Message(Out): - def __init__(self, symbol, tag, text: str) -> None: - super(Message, self).__init__() - self.is_message = True - self.symbol = symbol - self.tag = tag - self.text = text - - def __str__(self) -> str: - return "{}::{}: {}".format(self.symbol, self.tag, self.text) - - def __eq__(self, other) -> bool: - return self.is_message == other.is_message and self.text == other.text - - def get_data(self): - return { - "message": True, - "symbol": self.symbol, - "tag": self.tag, - "prefix": "%s::%s" % (self.symbol, self.tag), - "text": self.text, - } - - -class Print(Out): - def __init__(self, text) -> None: - super(Print, self).__init__() - self.is_print = True - self.text = text - - def __str__(self) -> str: - return self.text - - def __eq__(self, other) -> bool: - return self.is_message == other.is_message and self.text == other.text - - def get_data(self): - return { - "message": False, - "text": self.text, - } - - -class Result: - def __init__(self, out, result, line_no, last_eval=None, form=None) -> None: - self.out = out - self.result = result - self.line_no = line_no - self.last_eval = last_eval - self.form = form - - def get_data(self): - return { - "out": [out.get_data() for out in self.out], - "result": self.result, - "line": self.line_no, - "form": self.form, - } - - -class Output: - def max_stored_size(self, settings) -> int: - return settings.MAX_STORED_SIZE - - def out(self, out): - pass - - def clear(self, wait): - raise NotImplementedError - - def display(self, data, metadata): - raise NotImplementedError - - class Evaluation: def __init__( self, definitions=None, output=None, format="text", catch_interrupt=True @@ -620,3 +546,92 @@ def publish(self, tag, *args, **kwargs) -> None: for listener in listeners: if listener(*args, **kwargs): break + + +class Message(_Out): + def __init__(self, symbol, tag, text: str) -> None: + super(Message, self).__init__() + self.is_message = True + self.symbol = symbol + self.tag = tag + self.text = text + + def __str__(self) -> str: + return "{}::{}: {}".format(self.symbol, self.tag, self.text) + + def __eq__(self, other) -> bool: + return self.is_message == other.is_message and self.text == other.text + + def get_data(self): + return { + "message": True, + "symbol": self.symbol, + "tag": self.tag, + "prefix": "%s::%s" % (self.symbol, self.tag), + "text": self.text, + } + + +class Print(_Out): + def __init__(self, text) -> None: + super(Print, self).__init__() + self.is_print = True + self.text = text + + def __str__(self) -> str: + return self.text + + def __eq__(self, other) -> bool: + return self.is_message == other.is_message and self.text == other.text + + def get_data(self): + return { + "message": False, + "text": self.text, + } + + +class Output: + def max_stored_size(self, settings) -> int: + return settings.MAX_STORED_SIZE + + def out(self, out): + pass + + def clear(self, wait): + raise NotImplementedError + + def display(self, data, metadata): + raise NotImplementedError + + +OutputLines = List[str] + + +class Result: + """ + A structure containing the result of an evaluation. + + In particular, there are the following fields: + + result: the actual result produced. However the dataset and form of this is influenced by "form". + out: a list of additional output product + """ + + def __init__( + self, out: OutputLines, result, line_no: int, last_eval=None, form=None + ) -> None: + self.out = out + self.result = result + self.line_no = line_no + self.last_eval = last_eval + self.form = form + + # FIXME: consider using a named tuple + def get_data(self) -> dict: + return { + "out": [out.get_data() for out in self.out], + "result": self.result, + "line": self.line_no, + "form": self.form, + } From 773be6487c5e66f52530c396b81ac90de56b6af0 Mon Sep 17 00:00:00 2001 From: rocky Date: Mon, 2 Jan 2023 22:00:51 -0500 Subject: [PATCH 005/209] apply->eval reduction and style stuff --- mathics/builtin/colors/color_directives.py | 70 ++++++++----- mathics/builtin/compilation.py | 10 +- mathics/builtin/distance/numeric.py | 64 ++++++++---- mathics/builtin/distance/stringdata.py | 9 +- mathics/builtin/drawing/graphics3d.py | 8 +- mathics/builtin/drawing/uniform_polyhedra.py | 101 ++++++++++--------- 6 files changed, 155 insertions(+), 107 deletions(-) diff --git a/mathics/builtin/colors/color_directives.py b/mathics/builtin/colors/color_directives.py index b9fe2c174..8bdacddfa 100644 --- a/mathics/builtin/colors/color_directives.py +++ b/mathics/builtin/colors/color_directives.py @@ -1,7 +1,9 @@ """ Color Directives -There are many different way to specify color; we support all of the color formats below and will convert between the different color formats. +There are many different way to specify color, and we support many of these. + +We can convert between the different color formats. """ from math import atan2, cos, exp, pi, radians, sin, sqrt @@ -119,6 +121,24 @@ def _euclidean_distance(a, b): return sqrt(sum((x1 - x2) * (x1 - x2) for x1, x2 in zip(a, b))) +def color_to_expression(components, colorspace): + if colorspace == "Grayscale": + converted_color_name = "GrayLevel" + elif colorspace == "HSB": + converted_color_name = "Hue" + else: + converted_color_name = colorspace + "Color" + + return to_expression(converted_color_name, *components) + + +def expression_to_color(color): + try: + return _ColorObject.create(color) + except ColorError: + return None + + class _ColorObject(_GraphicsDirective, ImmutableValueMixin): formats = { # we are adding ImageSizeMultipliers in the rule below, because we do _not_ want color boxes to @@ -306,7 +326,7 @@ class ColorDistance(Builtin): / 100, } - def apply(self, c1, c2, evaluation, options): + def eval(self, c1, c2, evaluation, options): "ColorDistance[c1_, c2_, OptionsPattern[ColorDistance]]" distance_function = options.get("System`DistanceFunction") @@ -431,7 +451,9 @@ class ColorError(BoxExpressionError): class GrayLevel(_ColorObject): """ - :WMA link:https://reference.wolfram.com/language/ref/GrayLevel.html + + :WMA link: + https://reference.wolfram.com/language/ref/GrayLevel.html
'GrayLevel[$g$]' @@ -449,7 +471,9 @@ class GrayLevel(_ColorObject): class Hue(_ColorObject): """ - :WMA link:https://reference.wolfram.com/language/ref/Hue.html + + :WMA link: + https://reference.wolfram.com/language/ref/Hue.html
'Hue[$h$, $s$, $l$, $a$]' @@ -509,7 +533,9 @@ def trans(t): class LABColor(_ColorObject): """ - :WMA link:https://reference.wolfram.com/language/ref/LABColor.html + + :WMA link: + https://reference.wolfram.com/language/ref/LABColor.html
'LABColor[$l$, $a$, $b$]' @@ -525,7 +551,9 @@ class LABColor(_ColorObject): class LCHColor(_ColorObject): """ - :WMA link:https://reference.wolfram.com/language/ref/LCHColor.html + + :WMA link: + https://reference.wolfram.com/language/ref/LCHColor.html
'LCHColor[$l$, $c$, $h$]' @@ -556,7 +584,9 @@ class LUVColor(_ColorObject): class Opacity(_GraphicsDirective): """ - :WMA link:https://reference.wolfram.com/language/ref/Opacity.html + + :WMA link: + https://reference.wolfram.com/language/ref/Opacity.html
'Opacity[$level$]' @@ -592,7 +622,9 @@ def create_as_style(klass, graphics, item): class RGBColor(_ColorObject): """ - :WMA link:https://reference.wolfram.com/language/ref/RGBColor.html + + :WMA link: + https://reference.wolfram.com/language/ref/RGBColor.html
'RGBColor[$r$, $g$, $b$]' @@ -620,7 +652,9 @@ def to_rgba(self): class XYZColor(_ColorObject): """ - :WMA link:https://reference.wolfram.com/language/ref/XYZColor.html + + :WMA link: + https://reference.wolfram.com/language/ref/XYZColor.html
'XYZColor[$x$, $y$, $z$]' @@ -631,21 +665,3 @@ class XYZColor(_ColorObject): color_space = "XYZ" components_sizes = [3, 4] default_components = [0, 0, 0, 1] - - -def expression_to_color(color): - try: - return _ColorObject.create(color) - except ColorError: - return None - - -def color_to_expression(components, colorspace): - if colorspace == "Grayscale": - converted_color_name = "GrayLevel" - elif colorspace == "HSB": - converted_color_name = "Hue" - else: - converted_color_name = colorspace + "Color" - - return to_expression(converted_color_name, *components) diff --git a/mathics/builtin/compilation.py b/mathics/builtin/compilation.py index 0a3570121..54bb7e21e 100644 --- a/mathics/builtin/compilation.py +++ b/mathics/builtin/compilation.py @@ -3,7 +3,8 @@ Code compilation allows Mathics functions to be run faster. -When LLVM and Python libraries are available, compilation produces LLVM code. +When LLVM and Python libraries are available, compilation \ +produces LLVM code. """ # This tells documentation how to sort this module @@ -25,6 +26,7 @@ ) from mathics.core.convert.python import from_python from mathics.core.element import ImmutableValueMixin +from mathics.core.evaluation import Evaluation from mathics.core.expression import Expression, SymbolCompiledFunction from mathics.core.symbols import Atom, Symbol, SymbolFalse, SymbolTrue @@ -98,7 +100,7 @@ class Compile(Builtin): requires = ("llvmlite",) summary_text = "compile an expression" - def apply(self, vars, expr, evaluation): + def eval(self, vars, expr, evaluation: Evaluation): "Compile[vars_, expr_]" if not vars.has_form("List", None): @@ -174,7 +176,7 @@ def to_sympy(self, *args, **kwargs): def __hash__(self): return hash(("CompiledCode", ctypes.addressof(self.cfunc))) # XXX hack - def atom_to_boxes(self, f, evaluation): + def atom_to_boxes(self, f, evaluation: Evaluation): return CompiledCodeBox(String(self.__str__()), evaluation=evaluation) @@ -199,7 +201,7 @@ class CompiledFunction(Builtin): messages = {"argerr": "Invalid argument `1` should be Integer, Real or boolean."} summary_text = "A CompiledFunction object." - def apply(self, argnames, expr, code, args, evaluation): + def eval(self, argnames, expr, code, args, evaluation: Evaluation): "CompiledFunction[argnames_, expr_, code_CompiledCode][args__]" argseq = args.get_sequence() diff --git a/mathics/builtin/distance/numeric.py b/mathics/builtin/distance/numeric.py index 491aaf4db..e29841685 100644 --- a/mathics/builtin/distance/numeric.py +++ b/mathics/builtin/distance/numeric.py @@ -4,7 +4,7 @@ from mathics.builtin.base import Builtin from mathics.core.atoms import Integer1, Integer2 -from mathics.core.expression import Expression +from mathics.core.expression import Evaluation, Expression from mathics.core.symbols import ( SymbolAbs, SymbolDivide, @@ -21,7 +21,7 @@ ) -def _norm_calc(head, u, v, evaluation): +def _norm_calc(head, u, v, evaluation: Evaluation): expr = Expression(head, u, v) old_quiet_all = evaluation.quiet_all try: @@ -38,8 +38,11 @@ def _norm_calc(head, u, v, evaluation): class BrayCurtisDistance(Builtin): """ - :Bray-Curtis Dissimilarity:https://en.wikipedia.org/wiki/Bray%E2%80%93Curtis_dissimilarity \ - (:WMA link:https://reference.wolfram.com/language/ref/BrayCurtisDistance.html) + + :Bray-Curtis Dissimilarity: + https://en.wikipedia.org/wiki/Bray%E2%80%93Curtis_dissimilarity \ + (:WMA: + https://reference.wolfram.com/language/ref/BrayCurtisDistance.html)
'BrayCurtisDistance[$u$, $v$]' @@ -56,7 +59,7 @@ class BrayCurtisDistance(Builtin): summary_text = "Bray-Curtis distance" - def apply(self, u, v, evaluation): + def eval(self, u, v, evaluation: Evaluation): "BrayCurtisDistance[u_, v_]" t = _norm_calc(SymbolSubtract, u, v, evaluation) if t is not None: @@ -71,8 +74,12 @@ def apply(self, u, v, evaluation): class CanberraDistance(Builtin): """ - :Canberra distance:https://en.wikipedia.org/wiki/Canberra_distance \ - (:WMA link:https://reference.wolfram.com/language/ref/CanberraDistance.html) + + :Canberra distance: + https://en.wikipedia.org/wiki/Canberra_distance \ + ( + :WMA: + https://reference.wolfram.com/language/ref/CanberraDistance.html)
'CanberraDistance[$u$, $v$]' @@ -88,7 +95,7 @@ class CanberraDistance(Builtin): summary_text = "Canberra distance" - def apply(self, u, v, evaluation): + def eval(self, u, v, evaluation: Evaluation): "CanberraDistance[u_, v_]" t = _norm_calc(SymbolSubtract, u, v, evaluation) if t is not None: @@ -107,7 +114,9 @@ def apply(self, u, v, evaluation): class ChessboardDistance(Builtin): """ :Chebyshev distance:https://en.wikipedia.org/wiki/Chebyshev_distance \ - (:WMA link:https://reference.wolfram.com/language/ref/ChessboardDistance.html) + ( + :WMA: + https://reference.wolfram.com/language/ref/ChessboardDistance.html)
'ChessboardDistance[$u$, $v$]' @@ -123,7 +132,7 @@ class ChessboardDistance(Builtin): summary_text = "chessboard distance" - def apply(self, u, v, evaluation): + def eval(self, u, v, evaluation: Evaluation): "ChessboardDistance[u_, v_]" t = _norm_calc(SymbolSubtract, u, v, evaluation) if t is not None: @@ -132,8 +141,11 @@ def apply(self, u, v, evaluation): class CosineDistance(Builtin): r""" - :Cosine similarity:https://en.wikipedia.org/wiki/Cosine_similarity \ - (:WMA link:https://reference.wolfram.com/language/ref/CosineDistance.html) + + :Cosine similarity: + https://en.wikipedia.org/wiki/Cosine_similarity \ + (:WMA: + https://reference.wolfram.com/language/ref/CosineDistance.html)
'CosineDistance[$u$, $v$]' @@ -152,7 +164,7 @@ class CosineDistance(Builtin): summary_text = "cosine distance" - def apply(self, u, v, evaluation): + def eval(self, u, v, evaluation: Evaluation): "CosineDistance[u_, v_]" dot = _norm_calc(SymbolDot, u, v, evaluation) if dot is not None: @@ -173,8 +185,12 @@ def apply(self, u, v, evaluation): class EuclideanDistance(Builtin): """ - :Euclidean similarity:https://en.wikipedia.org/wiki/Euclidean_distance \ - (:WMA link:https://reference.wolfram.com/language/ref/EuclideanDistance.html) + + :Euclidean similarity: + https://en.wikipedia.org/wiki/Euclidean_distance \ + ( + :WMA: + https://reference.wolfram.com/language/ref/EuclideanDistance.html)
'EuclideanDistance[$u$, $v$]' @@ -193,7 +209,7 @@ class EuclideanDistance(Builtin): summary_text = "euclidean distance" - def apply(self, u, v, evaluation): + def eval(self, u, v, evaluation: Evaluation): "EuclideanDistance[u_, v_]" t = _norm_calc(SymbolSubtract, u, v, evaluation) if t is not None: @@ -202,8 +218,12 @@ def apply(self, u, v, evaluation): class ManhattanDistance(Builtin): """ - :Manhattan distance:https://en.wikipedia.org/wiki/Taxicab_geometry \ - (:WMA link:https://reference.wolfram.com/language/ref/ManhattanDistance.html) + + :Manhattan distance: + https://en.wikipedia.org/wiki/Taxicab_geometry \ + ( + :WMA: + https://reference.wolfram.com/language/ref/ManhattanDistance.html)
'ManhattanDistance[$u$, $v$]' @@ -219,7 +239,7 @@ class ManhattanDistance(Builtin): summary_text = "Manhattan distance" - def apply(self, u, v, evaluation): + def eval(self, u, v, evaluation: Evaluation): "ManhattanDistance[u_, v_]" t = _norm_calc(SymbolSubtract, u, v, evaluation) if t is not None: @@ -228,7 +248,9 @@ def apply(self, u, v, evaluation): class SquaredEuclideanDistance(Builtin): """ - :WMA link:https://reference.wolfram.com/language/ref/SquaredEuclideanDistance.html + + :WMA link: + https://reference.wolfram.com/language/ref/SquaredEuclideanDistance.html
'SquaredEuclideanDistance[$u$, $v$]' @@ -244,7 +266,7 @@ class SquaredEuclideanDistance(Builtin): summary_text = "square of the euclidean distance" - def apply(self, u, v, evaluation): + def eval(self, u, v, evaluation: Evaluation): "SquaredEuclideanDistance[u_, v_]" t = _norm_calc(SymbolSubtract, u, v, evaluation) if t is not None: diff --git a/mathics/builtin/distance/stringdata.py b/mathics/builtin/distance/stringdata.py index 7b44523d0..cab3a8044 100644 --- a/mathics/builtin/distance/stringdata.py +++ b/mathics/builtin/distance/stringdata.py @@ -8,6 +8,7 @@ from mathics.builtin.base import Builtin from mathics.core.atoms import Integer, String, Symbol +from mathics.core.evaluation import Evaluation from mathics.core.expression import Expression from mathics.core.symbols import SymbolTrue @@ -117,7 +118,7 @@ def _levenshtein_like_or_border_cases(s1, s2, sameQ: Callable[..., bool], comput class _StringDistance(Builtin): options = {"IgnoreCase": "False"} - def apply(self, a, b, evaluation, options): + def eval(self, a, b, evaluation, options): "%(name)s[a_, b_, OptionsPattern[%(name)s]]" if isinstance(a, String) and isinstance(b, String): py_a = a.get_string_value() @@ -255,20 +256,20 @@ class HammingDistance(Builtin): summary_text = "Hamming distance" @staticmethod - def _compute(u, v, sameQ, evaluation): + def _compute(u, v, sameQ, evaluation: Evaluation): if len(u) != len(v): evaluation.message("HammingDistance", "idim", u, v) return None else: return Integer(sum(0 if sameQ(x, y) else 1 for x, y in zip(u, v))) - def apply_list(self, u, v, evaluation): + def eval_list(self, u, v, evaluation: Evaluation): "HammingDistance[u_List, v_List]" return HammingDistance._compute( u.elements, v.elements, lambda x, y: x.sameQ(y), evaluation ) - def apply_string(self, u, v, evaluation, options): + def eval_string(self, u, v, evaluation, options): "HammingDistance[u_String, v_String, OptionsPattern[HammingDistance]]" ignore_case = self.get_option(options, "IgnoreCase", evaluation) py_u = u.get_string_value() diff --git a/mathics/builtin/drawing/graphics3d.py b/mathics/builtin/drawing/graphics3d.py index 55b5b876c..3cb3e7bbf 100644 --- a/mathics/builtin/drawing/graphics3d.py +++ b/mathics/builtin/drawing/graphics3d.py @@ -18,7 +18,7 @@ _GraphicsElements, ) from mathics.core.atoms import Integer, Rational, Real -from mathics.core.expression import Expression +from mathics.core.expression import Evaluation, Expression from mathics.core.symbols import SymbolN from mathics.eval.nevaluator import eval_N @@ -242,7 +242,7 @@ class Cone(Builtin): "Cone[positions_List]": "Cone[positions, 1]", } - def apply_check(self, positions, radius, evaluation): + def eval_check(self, positions, radius, evaluation: Evaluation): "Cone[positions_List, radius_]" if len(positions.elements) % 2 == 1: @@ -300,7 +300,7 @@ class Cuboid(Builtin): summary_text = "unit cube" - def apply_check(self, positions, evaluation): + def eval_check(self, positions, evaluation: Evaluation): "Cuboid[positions_List]" if len(positions.elements) % 2 == 1: @@ -343,7 +343,7 @@ class Cylinder(Builtin): "Cylinder[positions_List]": "Cylinder[positions, 1]", } - def apply_check(self, positions, radius, evaluation): + def eval_check(self, positions, radius, evaluation: Evaluation): "Cylinder[positions_List, radius_]" if len(positions.elements) % 2 == 1: diff --git a/mathics/builtin/drawing/uniform_polyhedra.py b/mathics/builtin/drawing/uniform_polyhedra.py index 2c69fb93d..03f6d10e9 100644 --- a/mathics/builtin/drawing/uniform_polyhedra.py +++ b/mathics/builtin/drawing/uniform_polyhedra.py @@ -3,7 +3,8 @@ """ Uniform Polyhedra -Uniform polyhedra is the grouping of platonic solids, Archimedean solids, and regular star polyhedra. +Uniform polyhedra is the grouping of platonic solids, Archimedean solids,\ +and regular star polyhedra. """ # This tells documentation how to sort this module @@ -11,52 +12,16 @@ sort_order = "mathics.builtin.uniform-polyhedra" from mathics.builtin.base import Builtin +from mathics.core.evaluation import Evaluation uniform_polyhedra_names = "tetrahedron, octahedron, dodecahedron, icosahedron" uniform_polyhedra_set = frozenset(uniform_polyhedra_names.split(", ")) -class UniformPolyhedron(Builtin): - """ - :WMA link:https://reference.wolfram.com/language/ref/UniformPolyhedron.html - -
-
'UniformPolyhedron["name"]' -
return a uniform polyhedron with the given name. -
Names are "tetrahedron", "octahedron", "dodecahedron", or "icosahedron". -
- - >> Graphics3D[UniformPolyhedron["octahedron"]] - = -Graphics3D- - - >> Graphics3D[UniformPolyhedron["dodecahedron"]] - = -Graphics3D- - - >> Graphics3D[{"Brown", UniformPolyhedron["tetrahedron"]}] - = -Graphics3D- - """ - - summary_text = "platonic polyhedra by name" - messages = { - "argtype": f"Argument `1` is not one of: {uniform_polyhedra_names}", - } - - rules = { - "UniformPolyhedron[name_String]": "UniformPolyhedron[name, {{0, 0, 0}}, 1]", - } - - def apply(self, name, positions, edgelength, evaluation): - "UniformPolyhedron[name_String, positions_List, edgelength_?NumberQ]" - - if name.to_python(string_quotes=False) not in uniform_polyhedra_set: - evaluation.error("UniformPolyhedron", "argtype", name) - - return - - class Dodecahedron(Builtin): """ - :WMA link:https://reference.wolfram.com/language/ref/Dodecahedron.html + :WMA link: + https://reference.wolfram.com/language/ref/Dodecahedron.html
'Dodecahedron[]' @@ -77,7 +42,8 @@ class Dodecahedron(Builtin): class Icosahedron(Builtin): """ - :WMA link:https://reference.wolfram.com/language/ref/Icosahedron.html + :WMA link: + https://reference.wolfram.com/language/ref/Icosahedron.html
'Icosahedron[]' @@ -88,17 +54,18 @@ class Icosahedron(Builtin): = -Graphics3D- """ - summary_text = "an icosahedron" rules = { "Icosahedron[]": """UniformPolyhedron["icosahedron"]""", "Icosahedron[l_?NumberQ]": """UniformPolyhedron["icosahedron", {{0, 0, 0}}, l]""", "Icosahedron[positions_List, l_?NumberQ]": """UniformPolyhedron["icosahedron", positions, l]""", } + summary_text = "an icosahedron" class Octahedron(Builtin): """ - :WMA link:https://reference.wolfram.com/language/ref/Octahedron.html + :WMA link + :https://reference.wolfram.com/language/ref/Octahedron.html
'Octahedron[]' @@ -109,17 +76,18 @@ class Octahedron(Builtin): = -Graphics3D- """ - summary_text = "an octahedron" rules = { "Octahedron[]": """UniformPolyhedron["octahedron"]""", "Octahedron[l_?NumberQ]": """UniformPolyhedron["octahedron", {{0, 0, 0}}, l]""", "Octahedron[positions_List, l_?NumberQ]": """UniformPolyhedron["octahedron", positions, l]""", } + summary_text = "an octahedron" class Tetrahedron(Builtin): """ - :WMA link:https://reference.wolfram.com/language/ref/Tetrahedron.html + :WMA link + :https://reference.wolfram.com/language/ref/Tetrahedron.html
'Tetrahedron[]' @@ -130,12 +98,51 @@ class Tetrahedron(Builtin): = -Graphics3D- """ - summary_text = "a tetrahedron" rules = { "Tetrahedron[]": """UniformPolyhedron["tetrahedron"]""", "Tetrahedron[l_?NumberQ]": """UniformPolyhedron["tetrahedron", {{0, 0, 0}}, l]""", "Tetrahedron[positions_List, l_?NumberQ]": """UniformPolyhedron["tetrahedron", positions, l]""", } + summary_text = "a tetrahedron" - def apply_with_length(self, length, evaluation): + def eval_with_length(self, length, evaluation: Evaluation): "Tetrahedron[l_?Numeric]" + + +class UniformPolyhedron(Builtin): + """ + :WMA link: + https://reference.wolfram.com/language/ref/UniformPolyhedron.html + +
+
'UniformPolyhedron["name"]' +
return a uniform polyhedron with the given name. +
Names are "tetrahedron", "octahedron", "dodecahedron", or "icosahedron". +
+ + >> Graphics3D[UniformPolyhedron["octahedron"]] + = -Graphics3D- + + >> Graphics3D[UniformPolyhedron["dodecahedron"]] + = -Graphics3D- + + >> Graphics3D[{"Brown", UniformPolyhedron["tetrahedron"]}] + = -Graphics3D- + """ + + messages = { + "argtype": f"Argument `1` is not one of: {uniform_polyhedra_names}", + } + + rules = { + "UniformPolyhedron[name_String]": "UniformPolyhedron[name, {{0, 0, 0}}, 1]", + } + summary_text = "platonic polyhedra by name" + + def eval(self, name, positions, edgelength, evaluation: Evaluation): + "UniformPolyhedron[name_String, positions_List, edgelength_?NumberQ]" + + if name.value not in uniform_polyhedra_set: + evaluation.error("UniformPolyhedron", "argtype", name) + + return From c39b973e80004c4abee946ce300d7f068066fd43 Mon Sep 17 00:00:00 2001 From: rocky Date: Tue, 3 Jan 2023 07:09:38 -0500 Subject: [PATCH 006/209] Corrects tracking asy number in documentation --- mathics/doc/latex_doc.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/mathics/doc/latex_doc.py b/mathics/doc/latex_doc.py index e5689b371..70df4c67b 100644 --- a/mathics/doc/latex_doc.py +++ b/mathics/doc/latex_doc.py @@ -58,7 +58,7 @@ # We keep track of the number of \begin{asy}'s we see so that # we can assocation asymptote file numbers with where they are # in the document -asy_count = 0 +next_asy_number = 1 ITALIC_RE = re.compile(r"(?s)<(?Pi)>(?P.*?)") @@ -565,10 +565,11 @@ def latex(self, doc_data: dict) -> str: test_text = result["result"] if test_text: # is not None and result['result'].strip(): - if test_text.find("\\begin{asy}") >= 0: - global asy_count - asy_count += 1 - text += f"%% mathics-{asy_count}.asy\n" + asy_count = test_text.count("\\begin{asy}") + if asy_count >= 0: + global next_asy_number + text += f"%% mathics-{next_asy_number}.asy\n" + next_asy_number += asy_count text += "\\begin{testresult}%s\\end{testresult}" % result["result"] text += "\\end{testcase}" From e0ffe6b69c89d2b005a0a7bd92894d2451c2604a Mon Sep 17 00:00:00 2001 From: rocky Date: Tue, 3 Jan 2023 09:07:56 -0500 Subject: [PATCH 007/209] Remove "value" from Symbol; add SymbolConstant... from PredefinedConstant. Doc strings have been over. --- mathics/builtin/makeboxes.py | 2 +- mathics/core/symbols.py | 167 +++++++++++++++++++++------------- mathics/core/systemsymbols.py | 1 + mathics/eval/makeboxes.py | 40 ++++++-- 4 files changed, 137 insertions(+), 73 deletions(-) diff --git a/mathics/builtin/makeboxes.py b/mathics/builtin/makeboxes.py index ed906e3ef..8dbac5fb7 100644 --- a/mathics/builtin/makeboxes.py +++ b/mathics/builtin/makeboxes.py @@ -485,7 +485,7 @@ def format_operator(operator) -> Union[String, BaseElement]: return op return operator - precedence = prec.value + precedence = prec.value if hasattr(prec, "value") else 0 grouping = grouping.get_name() if isinstance(expr, Atom): diff --git a/mathics/core/symbols.py b/mathics/core/symbols.py index 61f70add1..db8b9f9a4 100644 --- a/mathics/core/symbols.py +++ b/mathics/core/symbols.py @@ -329,57 +329,78 @@ def replace_slots(self, slots, evaluation) -> "Atom": class Symbol(Atom, NumericOperators, EvalMixin): - """ - Note: Symbol is right now used in a couple of ways which in the - future may be separated. + """A Symbol is a kind of Atom that acts as a symbolic variable. - A Symbol is a kind of Atom that acts as a symbolic variable or - symbolic constant. + All Symbols have a name that can be converted to string. - All Symbols have a name that can be converted to string form. + A Variable Symbol is a ``Symbol`` that is associated with a + ``Definition`` that has an ``OwnValue`` that determines its + evaluation value. - Inside a session, a Symbol can be associated with a ``Definition`` - that determines its evaluation value. + A Function Symbol, like a Variable Symbol, is a ``Symbol`` that is + also associated with a ``Definition``. But it has a ``DownValue`` + that is used in its evaluation. - We also have Symbols which are immutable or constant; here the - definitions are fixed. The predefined Symbols ``True``, ``False``, - and ``Null`` are like this. + We also have Symbols which in contrast to Variables Symbols have + a constant value that cannot change. System`True and System`False + are like this. - Also there are situations where the Symbol acts like Python's - intern() built-in function or Lisp's Symbol without its modifyable - property list. Here, the only attribute we care about is the name - which is unique across all mentions and uses, and therefore - needs it only to be stored as a single object in the system. + These however are in class SymbolConstant. See that class for + more information. - Note that the mathics.core.parser.Symbol works exactly this way. + Symbol acts like Python's intern() built-in function or Lisp's + Symbol without its modifyable property list. Here, the only + attribute we care about is the value which is unique across all + mentions and uses, and therefore needs it only to be stored as a + single object in the system. - This aspect may or may not be true for the Symbolic Variable use case too. + Note that the mathics.core.parser.Symbol works exactly this way. """ name: str hash: str sympy_dummy: Any - defined_symbols = {} + + # Dictionary of Symbols defined so far. + # We use this for object uniqueness. + # The key is the Symbol object's string name, and the + # diectionary's value is the Mathics object for the Symbol. + _symbols = {} + class_head_name = "System`Symbol" # __new__ instead of __init__ is used here because we want # to return the same object for a given "name" value. - def __new__(cls, name: str, sympy_dummy=None, value=None): + def __new__(cls, name: str, sympy_dummy=None): """ - Allocate an object ensuring that for a given `name` we get back the same object. + Allocate an object ensuring that for a given ``name`` and ``cls`` we get back the same object, + id(object) is the same and its object.__hash__() is the same. + + SymbolConstant's like System`True and System`False set + ``value`` to something other than ``None``. + """ name = ensure_context(name) - self = cls.defined_symbols.get(name, None) + + # A lot of the below code is similar to + # the corresponding for numeric constants like Integer, Real. + self = cls._symbols.get(name) + if self is None: - self = super(Symbol, cls).__new__(cls) + self = super().__new__(cls) self.name = name + # Cache object so we don't allocate again. + cls._symbols[name] = self + # Set a value for self.__hash__() once so that every time - # it is used this is fast. - # This tuple with "Symbol" is used to give a different hash - # than the hash that would be returned if just string name were - # used. - self.hash = hash(("Symbol", name)) + # it is used this is fast. Note that in contrast to the + # cached object key, the hash key needs to be unique across *all* + # Python objects, so we include the class in the + # event that different objects have the same Python value. + # For example, this can happen with String constants. + + self.hash = hash((cls, name)) # TODO: revise how we convert sympy.Dummy # symbols. @@ -392,25 +413,8 @@ def __new__(cls, name: str, sympy_dummy=None, value=None): # value attribute. self.sympy_dummy = sympy_dummy - # This is something that still I do not undestand: - # here we are adding another attribute to this class, - # which is not clear where is it going to be used, but - # which can be different to None just three specific instances: - # * ``System`True`` -> True - # * ``System`False`` -> False - # * ``System`Null`` -> None - # - # My guess is that this property should be set for - # ``PredefinedSymbol`` but not for general symbols. - # - # Like it is now, it looks so misterious as - # self.sympy_dummy, for which I have to dig into the - # code to see even what type of value should be expected - # for it. - self._value = value self._short_name = strip_context(name) - cls.defined_symbols[name] = self return self def __eq__(self, other) -> bool: @@ -631,24 +635,59 @@ def to_sympy(self, **kwargs): return sympy.Symbol(sympy_symbol_prefix + self.name) return builtin.to_sympy(self, **kwargs) - @property - def value(self) -> Any: - return self._value - -class PredefinedSymbol(Symbol): +class SymbolConstant(Symbol): """ - A Predefined Symbol of the Mathics system. + A Symbol Constant is Symbol of the Mathics system whose value can't + be changed and has a corresponding Python representation. - A Symbol which is defined because it is used somewhere in the - Mathics system as a built-in name, Attribute, Property, Option, - or a Symbolic Constant. + Therefore, like an ``Integer`` constant such as ``Integer0``, we don't + need to go through ``Definitions`` to get its Python-equivalent value. - In contrast to Symbol where the name might not have been added to - a list of known Symbol names or where the name might get deleted, - this never occurs here. + For example for the ``SymbolConstant`` ``System`True``, has its + value set to the Python ``True`` value. + + Note this is not the same thing as a Symbolic Constant like ``Pi``, + which doesn't have an (exact) Python equivalent representation. + Also, Pi *can* be Unprotected and changed, while True, cannot. + + Also note that ``SymbolConstant`` differs from ``Symbol`` in that + Symbol has no value field (even when its value happens to be + representable in Python. Symbols need to go through Definitions + get a Symbol's current value, based on the current context and the + state of prior operations on that Symbol/Definition binding. + + In sum, SymbolConstant is partly like Symbol, and partly like + Numeric constants. """ + # Dictionary of SymbolConstants defined so far. + # We use this for object uniqueness. + # The key is the SymbolConstant's value, and the + # diectionary's value is the Mathics object representing that Python value. + _symbol_constants = {} + + # We use __new__ here to unsure that two Integer's that have the same value + # return the same object. + def __new__(cls, name, value): + + name = ensure_context(name) + self = cls._symbol_constants.get(name) + if self is None: + self = super().__new__(cls, name) + self._value = value + + # Cache object so we don't allocate again. + self._symbol_constants[name] = self + + # Set a value for self.__hash__() once so that every time + # it is used this is fast. Note that in contrast to the + # cached object key, the hash key needs to be unique across all + # Python objects, so we include the class in the + # event that different objects have the same Python value + self.hash = hash((cls, name)) + return self + @property def is_literal(self) -> bool: """ @@ -676,6 +715,10 @@ def is_uncertain_final_definitions(self, definitions) -> bool: """ return False + @property + def value(self): + return self._value + def symbol_set(*symbols: Tuple[Symbol]) -> FrozenSet[Symbol]: """ @@ -689,10 +732,10 @@ def symbol_set(*symbols: Tuple[Symbol]) -> FrozenSet[Symbol]: # Symbols used in this module. -# Note, below we are only setting PredefinedSymbol for Symbols which +# Note, below we are only setting SymbolConstant for Symbols which # are both predefined and have the Locked attribute. -# An experiment using PredefinedSymbol("Pi") in the Python code and +# An experiment using SymbolConstant("Pi") in the Python code and # running: # {Pi, Unprotect[Pi];Pi=4; Pi, Pi=.; Pi } # show that this does not change the output in any way. @@ -702,9 +745,9 @@ def symbol_set(*symbols: Tuple[Symbol]) -> FrozenSet[Symbol]: # more of the below and in systemsymbols # PredefineSymbol. -SymbolFalse = PredefinedSymbol("System`False", value=False) -SymbolList = PredefinedSymbol("System`List") -SymbolTrue = PredefinedSymbol("System`True", value=True) +SymbolFalse = SymbolConstant("System`False", value=False) +SymbolList = SymbolConstant("System`List", value=list) +SymbolTrue = SymbolConstant("System`True", value=True) SymbolAbs = Symbol("Abs") SymbolDivide = Symbol("Divide") diff --git a/mathics/core/systemsymbols.py b/mathics/core/systemsymbols.py index 9b0aea436..01098017f 100644 --- a/mathics/core/systemsymbols.py +++ b/mathics/core/systemsymbols.py @@ -173,6 +173,7 @@ SymbolRepeated = Symbol("System`Repeated") SymbolRepeatedNull = Symbol("System`RepeatedNull") SymbolReturn = Symbol("System`Return") +SymbolRight = Symbol("System`Right") SymbolRound = Symbol("System`Round") SymbolRow = Symbol("System`Row") SymbolRowBox = Symbol("System`RowBox") diff --git a/mathics/eval/makeboxes.py b/mathics/eval/makeboxes.py index 7c51be55f..700a6c9d4 100644 --- a/mathics/eval/makeboxes.py +++ b/mathics/eval/makeboxes.py @@ -7,7 +7,7 @@ import typing -from typing import Any +from typing import Any, Dict, Type from mathics.core.atoms import Complex, Integer, Rational, String, SymbolI from mathics.core.convert.expression import to_expression_with_specialization @@ -41,6 +41,8 @@ SymbolStandardForm, ) +builtins_precedence: Dict[Symbol, int] = {} + element_formatters = {} @@ -51,18 +53,36 @@ def _boxed_string(string: str, **options): return StyleBox(String(string), **options) -def eval_makeboxes(self, expr, evaluation, f=SymbolStandardForm): +def eval_fullform_makeboxes( + self, expr, evaluation: Evaluation, form=SymbolStandardForm +) -> Expression: """ - This function takes the definitions prodived by the evaluation + This function takes the definitions provided by the evaluation object, and produces a boxed form for expr. + + Basically: MakeBoxes[expr // FullForm] + """ + # This is going to be reimplemented. + expr = Expression(SymbolFullForm, expr) + return Expression(SymbolMakeBoxes, expr, form).evaluate(evaluation) + + +def eval_makeboxes( + self, expr, evaluation: Evaluation, form=SymbolStandardForm +) -> Expression: + """ + This function takes the definitions provided by the evaluation + object, and produces a boxed fullform for expr. + + Basically: MakeBoxes[expr // form] """ # This is going to be reimplemented. - return Expression(SymbolMakeBoxes, expr, f).evaluate(evaluation) + return Expression(SymbolMakeBoxes, expr, form).evaluate(evaluation) def format_element( element: BaseElement, evaluation: Evaluation, form: Symbol, **kwargs -) -> BaseElement: +) -> Type[BaseElement]: """ Applies formats associated to the expression, and then calls Makeboxes """ @@ -82,14 +102,14 @@ def format_element( def do_format( element: BaseElement, evaluation: Evaluation, form: Symbol -) -> BaseElement: +) -> Type[BaseElement]: do_format_method = element_formatters.get(type(element), do_format_element) return do_format_method(element, evaluation, form) def do_format_element( element: BaseElement, evaluation: Evaluation, form: Symbol -) -> BaseElement: +) -> Type[BaseElement]: """ Applies formats associated to the expression and removes superfluous enclosing formats. @@ -207,7 +227,7 @@ def format_expr(expr): def do_format_rational( element: BaseElement, evaluation: Evaluation, form: Symbol -) -> BaseElement: +) -> Type[BaseElement]: if form is SymbolFullForm: return do_format_expression( Expression( @@ -232,7 +252,7 @@ def do_format_rational( def do_format_complex( element: BaseElement, evaluation: Evaluation, form: Symbol -) -> BaseElement: +) -> Type[BaseElement]: if form is SymbolFullForm: return do_format_expression( Expression( @@ -260,7 +280,7 @@ def do_format_complex( def do_format_expression( element: BaseElement, evaluation: Evaluation, form: Symbol -) -> BaseElement: +) -> Type[BaseElement]: # # not sure how much useful is this format_cache # if element._format_cache is None: # element._format_cache = {} From 3f64885cde4740dd0617a871c67c1b455f2e7122 Mon Sep 17 00:00:00 2001 From: rocky Date: Tue, 3 Jan 2023 11:39:40 -0500 Subject: [PATCH 008/209] Improve ColorNegate doc --- mathics/builtin/colors/color_operations.py | 40 +++++++++++++--------- 1 file changed, 24 insertions(+), 16 deletions(-) diff --git a/mathics/builtin/colors/color_operations.py b/mathics/builtin/colors/color_operations.py index 7861fff28..a9c91613f 100644 --- a/mathics/builtin/colors/color_operations.py +++ b/mathics/builtin/colors/color_operations.py @@ -15,6 +15,7 @@ from mathics.builtin.image.base import Image from mathics.core.atoms import Integer, MachineReal, Rational, Real from mathics.core.convert.expression import to_expression, to_mathics_list +from mathics.core.evaluation import Evaluation from mathics.core.expression import Expression from mathics.core.list import ListExpression from mathics.core.symbols import Symbol @@ -28,7 +29,8 @@ class Blend(Builtin): """ - :WMA link:https://reference.wolfram.com/language/ref/Blend.html + :WMA link: + https://reference.wolfram.com/language/ref/Blend.html
'Blend[{$c1$, $c2$}]' @@ -99,7 +101,7 @@ def do_blend(self, colors, values): result = [r + p for r, p in zip(result, part)] return type(components=result) - def eval(self, colors, u, evaluation): + def eval(self, colors, u, evaluation: Evaluation): "Blend[{colors___}, u_]" colors_orig = colors @@ -171,7 +173,7 @@ class ColorConvert(Builtin): } summary_text = "convert between color models" - def eval(self, input, colorspace, evaluation): + def eval(self, input, colorspace, evaluation: Evaluation): "ColorConvert[input_, colorspace_String]" if isinstance(input, Image): @@ -201,26 +203,32 @@ def eval(self, input, colorspace, evaluation): class ColorNegate(Builtin): """ - - :WMA link: - https://reference.wolfram.com/language/ref/ColorNegate.html + Color Inversion ( + :WMA: + https://reference.wolfram.com/language/ref/ColorNegate.html)
-
'ColorNegate[$image$]' -
returns the negative of $image$ in which colors have been negated. -
'ColorNegate[$color$]' -
returns the negative of a color. +
returns the RGB color when it is subtracted from white. - Yellow is RGBColor[1.0, 1.0, 0.0] - >> ColorNegate[Yellow] - = RGBColor[0., 0., 1.] +
'ColorNegate[$image$]' +
returns an image where each pixel in the image is replaced \ + with the negative of that pixel.
+ + Yellow is 'RGBColor[1.0, 1.0, 0.0]' So when inverted or subtracted \ + from 'White', we get blue: + + >> ColorNegate[Yellow] == Blue + = True + + >> ColorNegate[Import["ExampleData/sunflowers.jpg"]] + = -Image- """ - summary_text = "the negative color of a given color" + summary_text = "perform color inversion on a color or image" - def eval_for_color(self, color, evaluation): + def eval_for_color(self, color, evaluation: Evaluation): "ColorNegate[color_RGBColor]" # Get components r, g, b = [element.to_python() for element in color.elements] @@ -229,7 +237,7 @@ def eval_for_color(self, color, evaluation): # Reconstitute return Expression(SymbolRGBColor, Real(r), Real(g), Real(b)) - def eval_for_image(self, image, evaluation): + def eval_for_image(self, image, evaluation: Evaluation): "ColorNegate[image_Image]" return image.filter(lambda im: PIL.ImageOps.invert(im)) From 357538f0d18e1c2f29a3920cc57934b0cc27efa1 Mon Sep 17 00:00:00 2001 From: rocky Date: Tue, 3 Jan 2023 13:57:42 -0500 Subject: [PATCH 009/209] Phrasing tweak --- mathics/builtin/colors/color_operations.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/mathics/builtin/colors/color_operations.py b/mathics/builtin/colors/color_operations.py index a9c91613f..4de7f4cc6 100644 --- a/mathics/builtin/colors/color_operations.py +++ b/mathics/builtin/colors/color_operations.py @@ -209,11 +209,11 @@ class ColorNegate(Builtin):
'ColorNegate[$color$]' -
returns the RGB color when it is subtracted from white. +
returns the negative of a color, that is, the RGB color \ + subtracted from white.
'ColorNegate[$image$]' -
returns an image where each pixel in the image is replaced \ - with the negative of that pixel. +
returns an image where each pixel has its color negated.
Yellow is 'RGBColor[1.0, 1.0, 0.0]' So when inverted or subtracted \ From a83062147ca6ee168fc3d5b37f959814a9e3a67b Mon Sep 17 00:00:00 2001 From: rocky Date: Tue, 3 Jan 2023 15:46:35 -0500 Subject: [PATCH 010/209] Require cython Recordclass now seems to require this. --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 9be50f59b..a91b3f08b 100644 --- a/setup.py +++ b/setup.py @@ -39,7 +39,7 @@ sys, "pypy_version_info" ) -INSTALL_REQUIRES = ["Mathics-Scanner >= 1.3.0.dev0", "pillow"] +INSTALL_REQUIRES = ["Mathics-Scanner >= 1.3.0.dev0", "cython", "pillow"] # Ensure user has the correct Python version # Address specific package dependencies based on Python version From b5551774d93056160d8c4c52f7912060eded21ca Mon Sep 17 00:00:00 2001 From: rocky Date: Tue, 3 Jan 2023 15:51:45 -0500 Subject: [PATCH 011/209] Remove recordclass ... Take 2 - recordclass seems to be needing cython and not detecting it. --- setup.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/setup.py b/setup.py index a91b3f08b..317d9b1cb 100644 --- a/setup.py +++ b/setup.py @@ -39,7 +39,7 @@ sys, "pypy_version_info" ) -INSTALL_REQUIRES = ["Mathics-Scanner >= 1.3.0.dev0", "cython", "pillow"] +INSTALL_REQUIRES = ["Mathics-Scanner >= 1.3.0.dev0", "pillow"] # Ensure user has the correct Python version # Address specific package dependencies based on Python version @@ -59,8 +59,8 @@ else: INSTALL_REQUIRES += ["numpy<=1.24", "llvmlite", "sympy>=1.8, < 1.12"] -if not is_PyPy: - INSTALL_REQUIRES += ["recordclass"] +# if not is_PyPy: +# INSTALL_REQUIRES += ["recordclass"] def get_srcdir(): From 89ed6229b9417f10a74c5d9c8f780fd9ea5939a5 Mon Sep 17 00:00:00 2001 From: rocky Date: Tue, 3 Jan 2023 15:29:55 -0500 Subject: [PATCH 012/209] Handle degenerate LineBox when there are no points Something weird seems to be happening in LineBox generation for Asymptote when it handles TicksStyle = {}, the default TickStyle We get: draw(, rgb(0.6, 0.24, 0.56327)+linewidth(0.66667)); Because there are no points. Also TicksStyle handling seems weird since we shouldn't try to create LineBox in the first place. --- mathics/builtin/box/graphics.py | 4 +++- mathics/builtin/drawing/plot.py | 4 +++- mathics/builtin/graphics.py | 12 ++++++++++++ 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/mathics/builtin/box/graphics.py b/mathics/builtin/box/graphics.py index 52a34e2c7..2e5e40d35 100644 --- a/mathics/builtin/box/graphics.py +++ b/mathics/builtin/box/graphics.py @@ -1034,7 +1034,9 @@ def extent(self): class LineBox(_Polyline): - # Boxing methods for a list of Line. + """ + Boxing methods for a list of Lines. + """ def init(self, graphics, style, item=None, lines=None): super(LineBox, self).init(graphics, item, style) diff --git a/mathics/builtin/drawing/plot.py b/mathics/builtin/drawing/plot.py index e4e556c09..4a38b9980 100644 --- a/mathics/builtin/drawing/plot.py +++ b/mathics/builtin/drawing/plot.py @@ -2348,7 +2348,9 @@ def _apply_fn(self, f: Callable, x_value): class ParametricPlot(_Plot): """ - :WMA link: https://reference.wolfram.com/language/ref/ParametricPlot.html + + :WMA link + : https://reference.wolfram.com/language/ref/ParametricPlot.html
'ParametricPlot[{$f_x$, $f_y$}, {$u$, $umin$, $umax$}]'
plots a parametric function $f$ with the parameter $u$ ranging from $umin$ to $umax$. diff --git a/mathics/builtin/graphics.py b/mathics/builtin/graphics.py index a0f01cc64..31142ab7a 100644 --- a/mathics/builtin/graphics.py +++ b/mathics/builtin/graphics.py @@ -343,6 +343,14 @@ def convert(content): class _Polyline(_GraphicsElementBox): + """ + A structure containing a list of line segments + stored in ``self.lines`` created from + a list of points. + + Lines are formed by pairs of consecutive point. + """ + def do_init(self, graphics, points): if not points.has_form("List", None): raise BoxExpressionError @@ -356,6 +364,10 @@ def do_init(self, graphics, points): ): elements = points.elements self.multi_parts = True + elif len(points.elements) == 0: + # Ensure there are no line segments if there are no points. + self.lines = [] + return else: elements = [ListExpression(*points.elements)] self.multi_parts = False From e0b4df8a84b5c1dd2bfa8560bf5b3be5922f9365 Mon Sep 17 00:00:00 2001 From: rocky Date: Tue, 3 Jan 2023 18:31:13 -0500 Subject: [PATCH 013/209] Make a pass over these special functions --- mathics/builtin/specialfns/elliptic.py | 58 +++++++++++++++++++------- mathics/builtin/specialfns/gamma.py | 24 +++++++---- 2 files changed, 57 insertions(+), 25 deletions(-) diff --git a/mathics/builtin/specialfns/elliptic.py b/mathics/builtin/specialfns/elliptic.py index 23bf3b64f..c507254d6 100644 --- a/mathics/builtin/specialfns/elliptic.py +++ b/mathics/builtin/specialfns/elliptic.py @@ -1,8 +1,13 @@ """ Elliptic Integrals -In integral calculus, an :elliptic integral: https://en.wikipedia.org/wiki/Elliptic_integral is one of a number of related functions defined as the value of certain integral. Their name originates from their originally arising in connection with the problem of finding the arc length of an ellipse. These functions often are used in cryptography to encode and decode messages. +In integral calculus, an :elliptic integral: +https://en.wikipedia.org/wiki/Elliptic_integral is one of a number of \ +related functions defined as the value of certain integral. Their name \ +originates from their originally arising in connection with the problem of \ +finding the arc length of an ellipse. +These functions often are used in cryptography to encode and decode messages. """ import sympy @@ -17,7 +22,12 @@ class EllipticE(SympyFunction): """ - :WMA link:https://reference.wolfram.com/language/ref/EllipticE.html + + :Elliptic complete elliptic integral of the second kind: + https://en.wikipedia.org/wiki/Elliptic_integral#Complete_elliptic_integral_of_the_second_kind (:SymPy: + https://docs.sympy.org/latest/modules/functions/special.html#sympy.functions.special.elliptic_integrals.elliptic_e, + :WMA: + https://reference.wolfram.com/language/ref/EllipticE.html)
'EllipticE[$m$]' @@ -46,11 +56,11 @@ class EllipticE(SympyFunction): summary_text = "elliptic integral of the second kind E(ϕ|m)" sympy_name = "elliptic_e" - def apply_default(self, args, evaluation): + def eval_default(self, args, evaluation): "%(name)s[args___]" evaluation.message("EllipticE", "argt", Integer(len(args.elements))) - def apply_m(self, m, evaluation): + def eval_m(self, m, evaluation): "%(name)s[m_]" sympy_arg = numerify(m, evaluation).to_sympy() try: @@ -58,7 +68,7 @@ def apply_m(self, m, evaluation): except: return - def apply_phi_m(self, phi, m, evaluation): + def eval_phi_m(self, phi, m, evaluation): "%(name)s[phi_, m_]" sympy_args = [numerify(a, evaluation).to_sympy() for a in (phi, m)] try: @@ -69,7 +79,12 @@ def apply_phi_m(self, phi, m, evaluation): class EllipticF(SympyFunction): """ - :WMA link:https://reference.wolfram.com/language/ref/EllipticF.html + + :Complete elliptic integral of the first kind: + https://en.wikipedia.org/wiki/Elliptic_integral#Complete_elliptic_integral_of_the_first_kind (:SymPy: + https://docs.sympy.org/latest/modules/functions/special.html#sympy.functions.special.elliptic_integrals.elliptic_f, + :WMA: + https://reference.wolfram.com/language/ref/EllipticF.html)
'EllipticF[$phi$, $m$]' @@ -92,11 +107,11 @@ class EllipticF(SympyFunction): summary_text = "elliptic integral F(ϕ|m)" sympy_name = "elliptic_f" - def apply_default(self, args, evaluation): + def eval_default(self, args, evaluation): "%(name)s[args___]" evaluation.message("EllipticE", "argx", Integer(len(args.elements))) - def apply(self, phi, m, evaluation): + def eval(self, phi, m, evaluation): "%(name)s[phi_, m_]" sympy_args = [numerify(a, evaluation).to_sympy() for a in (phi, m)] try: @@ -107,7 +122,12 @@ def apply(self, phi, m, evaluation): class EllipticK(SympyFunction): """ - :WMA link:https://reference.wolfram.com/language/ref/EllipticK.html + + :Complete elliptic integral of the first kind: + https://en.wikipedia.org/wiki/Elliptic_integral#Complete_elliptic_integral_of_the_first_kind (:SymPy: + https://docs.sympy.org/latest/modules/functions/special.html, + :WMA: + https://reference.wolfram.com/language/ref/EllipticK.html)
'EllipticK[$m$]' @@ -128,16 +148,16 @@ class EllipticK(SympyFunction): attributes = A_NUMERIC_FUNCTION | A_LISTABLE | A_PROTECTED messages = { - "argx": "EllipticE called with `` arguments; 1 argument is expected.", + "argx": "EllipticK called with `` arguments; 1 argument is expected.", } summary_text = "elliptic integral of the first kind K(m)" sympy_name = "elliptic_k" - def apply_default(self, args, evaluation): + def eval_default(self, args, evaluation): "%(name)s[args___]" evaluation.message("EllipticK", "argx", Integer(len(args.elements))) - def apply(self, m, evaluation): + def eval(self, m, evaluation): "%(name)s[m_]" args = numerify(m, evaluation).get_sequence() sympy_args = [a.to_sympy() for a in args] @@ -149,7 +169,13 @@ def apply(self, m, evaluation): class EllipticPi(SympyFunction): """ - :WMA link:https://reference.wolfram.com/language/ref/EllipticPi.html + + :Complete elliptic integral of the third kind: + https://en.wikipedia.org/wiki/Elliptic_integral#Incomplete_elliptic_integral_of_the_third_kind (:SymPy: + https://docs.sympy.org/latest/modules/functions/special.html#sympy.functions.special.elliptic_integrals.elliptic_pi, + :WMA: + https://reference.wolfram.com/language/ref/EllipticPi.html) +
'EllipticPi[$n$, $m$]' @@ -172,11 +198,11 @@ class EllipticPi(SympyFunction): summary_text = "elliptic integral of the third kind P(n|m)" sympy_name = "elliptic_pi" - def apply_default(self, args, evaluation): + def eval_default(self, args, evaluation): "%(name)s[args___]" evaluation.message("EllipticPi", "argt", Integer(len(args.elements))) - def apply_n_m(self, n, m, evaluation): + def eval_n_m(self, n, m, evaluation): "%(name)s[n_, m_]" sympy_m = to_numeric_sympy_args(m, evaluation)[0] sympy_n = to_numeric_sympy_args(n, evaluation)[0] @@ -185,7 +211,7 @@ def apply_n_m(self, n, m, evaluation): except: return - def apply_n_phi_m(self, n, phi, m, evaluation): + def eval_n_phi_m(self, n, phi, m, evaluation): "%(name)s[n_, phi_, m_]" sympy_n = to_numeric_sympy_args(n, evaluation)[0] sympy_phi = to_numeric_sympy_args(m, evaluation)[0] diff --git a/mathics/builtin/specialfns/gamma.py b/mathics/builtin/specialfns/gamma.py index 086f7a3d7..75fadadf2 100644 --- a/mathics/builtin/specialfns/gamma.py +++ b/mathics/builtin/specialfns/gamma.py @@ -33,7 +33,12 @@ class Beta(_MPMathMultiFunction): """ - :WMA link:https://reference.wolfram.com/language/ref/Beta.html + + :Euler beta function: + https://en.wikipedia.org/wiki/Beta_function (:SymPy: + https://docs.sympy.org/latest/modules/functions/special.html#sympy.functions.special.beta_functions.beta, + :WMA: + https://reference.wolfram.com/language/ref/Beta.html)
'Beta[$a$, $b$]' @@ -75,8 +80,8 @@ def from_sympy(self, sympy_name, elements): else: return Expression(Symbol(self.get_name()), *elements) - # sympy does not handles Beta for integer arguments. - def apply_2(self, a, b, evaluation): + # SymPy does not handles Beta for integer arguments. + def eval(self, a, b, evaluation): """Beta[a_, b_]""" if not (a.is_numeric() and b.is_numeric()): return @@ -85,7 +90,7 @@ def apply_2(self, a, b, evaluation): gamma_a_plus_b = Expression(SymbolGamma, a + b) return gamma_a * gamma_b / gamma_a_plus_b - def apply_3(self, z, a, b, evaluation): + def eval_with_z(self, z, a, b, evaluation): """Beta[z_, a_, b_]""" # Here I needed to do that because the order of the arguments in WL # is different from the order in mpmath. Most of the code is the same @@ -215,7 +220,7 @@ class Factorial2(PostfixOperator, _MPMathFunction): summary_text = "semi-factorial" options = {"Method": "Automatic"} - def apply(self, number, evaluation, options={}): + def eval(self, number, evaluation, options={}): "Factorial2[number_?NumberQ, OptionsPattern[%(name)s]]" try: @@ -357,10 +362,11 @@ def from_sympy(self, sympy_name, elements): class LogGamma(_MPMathMultiFunction): """ - :WMA link:https://reference.wolfram.com/language/ref/LogGamma.html - - In number theory the logarithm of the gamma function often appears. For positive real numbers, this can be evaluated as 'Log[Gamma[$z$]]'. - + :log-gamma function: + https://en.wikipedia.org/wiki/Gamma_function#The_log-gamma_function ( + :SymPy: + https://docs.sympy.org/latest/modules/functions/special.html#sympy.functions.special.gamma_functions.loggamma, + :WMA:https://reference.wolfram.com/language/ref/LogGamma.html)
'LogGamma[$z$]'
is the logarithm of the gamma function on the complex number $z$. From c7315ec853cdcf45da6a23a241455546eba8a3b0 Mon Sep 17 00:00:00 2001 From: rocky Date: Tue, 3 Jan 2023 21:43:41 -0500 Subject: [PATCH 014/209] Correct extra url, expand Pochhammer examples --- mathics/builtin/specialfns/elliptic.py | 1 - mathics/builtin/specialfns/gamma.py | 62 +++++++++++++++++++++----- 2 files changed, 51 insertions(+), 12 deletions(-) diff --git a/mathics/builtin/specialfns/elliptic.py b/mathics/builtin/specialfns/elliptic.py index c507254d6..b15818948 100644 --- a/mathics/builtin/specialfns/elliptic.py +++ b/mathics/builtin/specialfns/elliptic.py @@ -175,7 +175,6 @@ class EllipticPi(SympyFunction): https://docs.sympy.org/latest/modules/functions/special.html#sympy.functions.special.elliptic_integrals.elliptic_pi, :WMA: https://reference.wolfram.com/language/ref/EllipticPi.html) -
'EllipticPi[$n$, $m$]' diff --git a/mathics/builtin/specialfns/gamma.py b/mathics/builtin/specialfns/gamma.py index 75fadadf2..462f7c578 100644 --- a/mathics/builtin/specialfns/gamma.py +++ b/mathics/builtin/specialfns/gamma.py @@ -408,22 +408,53 @@ def get_sympy_names(self): class Pochhammer(SympyFunction): """ - :WMA link:https://reference.wolfram.com/language/ref/Pochhammer.html + :Rising factorial: + https://en.wikipedia.org/wiki/Falling_and_rising_factorials ( + :SymPy: + https://docs.sympy.org/latest/modules/functions/combinatorial.html#risingfactorial, + :WMA: + https://reference.wolfram.com/language/ref/Pochhammer.html) + + The Pochhammer symbol or rising factorial often appears in series \ + expansions for hypergeometric functions. - The Pochhammer symbol or rising factorial often appears in series expansions for hypergeometric functions. - The Pochammer symbol has a definie value even when the gamma functions which appear in its definition are infinite. + The Pochammer symbol has a definite value even when the gamma \ + functions which appear in its definition are infinite.
'Pochhammer[$a$, $n$]' -
is the Pochhammer symbol (a)_n. +
is the Pochhammer symbol $a_n$.
- >> Pochhammer[4, 8] - = 6652800 + Product of the first 3 numbers: + >> Pochhammer[1, 3] + = 6 + + 'Pochhammer[1, $n$]' is \ + the same as Pochhammer[2, $n$-1] since 1 is a multiplicative identity. + + >> Pochhammer[1, 3] == Pochhammer[2, 2] + = True + + Although sometimes 'Pochhammer[0, $n$]' is taken to be 1, in Mathics it is 0: + >> Pochhammer[0, n] + = 0 + + Pochhammer uses Gamma for non-Integer values of $n$: + + >> Pochhammer[1, 3.001] + = 6.00754 + + >> Pochhammer[1, 3.001] == Pochhammer[2, 2.001] + = True + + >> Pochhammer[1.001, 3] == 1.001 2.001 3.001 + = True """ attributes = A_LISTABLE | A_NUMERIC_FUNCTION | A_PROTECTED rules = { + "Pochhammer[0, n_]": "0", # Wikipedia says it should be 1 though. "Pochhammer[a_, n_]": "Gamma[a + n] / Gamma[a]", "Derivative[1,0][Pochhammer]": "(Pochhammer[#1, #2]*(-PolyGamma[0, #1] + PolyGamma[0, #1 + #2]))&", "Derivative[0,1][Pochhammer]": "(Pochhammer[#1, #2]*PolyGamma[0, #1 + #2])&", @@ -434,7 +465,12 @@ class Pochhammer(SympyFunction): class PolyGamma(_MPMathMultiFunction): r""" - :WMA link:https://reference.wolfram.com/language/ref/PolyGamma.html + :Polygamma function: + https://en.wikipedia.org/wiki/Polygamma_function ( + :SymPy: + https://docs.sympy.org/latest/modules/functions/special.html#sympy.functions.special.gamma_functions.polygamma, + :WMA: + https://reference.wolfram.com/language/ref/PolyGamma.html) PolyGamma is a meromorphic function on the complex numbers and is defined as a derivative of the logarithm of the gamma function.
@@ -470,13 +506,17 @@ class PolyGamma(_MPMathMultiFunction): class StieltjesGamma(SympyFunction): - r""" - :WMA link:https://reference.wolfram.com/language/ref/StieltjesGamma.html + """ + :Stieltjes constants: + https://en.wikipedia.org/wiki/Stieltjes_constants ( + :SymPy: + https://docs.sympy.org/latest/modules/functions/special.html#sympy.functions.special.zeta_functions.stieltjes, + :WMA: + https://reference.wolfram.com/language/ref/StieltjesGamma.html) - PolyGamma is a meromorphic function on the complex numbers and is defined as a derivative of the logarithm of the gamma function.
'StieltjesGamma[$n$]' -
returns the Stieljs contstant for $n$. +
returns the Stieltjes constant for $n$.
'StieltjesGamma[$n$, $a$]'
gives the generalized Stieltjes constant of its parameters From d59c95e4bc6774f972c4d9c6b6e03d40438b4179 Mon Sep 17 00:00:00 2001 From: rocky Date: Wed, 4 Jan 2023 02:49:51 -0500 Subject: [PATCH 015/209] Unis & Quantites was not showing... in docs because no header text. more apply->eval conversions misc doc tweaks --- mathics/builtin/fileformats/xmlformat.py | 12 +-- mathics/builtin/forms/output.py | 37 ++++---- mathics/builtin/layout.py | 14 +-- mathics/builtin/list/associations.py | 15 +-- mathics/builtin/quantities.py | 115 ++++++++++++++--------- mathics/builtin/specialfns/gamma.py | 4 + mathics/doc/documentation/1-Manual.mdoc | 4 +- 7 files changed, 115 insertions(+), 86 deletions(-) diff --git a/mathics/builtin/fileformats/xmlformat.py b/mathics/builtin/fileformats/xmlformat.py index 16012d370..181b2153c 100644 --- a/mathics/builtin/fileformats/xmlformat.py +++ b/mathics/builtin/fileformats/xmlformat.py @@ -15,7 +15,7 @@ from mathics.core.atoms import String from mathics.core.convert.expression import to_expression, to_mathics_list from mathics.core.convert.python import from_python -from mathics.core.expression import Expression +from mathics.core.expression import Evaluation, Expression from mathics.core.symbols import Symbol from mathics.core.systemsymbols import SymbolFailed @@ -211,7 +211,7 @@ def parse_xml_file(filename): return root -def parse_xml(parse, text, evaluation): +def parse_xml(parse, text, evaluation: Evaluation): try: return parse(text.get_string_value()) except ParseError as e: @@ -261,7 +261,7 @@ class _Get(Builtin): "prserr": "``.", } - def apply(self, text, evaluation): + def eval(self, text, evaluation: Evaluation): """%(name)s[text_String]""" root = parse_xml(self._parse, text, evaluation) if isinstance(root, Symbol): # $Failed? @@ -329,7 +329,7 @@ class PlaintextImport(Builtin): summary_text = "import plain text from xml" context = "XML`" - def apply(self, text, evaluation): + def eval(self, text, evaluation: Evaluation): """%(name)s[text_String]""" root = parse_xml(parse_xml_file, text, evaluation) if isinstance(root, Symbol): # $Failed? @@ -373,7 +373,7 @@ def gather(node): gather(root) return to_mathics_list(*[String(tag) for tag in sorted(list(tags))]) - def apply(self, text, evaluation): + def eval(self, text, evaluation: Evaluation): """%(name)s[text_String]""" root = parse_xml(parse_xml_file, text, evaluation) if isinstance(root, Symbol): # $Failed? @@ -400,7 +400,7 @@ class XMLObjectImport(Builtin): summary_text = "import elements from xml" context = "XML`" - def apply(self, text, evaluation): + def eval(self, text, evaluation: Evaluation): """%(name)s[text_String]""" xml = to_expression("XML`Parser`XMLGet", text).evaluate(evaluation) return to_mathics_list(to_expression("Rule", "XMLObject", xml)) diff --git a/mathics/builtin/forms/output.py b/mathics/builtin/forms/output.py index 06061e9a4..081c7e1ba 100644 --- a/mathics/builtin/forms/output.py +++ b/mathics/builtin/forms/output.py @@ -27,6 +27,7 @@ String, StringFromPython, ) +from mathics.core.evaluation import Evaluation from mathics.core.expression import BoxError, Expression from mathics.core.list import ListExpression from mathics.core.number import convert_base, dps, machine_precision, reconstruct_digits @@ -105,7 +106,7 @@ class BaseForm(Builtin): "basf": "Requested base `1` must be between 2 and 36.", } - def apply_makeboxes(self, expr, n, f, evaluation): + def eval_makeboxes(self, expr, n, f, evaluation: Evaluation): """MakeBoxes[BaseForm[expr_, n_], f:StandardForm|TraditionalForm|OutputForm]""" @@ -272,7 +273,7 @@ class _NumberForm(Builtin): "sigz": "In addition to the number of digits requested, one or more zeros will appear as placeholders.", } - def check_options(self, options, evaluation): + def check_options(self, options, evaluation: Evaluation): """ Checks options are valid and converts them to python. """ @@ -286,7 +287,7 @@ def check_options(self, options, evaluation): result[option_name] = value return result - def check_DigitBlock(self, value, evaluation): + def check_DigitBlock(self, value, evaluation: Evaluation): py_value = value.get_int_value() if value.sameQ(SymbolInfinity): return [0, 0] @@ -312,7 +313,7 @@ def check_DigitBlock(self, value, evaluation): return result return evaluation.message(self.get_name(), "dblk", value) - def check_ExponentFunction(self, value, evaluation): + def check_ExponentFunction(self, value, evaluation: Evaluation): if value.sameQ(SymbolAutomatic): return self.default_ExponentFunction @@ -321,7 +322,7 @@ def exp_function(x): return exp_function - def check_NumberFormat(self, value, evaluation): + def check_NumberFormat(self, value, evaluation: Evaluation): if value.sameQ(SymbolAutomatic): return self.default_NumberFormat @@ -330,45 +331,45 @@ def num_function(man, base, exp, options): return num_function - def check_NumberMultiplier(self, value, evaluation): + def check_NumberMultiplier(self, value, evaluation: Evaluation): result = value.get_string_value() if result is None: evaluation.message(self.get_name(), "npt", "NumberMultiplier", value) return result - def check_NumberPoint(self, value, evaluation): + def check_NumberPoint(self, value, evaluation: Evaluation): result = value.get_string_value() if result is None: evaluation.message(self.get_name(), "npt", "NumberPoint", value) return result - def check_ExponentStep(self, value, evaluation): + def check_ExponentStep(self, value, evaluation: Evaluation): result = value.get_int_value() if result is None or result <= 0: return evaluation.message(self.get_name(), "estep", "ExponentStep", value) return result - def check_SignPadding(self, value, evaluation): + def check_SignPadding(self, value, evaluation: Evaluation): if value.sameQ(SymbolTrue): return True elif value.sameQ(SymbolFalse): return False return evaluation.message(self.get_name(), "opttf", value) - def _check_List2str(self, value, msg, evaluation): + def _check_List2str(self, value, msg, evaluation: Evaluation): if value.has_form("List", 2): result = [element.get_string_value() for element in value.elements] if None not in result: return result return evaluation.message(self.get_name(), msg, value) - def check_NumberSigns(self, value, evaluation): + def check_NumberSigns(self, value, evaluation: Evaluation): return self._check_List2str(value, "nsgn", evaluation) - def check_NumberPadding(self, value, evaluation): + def check_NumberPadding(self, value, evaluation: Evaluation): return self._check_List2str(value, "npad", evaluation) - def check_NumberSeparator(self, value, evaluation): + def check_NumberSeparator(self, value, evaluation: Evaluation): py_str = value.get_string_value() if py_str is not None: return [py_str, py_str] @@ -634,7 +635,7 @@ def default_NumberFormat(man, base, exp, options): else: return man - def apply_list_n(self, expr, n, evaluation, options) -> Expression: + def eval_list_n(self, expr, n, evaluation, options) -> Expression: "NumberForm[expr_List, n_, OptionsPattern[NumberForm]]" options = [ Expression(SymbolRuleDelayed, Symbol(key), value) @@ -647,7 +648,7 @@ def apply_list_n(self, expr, n, evaluation, options) -> Expression: ] ) - def apply_list_nf(self, expr, n, f, evaluation, options) -> Expression: + def eval_list_nf(self, expr, n, f, evaluation, options) -> Expression: "NumberForm[expr_List, {n_, f_}, OptionsPattern[NumberForm]]" options = [ Expression(SymbolRuleDelayed, Symbol(key), value) @@ -660,7 +661,7 @@ def apply_list_nf(self, expr, n, f, evaluation, options) -> Expression: ], ) - def apply_makeboxes(self, expr, form, evaluation, options={}): + def eval_makeboxes(self, expr, form, evaluation, options={}): """MakeBoxes[NumberForm[expr_, OptionsPattern[NumberForm]], form:StandardForm|TraditionalForm|OutputForm]""" @@ -685,7 +686,7 @@ def apply_makeboxes(self, expr, form, evaluation, options={}): return number_form(expr, py_n, None, evaluation, py_options) return Expression(SymbolMakeBoxes, expr, form) - def apply_makeboxes_n(self, expr, n, form, evaluation, options={}): + def eval_makeboxes_n(self, expr, n, form, evaluation, options={}): """MakeBoxes[NumberForm[expr_, n_?NotOptionQ, OptionsPattern[NumberForm]], form:StandardForm|TraditionalForm|OutputForm]""" @@ -705,7 +706,7 @@ def apply_makeboxes_n(self, expr, n, form, evaluation, options={}): return number_form(expr, py_n, None, evaluation, py_options) return Expression(SymbolMakeBoxes, expr, form) - def apply_makeboxes_nf(self, expr, n, f, form, evaluation, options={}): + def eval_makeboxes_nf(self, expr, n, f, form, evaluation, options={}): """MakeBoxes[NumberForm[expr_, {n_, f_}, OptionsPattern[NumberForm]], form:StandardForm|TraditionalForm|OutputForm]""" diff --git a/mathics/builtin/layout.py b/mathics/builtin/layout.py index 9b68b9ce9..26419763f 100644 --- a/mathics/builtin/layout.py +++ b/mathics/builtin/layout.py @@ -16,7 +16,7 @@ from mathics.builtin.makeboxes import MakeBoxes from mathics.builtin.options import options_to_rules from mathics.core.atoms import Real, String -from mathics.core.expression import Expression +from mathics.core.expression import Evaluation, Expression from mathics.core.list import ListExpression from mathics.core.symbols import Symbol from mathics.core.systemsymbols import SymbolMakeBoxes @@ -93,7 +93,7 @@ class Grid(Builtin): options = GridBox.options summary_text = " 2D layout containing arbitrary objects" - def apply_makeboxes(self, array, f, evaluation, options) -> Expression: + def eval_makeboxes(self, array, f, evaluation, options) -> Expression: """MakeBoxes[Grid[array_?MatrixQ, OptionsPattern[Grid]], f:StandardForm|TraditionalForm|OutputForm]""" return GridBox( @@ -230,7 +230,7 @@ class Precedence(Builtin): summary_text = "an object to be parenthesized with a given precedence level" - def apply(self, expr, evaluation) -> Real: + def eval(self, expr, evaluation) -> Real: "Precedence[expr_]" name = expr.get_name() @@ -307,7 +307,7 @@ class Row(Builtin): summary_text = "1D layouts containing arbitrary objects in a row" - def apply_makeboxes(self, items, sep, f, evaluation): + def eval_makeboxes(self, items, sep, f, evaluation: Evaluation): """MakeBoxes[Row[{items___}, sep_:""], f:StandardForm|TraditionalForm|OutputForm]""" @@ -369,7 +369,9 @@ class Style(Builtin): class Subscript(Builtin): """ - :WMA link:https://reference.wolfram.com/language/ref/Subscript.html + + :WMA link: + https://reference.wolfram.com/language/ref/Subscript.html
'Subscript[$a$, $i$]' @@ -382,7 +384,7 @@ class Subscript(Builtin): summary_text = "format an expression with a subscript" - def apply_makeboxes(self, x, y, f, evaluation) -> Expression: + def eval_makeboxes(self, x, y, f, evaluation) -> Expression: "MakeBoxes[Subscript[x_, y__], f:StandardForm|TraditionalForm]" y = y.get_sequence() diff --git a/mathics/builtin/list/associations.py b/mathics/builtin/list/associations.py index 4426376b7..4683d05d1 100644 --- a/mathics/builtin/list/associations.py +++ b/mathics/builtin/list/associations.py @@ -3,7 +3,9 @@ """ Associations -An Association maps keys to values and is similar to a dictionary in Python; it is often sparse in that their key space is much larger than the number of actual keys found in the collection. +An Association maps keys to values and is similar to a dictionary in Python; \ +it is often sparse in that their key space is much larger than the number of \ +actual keys found in the collection. """ @@ -13,6 +15,7 @@ from mathics.core.atoms import Integer from mathics.core.attributes import A_HOLD_ALL_COMPLETE, A_PROTECTED from mathics.core.convert.expression import to_mathics_list +from mathics.core.evaluation import Evaluation from mathics.core.expression import Expression from mathics.core.symbols import Symbol, SymbolTrue from mathics.core.systemsymbols import SymbolAssociation, SymbolMakeBoxes, SymbolMissing @@ -81,7 +84,7 @@ class Association(Builtin): summary_text = "an association between keys and values" - def apply_makeboxes(self, rules, f, evaluation): + def eval_makeboxes(self, rules, f, evaluation: Evaluation): """MakeBoxes[<|rules___|>, f:StandardForm|TraditionalForm|OutputForm|InputForm]""" @@ -110,7 +113,7 @@ def validate(exprs): self.error_idx -= 1 return expr - def apply(self, rules, evaluation): + def eval(self, rules, evaluation: Evaluation): "Association[rules__]" def make_flatten(exprs, rules_dictionary: dict = {}): @@ -131,7 +134,7 @@ def make_flatten(exprs, rules_dictionary: dict = {}): except TypeError: return None - def apply_key(self, rules, key, evaluation): + def eval_key(self, rules, key, evaluation: Evaluation): "Association[rules__][key_]" def find_key(exprs, rules_dictionary: dict = {}): @@ -260,7 +263,7 @@ class Keys(Builtin): summary_text = "list association keys" - def apply(self, rules, evaluation): + def eval(self, rules, evaluation: Evaluation): "Keys[rules___]" def get_keys(expr): @@ -390,7 +393,7 @@ class Values(Builtin): summary_text = "list association values" - def apply(self, rules, evaluation): + def eval(self, rules, evaluation: Evaluation): "Values[rules___]" def get_values(expr): diff --git a/mathics/builtin/quantities.py b/mathics/builtin/quantities.py index 40250f95c..f2d6ac4e6 100644 --- a/mathics/builtin/quantities.py +++ b/mathics/builtin/quantities.py @@ -1,5 +1,7 @@ # -*- coding: utf-8 -*- - +""" +Units and Quantities +""" from pint import UnitRegistry @@ -12,11 +14,15 @@ A_READ_PROTECTED, ) from mathics.core.convert.expression import to_mathics_list +from mathics.core.evaluation import Evaluation from mathics.core.expression import Expression from mathics.core.list import ListExpression from mathics.core.symbols import Symbol from mathics.core.systemsymbols import SymbolRowBox +# This tells documentation how to sort this module +sort_order = "mathics.builtin.units-and-quantites" + SymbolQuantity = Symbol("Quantity") ureg = UnitRegistry() @@ -25,11 +31,13 @@ class KnownUnitQ(Test): """ - :WMA link:https://reference.wolfram.com/language/ref/KnownUnitQ.html + + :WMA link: + https://reference.wolfram.com/language/ref/KnownUnitQ.html
-
'KnownUnitQ[$unit$]' -
returns True if $unit$ is a canonical unit, and False otherwise. +
'KnownUnitQ[$unit$]' +
returns True if $unit$ is a canonical unit, and False otherwise.
>> KnownUnitQ["Feet"] @@ -39,7 +47,7 @@ class KnownUnitQ(Test): = False """ - summary_text = "check if its argument is a canonical unit." + summary_text = "tests whether its argument is a canonical unit." def test(self, expr): def validate(unit): @@ -55,13 +63,16 @@ def validate(unit): class Quantity(Builtin): """ - :WMA link:https://reference.wolfram.com/language/ref/Quantity.html + + :WMA link: + https://reference.wolfram.com/language/ref/Quantity.html
-
'Quantity[$magnitude$, $unit$]' -
represents a quantity with size $magnitude$ and unit specified by $unit$. -
'Quantity[$unit$]' -
assumes the magnitude of the specified $unit$ to be 1. +
'Quantity[$magnitude$, $unit$]' +
represents a quantity with size $magnitude$ and unit specified by $unit$. + +
'Quantity[$unit$]' +
assumes the magnitude of the specified $unit$ to be 1.
>> Quantity["Kilogram"] @@ -89,17 +100,17 @@ class Quantity(Builtin): messages = { "unkunit": "Unable to interpret unit specification `1`.", } - summary_text = "quantity with units" + summary_text = "represents a quantity with units" - def validate(self, unit, evaluation): + def validate(self, unit, evaluation: Evaluation): if KnownUnitQ(unit).evaluate(evaluation) is Symbol("False"): return False return True - def apply_makeboxes(self, mag, unit, f, evaluation): + def eval_makeboxes(self, mag, unit, f, evaluation: Evaluation): "MakeBoxes[Quantity[mag_, unit_String], f:StandardForm|TraditionalForm|OutputForm|InputForm]" - q_unit = unit.get_string_value().lower() + q_unit = unit.value.lower() if self.validate(unit, evaluation): return Expression(SymbolRowBox, ListExpression(mag, " ", q_unit)) else: @@ -108,14 +119,14 @@ def apply_makeboxes(self, mag, unit, f, evaluation): to_mathics_list(SymbolQuantity, "[", mag, ",", q_unit, "]"), ) - def apply_n(self, mag, unit, evaluation): + def eval_n(self, mag, unit, evaluation: Evaluation): "Quantity[mag_, unit_String]" if self.validate(unit, evaluation): if mag.has_form("List", None): results = [] for i in range(len(mag.elements)): - quantity = Q_(mag.elements[i], unit.get_string_value().lower()) + quantity = Q_(mag.elements[i], unit.value.lower()) results.append( Expression( SymbolQuantity, quantity.magnitude, String(quantity.units) @@ -123,30 +134,33 @@ def apply_n(self, mag, unit, evaluation): ) return ListExpression(*results) else: - quantity = Q_(mag, unit.get_string_value().lower()) + quantity = Q_(mag, unit.value.lower()) return Expression( "Quantity", quantity.magnitude, String(quantity.units) ) else: return evaluation.message("Quantity", "unkunit", unit) - def apply_1(self, unit, evaluation): + def eval(self, unit, evaluation: Evaluation): "Quantity[unit_]" if not isinstance(unit, String): return evaluation.message("Quantity", "unkunit", unit) else: - return self.apply_n(Integer1, unit, evaluation) + return self.eval_n(Integer1, unit, evaluation) class QuantityMagnitude(Builtin): """ - :WMA link:https://reference.wolfram.com/language/ref/QuantityMagnitude.html + + :WMA link: + https://reference.wolfram.com/language/ref/QuantityMagnitude.html
-
'QuantityMagnitude[$quantity$]' -
gives the amount of the specified $quantity$. -
'QuantityMagnitude[$quantity$, $unit$]' -
gives the value corresponding to $quantity$ when converted to $unit$. +
'QuantityMagnitude[$quantity$]' +
gives the amount of the specified $quantity$. + +
'QuantityMagnitude[$quantity$, $unit$]' +
gives the value corresponding to $quantity$ when converted to $unit$.
>> QuantityMagnitude[Quantity["Kilogram"]] @@ -178,9 +192,9 @@ class QuantityMagnitude(Builtin): = QuantityMagnitude[Quantity[3,mater]] """ - summary_text = "The magnitude associated to a quantity." + summary_text = "get magnitude associated with a quantity." - def apply(self, expr, evaluation): + def eval(self, expr, evaluation: Evaluation): "QuantityMagnitude[expr_]" def get_magnitude(elements): @@ -199,10 +213,10 @@ def get_magnitude(elements): else: return get_magnitude(expr.elements) - def apply_unit(self, expr, unit, evaluation): + def eval_unit(self, expr, unit, evaluation: Evaluation): "QuantityMagnitude[expr_, unit_]" - def get_magnitude(elements, targetUnit, evaluation): + def get_magnitude(elements, targetUnit, evaluation: Evaluation): quanity = Q_(elements[0], elements[1].get_string_value()) converted_quantity = quanity.to(targetUnit) q_mag = converted_quantity.magnitude.evaluate(evaluation).get_float_value() @@ -243,10 +257,12 @@ def get_magnitude(elements, targetUnit, evaluation): class QuantityQ(Test): """ - :WMA link:https://reference.wolfram.com/language/ref/QuantityQ.html + + :WMA link: + https://reference.wolfram.com/language/ref/QuantityQ.html
-
'QuantityQ[$expr$]' -
return True if $expr$ is a valid Association object, and False otherwise. +
'QuantityQ[$expr$]' +
return True if $expr$ is a valid Association object, and False otherwise.
>> QuantityQ[Quantity[3, "Meters"]] @@ -260,7 +276,7 @@ class QuantityQ(Test): = False """ - summary_text = "checks if the argument is a quantity" + summary_text = "tests whether its the argument is a quantity" def test(self, expr): def validate_unit(unit): @@ -293,11 +309,13 @@ def validate(elements): class QuantityUnit(Builtin): """ - :WMA link:https://reference.wolfram.com/language/ref/QuantityUnit.html + + :WMA link: + https://reference.wolfram.com/language/ref/QuantityUnit.html
-
'QuantityUnit[$quantity$]' -
returns the unit associated with the specified $quantity$. +
'QuantityUnit[$quantity$]' +
returns the unit associated with the specified $quantity$.
>> QuantityUnit[Quantity["Kilogram"]] @@ -316,7 +334,7 @@ class QuantityUnit(Builtin): summary_text = "the unit associated to a quantity" - def apply(self, expr, evaluation): + def eval(self, expr, evaluation: Evaluation): "QuantityUnit[expr_]" def get_unit(elements): @@ -339,13 +357,16 @@ def get_unit(elements): class UnitConvert(Builtin): """ - :WMA link:https://reference.wolfram.com/language/ref/UnitConvert.html + + :WMA link: + https://reference.wolfram.com/language/ref/UnitConvert.html
-
'UnitConvert[$quantity$, $targetunit$] ' -
converts the specified $quantity$ to the specified $targetunit$. -
'UnitConvert[quantity]' -
converts the specified $quantity$ to its "SIBase" units. +
'UnitConvert[$quantity$, $targetunit$] ' +
converts the specified $quantity$ to the specified $targetunit$. + +
'UnitConvert[quantity]' +
converts the specified $quantity$ to its "SIBase" units.
Convert from miles to kilometers: @@ -373,15 +394,15 @@ class UnitConvert(Builtin): messages = { "argrx": "UnitConvert called with `1` arguments; 2 arguments are expected" } - summary_text = "Conversion between units." + summary_text = "convert between units." - def apply(self, expr, toUnit, evaluation): + def eval(self, expr, toUnit, evaluation: Evaluation): "UnitConvert[expr_, toUnit_]" - def convert_unit(leaves, target): + def convert_unit(elements, target): - mag = leaves[0] - unit = leaves[1].get_string_value() + mag = elements[0] + unit = elements[1].get_string_value() quantity = Q_(mag, unit) converted_quantity = quantity.to(target) @@ -415,7 +436,7 @@ def convert_unit(leaves, target): else: return convert_unit(expr.elements, targetUnit) - def apply_base_unit(self, expr, evaluation): + def eval_base_unit(self, expr, evaluation: Evaluation): "UnitConvert[expr_]" def convert_unit(elements): diff --git a/mathics/builtin/specialfns/gamma.py b/mathics/builtin/specialfns/gamma.py index 462f7c578..5c167400a 100644 --- a/mathics/builtin/specialfns/gamma.py +++ b/mathics/builtin/specialfns/gamma.py @@ -276,6 +276,10 @@ class Gamma(_MPMathMultiFunction): https://mpmath.org/doc/current/functions/gamma.html#gamma, :WMA:https://reference.wolfram.com/language/ref/Gamma.html) + The gamma function is one commonly used extension of the factorial function \ + applied to complex numbers, and is defined for all complex numbers except \ + the non-positive integers. +
'Gamma[$z$]'
is the gamma function on the complex number $z$. diff --git a/mathics/doc/documentation/1-Manual.mdoc b/mathics/doc/documentation/1-Manual.mdoc index 24be7b831..6fd0cd927 100644 --- a/mathics/doc/documentation/1-Manual.mdoc +++ b/mathics/doc/documentation/1-Manual.mdoc @@ -1060,9 +1060,7 @@ Three-dimensional plots are supported as well: - - - +
Let\'s sketch the function From 19487333ce1ffe33e0550c09b3cc36d297c5100f Mon Sep 17 00:00:00 2001 From: rocky Date: Wed, 4 Jan 2023 03:56:59 -0500 Subject: [PATCH 016/209] Fix bugs introduced by more stringent Expressions This module was crating Python strings and numeric values in Expressions --- CHANGES.rst | 1 + mathics/builtin/quantities.py | 42 ++++++++++++++++++++++++----------- mathics/core/systemsymbols.py | 1 + 3 files changed, 31 insertions(+), 13 deletions(-) diff --git a/CHANGES.rst b/CHANGES.rst index 934fd0eb8..0c04afeb5 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -74,6 +74,7 @@ Bugs #. ``RandomSample`` with one list argument now returns a random ordering of the list items. Previously it would return just one item. #. Origin placement corrected on ``ListPlot`` and ``LinePlot``. #. Fix long-standing bugs in Image handling +#. Units and Quantities were sometimes failing. Also they were omitted from documentation. Enhancements diff --git a/mathics/builtin/quantities.py b/mathics/builtin/quantities.py index f2d6ac4e6..2eba38a94 100644 --- a/mathics/builtin/quantities.py +++ b/mathics/builtin/quantities.py @@ -14,21 +14,33 @@ A_READ_PROTECTED, ) from mathics.core.convert.expression import to_mathics_list +from mathics.core.convert.python import from_python from mathics.core.evaluation import Evaluation from mathics.core.expression import Expression from mathics.core.list import ListExpression from mathics.core.symbols import Symbol -from mathics.core.systemsymbols import SymbolRowBox +from mathics.core.systemsymbols import SymbolQuantity, SymbolRowBox # This tells documentation how to sort this module sort_order = "mathics.builtin.units-and-quantites" -SymbolQuantity = Symbol("Quantity") - ureg = UnitRegistry() Q_ = ureg.Quantity +def get_converted_magnitude(magnitude_expr, evaluation: Evaluation) -> float: + """ + The Pythion "pint" library mixes in a Python numeric value as a multiplier inside + a Mathics Expression. here we pick out that multiplier and + convert it from a Python numeric to a Mathics numeric. + """ + magnitude_elements = list(magnitude_expr.elements) + magnitude_elements[1] = from_python(magnitude_elements[1]) + magnitude_expr._elements = tuple(magnitude_elements) + # FIXME: consider returning an int when that is possible + return magnitude_expr.evaluate(evaluation).get_float_value() + + class KnownUnitQ(Test): """ @@ -112,7 +124,9 @@ def eval_makeboxes(self, mag, unit, f, evaluation: Evaluation): q_unit = unit.value.lower() if self.validate(unit, evaluation): - return Expression(SymbolRowBox, ListExpression(mag, " ", q_unit)) + return Expression( + SymbolRowBox, ListExpression(mag, String(" "), String(q_unit)) + ) else: return Expression( SymbolRowBox, @@ -136,7 +150,7 @@ def eval_n(self, mag, unit, evaluation: Evaluation): else: quantity = Q_(mag, unit.value.lower()) return Expression( - "Quantity", quantity.magnitude, String(quantity.units) + SymbolQuantity, quantity.magnitude, String(quantity.units) ) else: return evaluation.message("Quantity", "unkunit", unit) @@ -217,9 +231,9 @@ def eval_unit(self, expr, unit, evaluation: Evaluation): "QuantityMagnitude[expr_, unit_]" def get_magnitude(elements, targetUnit, evaluation: Evaluation): - quanity = Q_(elements[0], elements[1].get_string_value()) - converted_quantity = quanity.to(targetUnit) - q_mag = converted_quantity.magnitude.evaluate(evaluation).get_float_value() + quantity = Q_(elements[0], elements[1].get_string_value()) + converted_quantity = quantity.to(targetUnit) + q_mag = get_converted_magnitude(converted_quantity.magnitude, evaluation) # Displaying the magnitude in Integer form if the convert rate is an Integer if q_mag - int(q_mag) > 0: @@ -304,7 +318,7 @@ def validate(elements): else: return False - return expr.get_head_name() == "System`Quantity" and validate(expr.elements) + return expr.get_head() == SymbolQuantity and validate(expr.elements) class QuantityUnit(Builtin): @@ -406,13 +420,13 @@ def convert_unit(elements, target): quantity = Q_(mag, unit) converted_quantity = quantity.to(target) - q_mag = converted_quantity.magnitude.evaluate(evaluation).get_float_value() + q_mag = get_converted_magnitude(converted_quantity.magnitude, evaluation) # Displaying the magnitude in Integer form if the convert rate is an Integer if q_mag - int(q_mag) > 0: - return Expression(SymbolQuantity, Real(q_mag), target) + return Expression(SymbolQuantity, Real(q_mag), String(target)) else: - return Expression(SymbolQuantity, Integer(q_mag), target) + return Expression(SymbolQuantity, Integer(q_mag), String(target)) if len(evaluation.out) > 0: return @@ -447,8 +461,10 @@ def convert_unit(elements): quantity = Q_(mag, unit) converted_quantity = quantity.to_base_units() + mag = get_converted_magnitude(converted_quantity.magnitude, evaluation) + return Expression( - "Quantity", + SymbolQuantity, converted_quantity.magnitude, String(converted_quantity.units), ) diff --git a/mathics/core/systemsymbols.py b/mathics/core/systemsymbols.py index 9b0aea436..07c8c8eae 100644 --- a/mathics/core/systemsymbols.py +++ b/mathics/core/systemsymbols.py @@ -162,6 +162,7 @@ SymbolPolygon = Symbol("System`Polygon") SymbolPossibleZeroQ = Symbol("System`PossibleZeroQ") SymbolPrecision = Symbol("System`Precision") +SymbolQuantity = Symbol("System`Quantity") SymbolQuiet = Symbol("System`Quiet") SymbolRGBColor = Symbol("System`RGBColor") SymbolRandomComplex = Symbol("System`RandomComplex") From f595db2a6d9ce962406a74cec26e89dc57ddbccb Mon Sep 17 00:00:00 2001 From: rocky Date: Wed, 4 Jan 2023 08:57:07 -0500 Subject: [PATCH 017/209] Correct spelling mistake --- mathics/builtin/quantities.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mathics/builtin/quantities.py b/mathics/builtin/quantities.py index 2eba38a94..1d26b1fac 100644 --- a/mathics/builtin/quantities.py +++ b/mathics/builtin/quantities.py @@ -30,7 +30,7 @@ def get_converted_magnitude(magnitude_expr, evaluation: Evaluation) -> float: """ - The Pythion "pint" library mixes in a Python numeric value as a multiplier inside + The Python "pint" library mixes in a Python numeric value as a multiplier inside a Mathics Expression. here we pick out that multiplier and convert it from a Python numeric to a Mathics numeric. """ From f1ec05e8a7b1fe0ba35d8e08c1ef548d496e074c Mon Sep 17 00:00:00 2001 From: Lucien Grondin Date: Wed, 4 Jan 2023 15:09:50 +0100 Subject: [PATCH 018/209] fix wp link --- mathics/core/parser/README.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/mathics/core/parser/README.md b/mathics/core/parser/README.md index 15c0c6673..2eaaf48bd 100644 --- a/mathics/core/parser/README.md +++ b/mathics/core/parser/README.md @@ -4,8 +4,7 @@ The Mathics parser is an operator precedence parser that implements the precedence climbing method. The AST (Abstract Syntax -Tree) produced after parsing is a kind of [M-expression](M-expression - Date: Wed, 4 Jan 2023 16:36:08 -0500 Subject: [PATCH 019/209] Move more functions out of misc list... More eval-like code moved into eval. --- mathics/builtin/distance/clusters.py | 511 ++++++ mathics/builtin/list/predicates.py | 113 ++ mathics/builtin/list/rearrange.py | 497 +++++- mathics/builtin/lists.py | 2272 +++++++------------------- mathics/core/systemsymbols.py | 4 + mathics/eval/distance.py | 43 + mathics/format/asy.py | 17 + 7 files changed, 1759 insertions(+), 1698 deletions(-) create mode 100644 mathics/builtin/distance/clusters.py create mode 100644 mathics/builtin/list/predicates.py create mode 100644 mathics/eval/distance.py diff --git a/mathics/builtin/distance/clusters.py b/mathics/builtin/distance/clusters.py new file mode 100644 index 000000000..77d0e1714 --- /dev/null +++ b/mathics/builtin/distance/clusters.py @@ -0,0 +1,511 @@ +""" +Cluster Analysis +""" + +import heapq + +from mathics.algorithm.clusters import ( + AutomaticMergeCriterion, + AutomaticSplitCriterion, + LazyDistances, + PrecomputedDistances, + agglomerate, + kmeans, + optimize, +) +from mathics.algorithm.parts import walk_levels +from mathics.builtin.base import Builtin +from mathics.builtin.options import options_to_rules +from mathics.core.atoms import Integer, Real, String, machine_precision, min_prec +from mathics.core.convert.expression import to_mathics_list +from mathics.core.expression import Expression +from mathics.core.list import ListExpression +from mathics.core.symbols import Symbol, strip_context +from mathics.core.systemsymbols import ( + SymbolClusteringComponents, + SymbolFailed, + SymbolFindClusters, + SymbolRule, +) +from mathics.eval.distance import ( + IllegalDataPoint, + IllegalDistance, + dist_repr, + to_real_distance, +) +from mathics.eval.nevaluator import eval_N + + +class _LazyDistances(LazyDistances): + # computes single distances only as needed, caches already computed distances. + + def __init__(self, df, p, evaluation): + super(_LazyDistances, self).__init__() + self._df = df + self._p = p + self._evaluation = evaluation + + def _compute_distance(self, i, j): + p = self._p + d = eval_N(self._df(p[i], p[j]), self._evaluation) + return to_real_distance(d) + + +class _PrecomputedDistances(PrecomputedDistances): + # computes all n^2 distances for n points with one big evaluation in the beginning. + + def __init__(self, df, p, evaluation): + distances_form = [df(p[i], p[j]) for i in range(len(p)) for j in range(i)] + distances = eval_N(ListExpression(*distances_form), evaluation) + mpmath_distances = [to_real_distance(d) for d in distances.elements] + super(_PrecomputedDistances, self).__init__(mpmath_distances) + + +class _Cluster(Builtin): + options = { + "Method": "Optimize", + "DistanceFunction": "Automatic", + "RandomSeed": "Automatic", + } + + messages = { + "amtd": "`1` failed to pick a suitable distance function for `2`.", + "bdmtd": 'Method in `` must be either "Optimize", "Agglomerate" or "KMeans".', + "intpm": "Positive integer expected at position 2 in ``.", + "list": "Expected a list or a rule with equally sized lists at position 1 in ``.", + "nclst": "Cannot find more clusters than there are elements: `1` is larger than `2`.", + "xnum": "The distance function returned ``, which is not a non-negative real value.", + "rseed": "The random seed specified through `` must be an integer or Automatic.", + "kmsud": "KMeans only supports SquaredEuclideanDistance as distance measure.", + } + + _criteria = { + "Optimize": AutomaticSplitCriterion, + "Agglomerate": AutomaticMergeCriterion, + "KMeans": None, + } + + def _cluster(self, p, k, mode, evaluation, options, expr): + method_string, method = self.get_option_string(options, "Method", evaluation) + if method_string not in ("Optimize", "Agglomerate", "KMeans"): + evaluation.message( + self.get_name(), "bdmtd", Expression(SymbolRule, "Method", method) + ) + return + + dist_p, repr_p = dist_repr(p) + + if dist_p is None or len(dist_p) != len(repr_p): + evaluation.message(self.get_name(), "list", expr) + return + + if not dist_p: + return ListExpression() + + if k is not None: # the number of clusters k is specified as an integer. + if not isinstance(k, Integer): + evaluation.message(self.get_name(), "intpm", expr) + return + py_k = k.get_int_value() + if py_k < 1: + evaluation.message(self.get_name(), "intpm", expr) + return + if py_k > len(dist_p): + evaluation.message(self.get_name(), "nclst", py_k, len(dist_p)) + return + elif py_k == 1: + return ListExpression(*repr_p) + elif py_k == len(dist_p): + return ListExpression(*[ListExpression(q) for q in repr_p]) + else: # automatic detection of k. choose a suitable method here. + if len(dist_p) <= 2: + return ListExpression(*repr_p) + constructor = self._criteria.get(method_string) + py_k = (constructor, {}) if constructor else None + + seed_string, seed = self.get_option_string(options, "RandomSeed", evaluation) + if seed_string == "Automatic": + py_seed = 12345 + elif isinstance(seed, Integer): + py_seed = seed.get_int_value() + else: + evaluation.message( + self.get_name(), "rseed", Expression(SymbolRule, "RandomSeed", seed) + ) + return + + distance_function_string, distance_function = self.get_option_string( + options, "DistanceFunction", evaluation + ) + if distance_function_string == "Automatic": + from mathics.builtin.tensors import get_default_distance + + distance_function = get_default_distance(dist_p) + if distance_function is None: + name_of_builtin = strip_context(self.get_name()) + evaluation.message( + self.get_name(), + "amtd", + name_of_builtin, + ListExpression(*dist_p), + ) + return + if method_string == "KMeans" and distance_function is not Symbol( + "SquaredEuclideanDistance" + ): + evaluation.message(self.get_name(), "kmsud") + return + + def df(i, j) -> Expression: + return Expression(distance_function, i, j) + + try: + if method_string == "Agglomerate": + clusters = self._agglomerate(mode, repr_p, dist_p, py_k, df, evaluation) + elif method_string == "Optimize": + clusters = optimize( + repr_p, py_k, _LazyDistances(df, dist_p, evaluation), mode, py_seed + ) + elif method_string == "KMeans": + clusters = self._kmeans(mode, repr_p, dist_p, py_k, py_seed, evaluation) + except IllegalDistance as e: + evaluation.message(self.get_name(), "xnum", e.distance) + return + except IllegalDataPoint: + name_of_builtin = strip_context(self.get_name()) + evaluation.message( + self.get_name(), + "amtd", + name_of_builtin, + ListExpression(*dist_p), + ) + return + + if mode == "clusters": + return ListExpression(*[ListExpression(*c) for c in clusters]) + elif mode == "components": + return to_mathics_list(*clusters) + else: + raise ValueError("illegal mode %s" % mode) + + def _agglomerate(self, mode, repr_p, dist_p, py_k, df, evaluation): + if mode == "clusters": + clusters = agglomerate( + repr_p, py_k, _PrecomputedDistances(df, dist_p, evaluation), mode + ) + elif mode == "components": + clusters = agglomerate( + repr_p, py_k, _PrecomputedDistances(df, dist_p, evaluation), mode + ) + + return clusters + + def _kmeans(self, mode, repr_p, dist_p, py_k, py_seed, evaluation): + items = [] + + def convert_scalars(p): + for q in p: + if not isinstance(q, (Real, Integer)): + raise IllegalDataPoint + mpq = q.to_mpmath() + if mpq is None: + raise IllegalDataPoint + items.append(q) + yield mpq + + def convert_vectors(p): + d = None + for q in p: + if q.get_head_name() != "System`List": + raise IllegalDataPoint + v = list(convert_scalars(q.elements)) + if d is None: + d = len(v) + elif len(v) != d: + raise IllegalDataPoint + yield v + + if dist_p[0].is_numeric(evaluation): + numeric_p = [[x] for x in convert_scalars(dist_p)] + else: + numeric_p = list(convert_vectors(dist_p)) + + # compute epsilon similar to Real.__eq__, such that "numbers that differ in their last seven binary digits + # are considered equal" + + prec = min_prec(*items) or machine_precision + eps = 0.5 ** (prec - 7) + + return kmeans(numeric_p, repr_p, py_k, mode, py_seed, eps) + + +class ClusteringComponents(_Cluster): + """ + :WMA link:https://reference.wolfram.com/language/ref/ClusteringComponents.html + +
+
'ClusteringComponents[$list$]' +
forms clusters from $list$ and returns a list of cluster indices, in which each + element shows the index of the cluster in which the corresponding element in $list$ + ended up. +
'ClusteringComponents[$list$, $k$]' +
forms $k$ clusters from $list$ and returns a list of cluster indices, in which + each element shows the index of the cluster in which the corresponding element in + $list$ ended up. +
+ + For more detailed documentation regarding options and behavior, see FindClusters[]. + + >> ClusteringComponents[{1, 2, 3, 1, 2, 10, 100}] + = {1, 1, 1, 1, 1, 1, 2} + + >> ClusteringComponents[{10, 100, 20}, Method -> "KMeans"] + = {1, 0, 1} + """ + + summary_text = "label data with the index of the cluster it is in" + + def eval(self, p, evaluation, options): + "ClusteringComponents[p_, OptionsPattern[%(name)s]]" + return self._cluster( + p, + None, + "components", + evaluation, + options, + Expression(SymbolClusteringComponents, p, *options_to_rules(options)), + ) + + def eval_manual_k(self, p, k: Integer, evaluation, options): + "ClusteringComponents[p_, k_Integer, OptionsPattern[%(name)s]]" + return self._cluster( + p, + k, + "components", + evaluation, + options, + Expression(SymbolClusteringComponents, p, k, *options_to_rules(options)), + ) + + +class FindClusters(_Cluster): + """ + :WMA link:https://reference.wolfram.com/language/ref/FindClusters.html + +
+
'FindClusters[$list$]' +
returns a list of clusters formed from the elements of $list$. The number of cluster is determined + automatically. +
'FindClusters[$list$, $k$]' +
returns a list of $k$ clusters formed from the elements of $list$. +
+ + >> FindClusters[{1, 2, 20, 10, 11, 40, 19, 42}] + = {{1, 2, 20, 10, 11, 19}, {40, 42}} + + >> FindClusters[{25, 100, 17, 20}] + = {{25, 17, 20}, {100}} + + >> FindClusters[{3, 6, 1, 100, 20, 5, 25, 17, -10, 2}] + = {{3, 6, 1, 5, -10, 2}, {100}, {20, 25, 17}} + + >> FindClusters[{1, 2, 10, 11, 20, 21}] + = {{1, 2}, {10, 11}, {20, 21}} + + >> FindClusters[{1, 2, 10, 11, 20, 21}, 2] + = {{1, 2, 10, 11}, {20, 21}} + + >> FindClusters[{1 -> a, 2 -> b, 10 -> c}] + = {{a, b}, {c}} + + >> FindClusters[{1, 2, 5} -> {a, b, c}] + = {{a, b}, {c}} + + >> FindClusters[{1, 2, 3, 1, 2, 10, 100}, Method -> "Agglomerate"] + = {{1, 2, 3, 1, 2, 10}, {100}} + + >> FindClusters[{1, 2, 3, 10, 17, 18}, Method -> "Agglomerate"] + = {{1, 2, 3}, {10}, {17, 18}} + + >> FindClusters[{{1}, {5, 6}, {7}, {2, 4}}, DistanceFunction -> (Abs[Length[#1] - Length[#2]]&)] + = {{{1}, {7}}, {{5, 6}, {2, 4}}} + + >> FindClusters[{"meep", "heap", "deep", "weep", "sheep", "leap", "keep"}, 3] + = {{meep, deep, weep, keep}, {heap, leap}, {sheep}} + + FindClusters' automatic distance function detection supports scalars, numeric tensors, boolean vectors and + strings. + + The Method option must be either "Agglomerate" or "Optimize". If not specified, it defaults to "Optimize". + Note that the Agglomerate and Optimize methods usually produce different clusterings. + + The runtime of the Agglomerate method is quadratic in the number of clustered points n, builds the clustering + from the bottom up, and is exact (no element of randomness). The Optimize method's runtime is linear in n, + Optimize builds the clustering from top down, and uses random sampling. + """ + + summary_text = "divide data into lists of similar elements" + + def eval(self, p, evaluation, options): + "FindClusters[p_, OptionsPattern[%(name)s]]" + return self._cluster( + p, + None, + "clusters", + evaluation, + options, + Expression(SymbolFindClusters, p, *options_to_rules(options)), + ) + + def eval_manual_k(self, p, k: Integer, evaluation, options): + "FindClusters[p_, k_Integer, OptionsPattern[%(name)s]]" + return self._cluster( + p, + k, + "clusters", + evaluation, + options, + Expression(SymbolFindClusters, p, k, *options_to_rules(options)), + ) + + +class Nearest(Builtin): + """ + :WMA link:https://reference.wolfram.com/language/ref/Nearest.html + +
+
'Nearest[$list$, $x$]' +
returns the one item in $list$ that is nearest to $x$. + +
'Nearest[$list$, $x$, $n$]' +
returns the $n$ nearest items. + +
'Nearest[$list$, $x$, {$n$, $r$}]' +
returns up to $n$ nearest items that are not farther from $x$ than $r$. + +
'Nearest[{$p1$ -> $q1$, $p2$ -> $q2$, ...}, $x$]' +
returns $q1$, $q2$, ... but measures the distances using $p1$, $p2$, ... + +
'Nearest[{$p1$, $p2$, ...} -> {$q1$, $q2$, ...}, $x$]' +
returns $q1$, $q2$, ... but measures the distances using $p1$, $p2$, ... +
+ + >> Nearest[{5, 2.5, 10, 11, 15, 8.5, 14}, 12] + = {11} + + Return all items within a distance of 5: + + >> Nearest[{5, 2.5, 10, 11, 15, 8.5, 14}, 12, {All, 5}] + = {11, 10, 14} + + >> Nearest[{Blue -> "blue", White -> "white", Red -> "red", Green -> "green"}, {Orange, Gray}] + = {{red}, {white}} + + >> Nearest[{{0, 1}, {1, 2}, {2, 3}} -> {a, b, c}, {1.1, 2}] + = {b} + """ + + messages = { + "amtd": "`1` failed to pick a suitable distance function for `2`.", + "list": "Expected a list or a rule with equally sized lists at position 1 in ``.", + "nimp": "Method `1` is not implemented yet.", + } + + options = { + "DistanceFunction": "Automatic", + "Method": '"Scan"', + } + + rules = { + "Nearest[list_, pattern_]": "Nearest[list, pattern, 1]", + "Nearest[pattern_][list_]": "Nearest[list, pattern]", + } + summary_text = "the nearest element from a list" + + def eval(self, items, pivot, limit, expression, evaluation, options): + "Nearest[items_, pivot_, limit_, OptionsPattern[%(name)s]]" + + method = self.get_option(options, "Method", evaluation) + if not isinstance(method, String) or method.get_string_value() != "Scan": + evaluation("Nearest", "nimp", method) + return + + dist_p, repr_p = dist_repr(items) + + if dist_p is None or len(dist_p) != len(repr_p): + evaluation.message(self.get_name(), "list", expression) + return + + if limit.has_form("List", 2): + up_to = limit.elements[0] + py_r = limit.elements[1].to_mpmath() + else: + up_to = limit + py_r = None + + if isinstance(up_to, Integer): + py_n = up_to.get_int_value() + elif up_to.get_name() == "System`All": + py_n = None + else: + return + + if not dist_p or (py_n is not None and py_n < 1): + return ListExpression() + + multiple_x = False + + distance_function_string, distance_function = self.get_option_string( + options, "DistanceFunction", evaluation + ) + if distance_function_string == "Automatic": + from mathics.builtin.tensors import get_default_distance + + distance_function = get_default_distance(dist_p) + if distance_function is None: + evaluation.message( + self.get_name(), "amtd", "Nearest", ListExpression(*dist_p) + ) + return + + if pivot.get_head_name() == "System`List": + _, depth_x = walk_levels(pivot) + _, depth_items = walk_levels(dist_p[0]) + + if depth_x > depth_items: + multiple_x = True + + def nearest(x) -> ListExpression: + calls = [Expression(distance_function, x, y) for y in dist_p] + distances = ListExpression(*calls).evaluate(evaluation) + + if not distances.has_form("List", len(dist_p)): + raise ValueError() + + py_distances = [ + (to_real_distance(d), i) for i, d in enumerate(distances.elements) + ] + + if py_r is not None: + py_distances = [(d, i) for d, i in py_distances if d <= py_r] + + def pick(): + if py_n is None: + candidates = sorted(py_distances) + else: + candidates = heapq.nsmallest(py_n, py_distances) + + for d, i in candidates: + yield repr_p[i] + + return ListExpression(*list(pick())) + + try: + if not multiple_x: + return nearest(pivot) + else: + return ListExpression(*[nearest(t) for t in pivot.elements]) + except IllegalDistance: + return SymbolFailed + except ValueError: + return SymbolFailed diff --git a/mathics/builtin/list/predicates.py b/mathics/builtin/list/predicates.py new file mode 100644 index 000000000..056a97156 --- /dev/null +++ b/mathics/builtin/list/predicates.py @@ -0,0 +1,113 @@ +""" +Predicates on Lists +""" + +from mathics.builtin.base import Builtin +from mathics.builtin.options import options_to_rules +from mathics.core.attributes import A_PROTECTED, A_READ_PROTECTED +from mathics.core.expression import Expression +from mathics.core.list import ListExpression +from mathics.core.symbols import Symbol, SymbolFalse, SymbolTrue +from mathics.core.systemsymbols import SymbolContainsOnly + + +class ContainsOnly(Builtin): + """ + + :WMA link: + https://reference.wolfram.com/language/ref/ContainsOnly.html + +
+
'ContainsOnly[$list1$, $list2$]' +
yields True if $list1$ contains only elements that appear in $list2$. +
+ + >> ContainsOnly[{b, a, a}, {a, b, c}] + = True + + The first list contains elements not present in the second list: + >> ContainsOnly[{b, a, d}, {a, b, c}] + = False + + >> ContainsOnly[{}, {a, b, c}] + = True + + #> ContainsOnly[1, {1, 2, 3}] + : List or association expected instead of 1. + = ContainsOnly[1, {1, 2, 3}] + + #> ContainsOnly[{1, 2, 3}, 4] + : List or association expected instead of 4. + = ContainsOnly[{1, 2, 3}, 4] + + Use Equal as the comparison function to have numerical tolerance: + >> ContainsOnly[{a, 1.0}, {1, a, b}, {SameTest -> Equal}] + = True + + #> ContainsOnly[{c, a}, {a, b, c}, IgnoreCase -> True] + : Unknown option IgnoreCase -> True in ContainsOnly. + : Unknown option IgnoreCase in . + = True + """ + + attributes = A_PROTECTED | A_READ_PROTECTED + + messages = { + "lsa": "List or association expected instead of `1`.", + "nodef": "Unknown option `1` for ContainsOnly.", + "optx": "Unknown option `1` in `2`.", + } + + options = { + "SameTest": "SameQ", + } + + summary_text = "test if all the elements of a list appears into another list" + + def check_options(self, expr, evaluation, options): + for key in options: + if key != "System`SameTest": + if expr is None: + evaluation.message("ContainsOnly", "optx", Symbol(key)) + else: + return evaluation.message("ContainsOnly", "optx", Symbol(key), expr) + return None + + def eval(self, list1, list2, evaluation, options={}): + "ContainsOnly[list1_List, list2_List, OptionsPattern[ContainsOnly]]" + + same_test = self.get_option(options, "SameTest", evaluation) + + def sameQ(a, b) -> bool: + """Mathics SameQ""" + result = Expression(same_test, a, b).evaluate(evaluation) + return result is SymbolTrue + + self.check_options(None, evaluation, options) + for a in list1.elements: + if not any(sameQ(a, b) for b in list2.elements): + return SymbolFalse + return SymbolTrue + + def eval_msg(self, e1, e2, evaluation, options={}): + "ContainsOnly[e1_, e2_, OptionsPattern[ContainsOnly]]" + + opts = ( + options_to_rules(options) + if len(options) <= 1 + else [ListExpression(*options_to_rules(options))] + ) + expr = Expression(SymbolContainsOnly, e1, e2, *opts) + + if not isinstance(e1, Symbol) and not e1.has_form("List", None): + evaluation.message("ContainsOnly", "lsa", e1) + return self.check_options(expr, evaluation, options) + + if not isinstance(e2, Symbol) and not e2.has_form("List", None): + evaluation.message("ContainsOnly", "lsa", e2) + return self.check_options(expr, evaluation, options) + + return self.check_options(expr, evaluation, options) + + +# TODO: ContainsAll, ContainsNone ContainsAny ContainsExactly diff --git a/mathics/builtin/list/rearrange.py b/mathics/builtin/list/rearrange.py index 6650ab103..b57cd3a87 100644 --- a/mathics/builtin/list/rearrange.py +++ b/mathics/builtin/list/rearrange.py @@ -11,12 +11,13 @@ from typing import Callable from mathics.builtin.base import Builtin, MessageException -from mathics.core.atoms import Integer +from mathics.core.atoms import Integer, Integer0 from mathics.core.attributes import A_FLAT, A_ONE_IDENTITY, A_PROTECTED +from mathics.core.evaluation import Evaluation from mathics.core.expression import Expression, structure from mathics.core.list import ListExpression from mathics.core.symbols import Atom, Symbol, SymbolTrue -from mathics.core.systemsymbols import SymbolMap +from mathics.core.systemsymbols import SymbolMap, SymbolSplit SymbolReverse = Symbol("Reverse") @@ -39,22 +40,23 @@ def _is_sameq(same_test): class _FastEquivalence: - # models an equivalence relation through SameQ. for n distinct elements (each - # in its own bin), we expect to make O(n) comparisons (if the hash function - # does not fail us by distributing items very unevenly). - - # IMPORTANT NOTE ON ATOM'S HASH FUNCTIONS / this code relies on this assumption: - # - # if SameQ[a, b] == true then hash(a) == hash(b) - # - # more specifically, this code bins items based on their hash code, and only if - # the hash code matches, is SameQ evoked. - # - # this assumption has been checked for these types: Integer, Real, Complex, - # String, Rational (*), Expression, Image; new atoms need proper hash functions - # - # (*) Rational values are sympy Rationals which are always held in reduced form - # and thus are hashed correctly (see sympy/core/number.py:Rational.__eq__()). + """ + Models an equivalence relation using SameQ. for n distinct elements (each + in its own bin), we expect to make O(n) comparisons (if the hash function + does not fail us by distributing items very unevenly). + + IMPORTANT NOTE ON ATOM'S HASH FUNCTIONS / this code relies on this assumption: + if SameQ[a, b] == true then hash(a) == hash(b) + + Specifically, this code bins items based on their hash code, and only if + the hash code matches, is SameQ evoked. + + This assumption has been checked for these types: Integer, Real, Complex, + String, Rational (*), Expression, Image; new atoms need proper hash functions + + (*) Rational values are sympy Rationals which are always held in reduced form + and thus are hashed correctly (see sympy/core/number.py:Rational.__eq__()). + """ def __init__(self): self._hashes = defaultdict(list) @@ -67,6 +69,195 @@ def sameQ(self, a, b) -> bool: return a.sameQ(b) +class _IllegalPaddingDepth(Exception): + def __init__(self, level): + self.level = level + + +class _Pad(Builtin): + messages = { + "normal": "Expression at position 1 in `` must not be an atom.", + "level": "Cannot pad list `3` which has `4` using padding `1` which specifies `2`.", + "ilsm": "Expected an integer or a list of integers at position `1` in `2`.", + } + + rules = {"%(name)s[l_]": "%(name)s[l, Automatic]"} + + @staticmethod + def _find_dims(expr): + def dive(expr, level): + if isinstance(expr, Expression): + if expr.elements: + return max(dive(x, level + 1) for x in expr.elements) + else: + return level + 1 + else: + return level + + def calc(expr, dims, level): + if isinstance(expr, Expression): + for x in expr.elements: + calc(x, dims, level + 1) + dims[level] = max(dims[level], len(expr.elements)) + + dims = [0] * dive(expr, 0) + calc(expr, dims, 0) + return dims + + @staticmethod + def _build( + element, n, x, m, level, mode + ): # mode < 0 for left pad, > 0 for right pad + if not n: + return element + if not isinstance(element, Expression): + raise _IllegalPaddingDepth(level) + + if isinstance(m, (list, tuple)): + current_m = m[0] if m else 0 + next_m = m[1:] + else: + current_m = m + next_m = m + + def clip(a, d, s): + assert d != 0 + if s < 0: + return a[-d:] # end with a[-1] + else: + return a[:d] # start with a[0] + + def padding(amount, sign): + if amount == 0: + return [] + elif len(n) > 1: + return [ + _Pad._build(ListExpression(), n[1:], x, next_m, level + 1, mode) + ] * amount + else: + return clip(x * (1 + amount // len(x)), amount, sign) + + elements = element.elements + d = n[0] - len(elements) + if d < 0: + new_elements = clip(elements, d, mode) + padding_main = [] + elif d >= 0: + new_elements = elements + padding_main = padding(d, mode) + + if current_m > 0: + padding_margin = padding( + min(current_m, len(new_elements) + len(padding_main)), -mode + ) + + if len(padding_margin) > len(padding_main): + padding_main = [] + new_elements = clip( + new_elements, -(len(padding_margin) - len(padding_main)), mode + ) + elif len(padding_margin) > 0: + padding_main = clip(padding_main, -len(padding_margin), mode) + else: + padding_margin = [] + + if len(n) > 1: + new_elements = ( + _Pad._build(e, n[1:], x, next_m, level + 1, mode) for e in new_elements + ) + + if mode < 0: + parts = (padding_main, new_elements, padding_margin) + else: + parts = (padding_margin, new_elements, padding_main) + + return Expression(element.get_head(), *list(chain(*parts))) + + def _pad(self, in_l, in_n, in_x, in_m, evaluation, expr): + if not isinstance(in_l, Expression): + evaluation.message(self.get_name(), "normal", expr()) + return + + py_n = None + if isinstance(in_n, Symbol) and in_n.get_name() == "System`Automatic": + py_n = _Pad._find_dims(in_l) + elif in_n.get_head_name() == "System`List": + if all(isinstance(element, Integer) for element in in_n.elements): + py_n = [element.get_int_value() for element in in_n.elements] + elif isinstance(in_n, Integer): + py_n = [in_n.get_int_value()] + + if py_n is None: + evaluation.message(self.get_name(), "ilsm", 2, expr()) + return + + if in_x.get_head_name() == "System`List": + py_x = in_x.elements + else: + py_x = [in_x] + + if isinstance(in_m, Integer): + py_m = in_m.get_int_value() + else: + if not all(isinstance(x, Integer) for x in in_m.elements): + evaluation.message(self.get_name(), "ilsm", 4, expr()) + return + py_m = [x.get_int_value() for x in in_m.elements] + + try: + return _Pad._build(in_l, py_n, py_x, py_m, 1, self._mode) + except _IllegalPaddingDepth as e: + + def levels(k): + if k == 1: + return "1 level" + else: + return "%d levels" % k + + evaluation.message( + self.get_name(), + "level", + in_n, + levels(len(py_n)), + in_l, + levels(e.level - 1), + ) + return None + + def eval_zero(self, element, n, evaluation): + "%(name)s[element_, n_]" + return self._pad( + element, + n, + Integer0, + Integer0, + evaluation, + lambda: Expression(self.get_name(), element, n), + ) + + def eval(self, element, n, x, evaluation): + "%(name)s[element_, n_, x_]" + return self._pad( + element, + n, + x, + Integer0, + evaluation, + lambda: Expression(self.get_name(), element, n, x), + ) + + def eval_margin(self, element, n, x, m, evaluation): + "%(name)s[element_, n_, x_, m_]" + return self._pad( + element, + n, + x, + m, + evaluation, + lambda: Expression(self.get_name(), element, n, x, m), + ) + + class _SlowEquivalence: # models an equivalence relation through a user defined test function. for n # distinct elements (each in its own bin), we need sum(1, .., n - 1) = O(n^2) @@ -117,7 +308,7 @@ class _GatherOperation(Builtin): ), } - def apply(self, values, test, evaluation): + def apply(self, values, test, evaluation: Evaluation): "%(name)s[values_, test_]" if not self._check_list(values, test, evaluation): return @@ -129,7 +320,7 @@ def apply(self, values, test, evaluation): values, values, _SlowEquivalence(test, evaluation, self.get_name()) ) - def _check_list(self, values, arg2, evaluation): + def _check_list(self, values, arg2, evaluation: Evaluation): if isinstance(values, Atom): expr = Expression(Symbol(self.get_name()), values, arg2) evaluation.message(self.get_name(), "normal", 1, expr) @@ -163,7 +354,7 @@ def _gather(self, keys, values, equivalence): class _Rotate(Builtin): messages = {"rspec": "`` should be an integer or a list of integers."} - def _rotate(self, expr, n, evaluation): + def _rotate(self, expr, n, evaluation: Evaluation): if not isinstance(expr, Expression): return expr @@ -181,11 +372,11 @@ def _rotate(self, expr, n, evaluation): return expr.restructure(expr.head, new_elements, evaluation) - def apply_one(self, expr, evaluation): + def apply_one(self, expr, evaluation: Evaluation): "%(name)s[expr_]" return self._rotate(expr, [1], evaluation) - def apply(self, expr, n, evaluation): + def apply(self, expr, n, evaluation: Evaluation): "%(name)s[expr_, n_]" if isinstance(n, Integer): py_cycles = [n.get_int_value()] @@ -296,7 +487,7 @@ class Catenate(Builtin): summary_text = "catenate elements from a list of lists" messages = {"invrp": "`1` is not a list."} - def apply(self, lists, evaluation): + def apply(self, lists, evaluation: Evaluation): "Catenate[lists_List]" def parts(): @@ -424,14 +615,19 @@ class Gather(_GatherOperation): class GatherBy(_GatherOperation): """ - :WMA link:https://reference.wolfram.com/language/ref/GatherBy.html + + :WMA link: + https://reference.wolfram.com/language/ref/GatherBy.html
'GatherBy[$list$, $f$]' -
gathers elements of $list$ into sub lists of items whose image under $f$ identical. +
gathers elements of $list$ into sub lists of items whose image \ + under $f$ identical.
'GatherBy[$list$, {$f$, $g$, ...}]' -
gathers elements of $list$ into sub lists of items whose image under $f$ identical. Then, gathers these sub lists again into sub sub lists, that are identical under $g. +
gathers elements of $list$ into sub lists of items whose image \ + under $f$ identical. Then, gathers these sub lists again into sub \ + sub lists, that are identical under $g.
>> GatherBy[{{1, 3}, {2, 2}, {1, 1}}, Total] @@ -455,7 +651,7 @@ class GatherBy(_GatherOperation): summary_text = "gather based on values of a function applied to elements" _bin = _GatherBin - def apply(self, values, func, evaluation): + def apply(self, values, func, evaluation: Evaluation): "%(name)s[values_, func_]" if not self._check_list(values, func, evaluation): @@ -470,7 +666,9 @@ def apply(self, values, func, evaluation): class Join(Builtin): """ - :WMA link:https://reference.wolfram.com/language/ref/Join.html + + :WMA link: + https://reference.wolfram.com/language/ref/Join.html
'Join[$l1$, $l2$]' @@ -506,7 +704,7 @@ class Join(Builtin): attributes = A_FLAT | A_ONE_IDENTITY | A_PROTECTED summary_text = "join lists together at any level" - def apply(self, lists, evaluation): + def apply(self, lists, evaluation: Evaluation): "Join[lists___]" result = [] @@ -528,6 +726,82 @@ def apply(self, lists, evaluation): return ListExpression() +class PadLeft(_Pad): + """ + :WMA link:https://reference.wolfram.com/language/ref/PadLeft.html + +
+
'PadLeft[$list$, $n$]' +
pads $list$ to length $n$ by adding 0 on the left. +
'PadLeft[$list$, $n$, $x$]' +
pads $list$ to length $n$ by adding $x$ on the left. +
'PadLeft[$list$, {$n1$, $n2, ...}, $x$]' +
pads $list$ to lengths $n1$, $n2$ at levels 1, 2, ... respectively by adding $x$ on the left. +
'PadLeft[$list$, $n$, $x$, $m$]' +
pads $list$ to length $n$ by adding $x$ on the left and adding a margin of $m$ on the right. +
'PadLeft[$list$, $n$, $x$, {$m1$, $m2$, ...}]' +
pads $list$ to length $n$ by adding $x$ on the left and adding margins of $m1$, $m2$, ... + on levels 1, 2, ... on the right. +
'PadLeft[$list$]' +
turns the ragged list $list$ into a regular list by adding 0 on the left. +
+ + >> PadLeft[{1, 2, 3}, 5] + = {0, 0, 1, 2, 3} + >> PadLeft[x[a, b, c], 5] + = x[0, 0, a, b, c] + >> PadLeft[{1, 2, 3}, 2] + = {2, 3} + >> PadLeft[{{}, {1, 2}, {1, 2, 3}}] + = {{0, 0, 0}, {0, 1, 2}, {1, 2, 3}} + >> PadLeft[{1, 2, 3}, 10, {a, b, c}, 2] + = {b, c, a, b, c, 1, 2, 3, a, b} + >> PadLeft[{{1, 2, 3}}, {5, 2}, x, 1] + = {{x, x}, {x, x}, {x, x}, {3, x}, {x, x}} + """ + + _mode = -1 + summary_text = "pad out by the left a ragged array to make a matrix" + + +class PadRight(_Pad): + """ + :WMA link:https://reference.wolfram.com/language/ref/PadRight.html + +
+
'PadRight[$list$, $n$]' +
pads $list$ to length $n$ by adding 0 on the right. +
'PadRight[$list$, $n$, $x$]' +
pads $list$ to length $n$ by adding $x$ on the right. +
'PadRight[$list$, {$n1$, $n2, ...}, $x$]' +
pads $list$ to lengths $n1$, $n2$ at levels 1, 2, ... respectively by adding $x$ on the right. +
'PadRight[$list$, $n$, $x$, $m$]' +
pads $list$ to length $n$ by adding $x$ on the left and adding a margin of $m$ on the left. +
'PadRight[$list$, $n$, $x$, {$m1$, $m2$, ...}]' +
pads $list$ to length $n$ by adding $x$ on the right and adding margins of $m1$, $m2$, ... + on levels 1, 2, ... on the left. +
'PadRight[$list$]' +
turns the ragged list $list$ into a regular list by adding 0 on the right. +
+ + >> PadRight[{1, 2, 3}, 5] + = {1, 2, 3, 0, 0} + >> PadRight[x[a, b, c], 5] + = x[a, b, c, 0, 0] + >> PadRight[{1, 2, 3}, 2] + = {1, 2} + >> PadRight[{{}, {1, 2}, {1, 2, 3}}] + = {{0, 0, 0}, {1, 2, 0}, {1, 2, 3}} + >> PadRight[{1, 2, 3}, 10, {a, b, c}, 2] + = {b, c, 1, 2, 3, a, b, c, a, b} + >> PadRight[{{1, 2, 3}}, {5, 2}, x, 1] + = {{x, x}, {x, 1}, {x, x}, {x, x}, {x, x}} + """ + + _mode = 1 + summary_text = "pad out by the right a ragged array to make a matrix" + + class Partition(Builtin): """ :WMA link:https://reference.wolfram.com/language/ref/Partition.html @@ -560,7 +834,7 @@ class Partition(Builtin): "Parition[list_, n_, d_, k]": "Partition[list, n, d, {k, k}]", } - def _partition(self, expr, n, d, evaluation): + def _partition(self, expr, n, d, evaluation: Evaluation): assert n > 0 and d > 0 inner = structure("List", expr, evaluation) @@ -581,12 +855,12 @@ def slices(): return outer(slices()) - def apply_no_overlap(self, li, n, evaluation): + def apply_no_overlap(self, li, n, evaluation: Evaluation): "Partition[li_List, n_Integer]" # TODO: Error checking return self._partition(li, n.get_int_value(), n.get_int_value(), evaluation) - def apply(self, li, n, d, evaluation): + def apply(self, li, n, d, evaluation: Evaluation): "Partition[li_List, n_Integer, d_Integer]" # TODO: Error checking return self._partition(li, n.get_int_value(), d.get_int_value(), evaluation) @@ -655,11 +929,11 @@ def _reverse( return expr - def apply_top_level(self, expr, evaluation): + def apply_top_level(self, expr, evaluation: Evaluation): "Reverse[expr_]" return Reverse._reverse(expr, 1, (1,), evaluation) - def apply(self, expr, levels, evaluation): + def apply(self, expr, levels, evaluation: Evaluation): "Reverse[expr_, levels_]" if isinstance(levels, Integer): py_levels = [levels.get_int_value()] @@ -733,7 +1007,7 @@ class Riffle(Builtin): summary_text = "intersperse additional elements" - def apply(self, list, sep, evaluation): + def apply(self, list, sep, evaluation: Evaluation): "Riffle[list_List, sep_]" if sep.has_form("List", None): @@ -802,6 +1076,150 @@ class RotateRight(_Rotate): _sign = -1 +class Split(Builtin): + """ + :WMA link:https://reference.wolfram.com/language/ref/Split.html + +
+
'Split[$list$]' +
splits $list$ into collections of consecutive identical elements. +
'Split[$list$, $test$]' +
splits $list$ based on whether the function $test$ yields + 'True' on consecutive elements. +
+ + >> Split[{x, x, x, y, x, y, y, z}] + = {{x, x, x}, {y}, {x}, {y, y}, {z}} + + #> Split[{x, x, x, y, x, y, y, z}, x] + = {{x}, {x}, {x}, {y}, {x}, {y}, {y}, {z}} + + Split into increasing or decreasing runs of elements + >> Split[{1, 5, 6, 3, 6, 1, 6, 3, 4, 5, 4}, Less] + = {{1, 5, 6}, {3, 6}, {1, 6}, {3, 4, 5}, {4}} + + >> Split[{1, 5, 6, 3, 6, 1, 6, 3, 4, 5, 4}, Greater] + = {{1}, {5}, {6, 3}, {6, 1}, {6, 3}, {4}, {5, 4}} + + Split based on first element + >> Split[{x -> a, x -> y, 2 -> a, z -> c, z -> a}, First[#1] === First[#2] &] + = {{x -> a, x -> y}, {2 -> a}, {z -> c, z -> a}} + + #> Split[{}] + = {} + + #> A[x__] := 321 /; Length[{x}] == 5; + #> Split[A[x, x, x, y, x, y, y, z]] + = 321 + #> ClearAll[A]; + """ + + rules = { + "Split[list_]": "Split[list, SameQ]", + } + + messages = { + "normal": "Nonatomic expression expected at position `1` in `2`.", + } + summary_text = "split into runs of identical elements" + + def eval(self, mlist, test, evaluation: Evaluation): + "Split[mlist_, test_]" + + expr = Expression(SymbolSplit, mlist, test) + + if isinstance(mlist, Atom): + evaluation.message("Select", "normal", 1, expr) + return + + if not mlist.elements: + return Expression(mlist.head) + + result = [[mlist.elements[0]]] + for element in mlist.elements[1:]: + applytest = Expression(test, result[-1][-1], element) + if applytest.evaluate(evaluation) is SymbolTrue: + result[-1].append(element) + else: + result.append([element]) + + inner = structure("List", mlist, evaluation) + outer = structure(mlist.head, inner, evaluation) + return outer([inner(t) for t in result]) + + +class SplitBy(Builtin): + """ + + :WMA link: + https://reference.wolfram.com/language/ref/SplitBy.html + +
+
'SplitBy[$list$, $f$]' +
splits $list$ into collections of consecutive elements + that give the same result when $f$ is applied. +
+ + >> SplitBy[Range[1, 3, 1/3], Round] + = {{1, 4 / 3}, {5 / 3, 2, 7 / 3}, {8 / 3, 3}} + + >> SplitBy[{1, 2, 1, 1.2}, {Round, Identity}] + = {{{1}}, {{2}}, {{1}, {1.2}}} + + #> SplitBy[Tuples[{1, 2}, 3], First] + = {{{1, 1, 1}, {1, 1, 2}, {1, 2, 1}, {1, 2, 2}}, {{2, 1, 1}, {2, 1, 2}, {2, 2, 1}, {2, 2, 2}}} + """ + + messages = { + "normal": "Nonatomic expression expected at position `1` in `2`.", + } + + rules = { + "SplitBy[list_]": "SplitBy[list, Identity]", + } + + summary_text = "split based on values of a function applied to elements" + + def eval(self, mlist, func, evaluation: Evaluation): + "SplitBy[mlist_, func_?NotListQ]" + + expr = Expression(SymbolSplit, mlist, func) + + if isinstance(mlist, Atom): + evaluation.message("Select", "normal", 1, expr) + return + + plist = [t for t in mlist.elements] + + result = [[plist[0]]] + prev = Expression(func, plist[0]).evaluate(evaluation) + for element in plist[1:]: + curr = Expression(func, element).evaluate(evaluation) + if curr == prev: + result[-1].append(element) + else: + result.append([element]) + prev = curr + + inner = structure("List", mlist, evaluation) + outer = structure(mlist.head, inner, evaluation) + return outer([inner(t) for t in result]) + + def eval_multiple(self, mlist, funcs, evaluation: Evaluation): + "SplitBy[mlist_, funcs_List]" + expr = Expression(SymbolSplit, mlist, funcs) + + if isinstance(mlist, Atom): + evaluation.message("Select", "normal", 1, expr) + return + + result = mlist + for f in funcs.elements[::-1]: + result = self.eval(result, f, evaluation) + + return result + + class Tally(_GatherOperation): """ :WMA link:https://reference.wolfram.com/language/ref/Tally.html @@ -867,11 +1285,14 @@ def _elementwise(self, a, b, sameQ: Callable[..., bool]): class Intersection(_SetOperation): """ - :WMA link:https://reference.wolfram.com/language/ref/Intersection.html + + :WMA link: + https://reference.wolfram.com/language/ref/Intersection.html
'Intersection[$a$, $b$, ...]' -
gives the intersection of the sets. The resulting list will be sorted and each element will only occur once. +
gives the intersection of the sets. The resulting list \ + will be sorted and each element will only occur once.
>> Intersection[{1000, 100, 10, 1}, {1, 5, 10, 15}] diff --git a/mathics/builtin/lists.py b/mathics/builtin/lists.py index d38396e82..fc0c9bc49 100644 --- a/mathics/builtin/lists.py +++ b/mathics/builtin/lists.py @@ -6,19 +6,9 @@ """ import heapq -from itertools import chain import sympy -from mathics.algorithm.clusters import ( - AutomaticMergeCriterion, - AutomaticSplitCriterion, - LazyDistances, - PrecomputedDistances, - agglomerate, - kmeans, - optimize, -) from mathics.algorithm.parts import python_levelspec, walk_levels from mathics.builtin.base import ( Builtin, @@ -30,21 +20,10 @@ ) from mathics.builtin.box.layout import RowBox from mathics.builtin.numbers.algebra import cancel -from mathics.builtin.options import options_to_rules from mathics.builtin.scoping import dynamic_scoping -from mathics.core.atoms import ( - Integer, - Integer0, - Integer1, - Integer2, - Number, - Real, - String, - machine_precision, - min_prec, -) -from mathics.core.attributes import A_HOLD_ALL, A_LOCKED, A_PROTECTED, A_READ_PROTECTED -from mathics.core.convert.expression import to_expression, to_mathics_list +from mathics.core.atoms import Integer, Integer0, Integer1, Integer2, Number, String +from mathics.core.attributes import A_HOLD_ALL, A_LOCKED, A_PROTECTED +from mathics.core.convert.expression import to_expression from mathics.core.convert.sympy import from_sympy from mathics.core.exceptions import ( InvalidLevelspecError, @@ -53,185 +32,364 @@ PartError, PartRangeError, ) -from mathics.core.expression import Expression, structure +from mathics.core.expression import Expression from mathics.core.interrupt import BreakInterrupt, ContinueInterrupt, ReturnInterrupt from mathics.core.list import ListExpression -from mathics.core.symbols import ( - Atom, - Symbol, - SymbolFalse, - SymbolPlus, - SymbolTrue, - strip_context, -) +from mathics.core.symbols import Atom, Symbol, SymbolFalse, SymbolPlus, SymbolTrue from mathics.core.systemsymbols import ( SymbolAlternatives, - SymbolFailed, SymbolGreaterEqual, SymbolLess, SymbolLessEqual, SymbolMakeBoxes, SymbolMatchQ, - SymbolRule, SymbolSequence, SymbolSubsetQ, ) -from mathics.eval.nevaluator import eval_N from mathics.eval.numerify import numerify -SymbolClusteringComponents = Symbol("ClusteringComponents") -SymbolContainsOnly = Symbol("ContainsOnly") -SymbolFindClusters = Symbol("FindClusters") SymbolKey = Symbol("Key") -SymbolSplit = Symbol("Split") - - -class All(Predefined): - """ - :WMA link:https://reference.wolfram.com/language/ref/All.html -
-
'All' -
is a possible option value for 'Span', 'Quiet', 'Part' and related functions. 'All' specifies all parts at a particular level. -
- """ - summary_text = "all the parts in the level" +def delete_one(expr, pos): + if isinstance(expr, Atom): + raise PartDepthError(pos) + elements = expr.elements + if pos == 0: + return Expression(SymbolSequence, *elements) + s = len(elements) + truepos = pos + if truepos < 0: + truepos = s + truepos + else: + truepos = truepos - 1 + if truepos < 0 or truepos >= s: + raise PartRangeError + elements = ( + elements[:truepos] + + (to_expression("System`Sequence"),) + + elements[truepos + 1 :] + ) + return to_expression(expr.get_head(), *elements) -class ContainsOnly(Builtin): - """ - :WMA link:https://reference.wolfram.com/language/ref/ContainsOnly.html +def delete_rec(expr, pos): + if len(pos) == 1: + return delete_one(expr, pos[0]) + truepos = pos[0] + if truepos == 0 or isinstance(expr, Atom): + raise PartDepthError(pos[0]) + elements = expr.elements + s = len(elements) + if truepos < 0: + truepos = truepos + s + if truepos < 0: + raise PartRangeError + newelement = delete_rec(elements[truepos], pos[1:]) + elements = elements[:truepos] + (newelement,) + elements[truepos + 1 :] + else: + if truepos > s: + raise PartRangeError + newelement = delete_rec(elements[truepos - 1], pos[1:]) + elements = elements[: truepos - 1] + (newelement,) + elements[truepos:] + return Expression(expr.get_head(), *elements) -
-
'ContainsOnly[$list1$, $list2$]' -
yields True if $list1$ contains only elements that appear in $list2$. -
- >> ContainsOnly[{b, a, a}, {a, b, c}] - = True +def riffle(items, sep): + result = items[:1] + for item in items[1:]: + result.append(sep) + result.append(item) + return result - The first list contains elements not present in the second list: - >> ContainsOnly[{b, a, d}, {a, b, c}] - = False - >> ContainsOnly[{}, {a, b, c}] - = True +def list_boxes(items, f, evaluation, open=None, close=None): + result = [ + Expression(SymbolMakeBoxes, item, f).evaluate(evaluation) for item in items + ] + if f.get_name() in ("System`OutputForm", "System`InputForm"): + sep = ", " + else: + sep = "," + result = riffle(result, String(sep)) + if len(items) > 1: + result = RowBox(*result) + elif items: + result = result[0] + if result: + result = [result] + else: + result = [] + if open is not None and close is not None: + return [String(open)] + result + [String(close)] + else: + return result - #> ContainsOnly[1, {1, 2, 3}] - : List or association expected instead of 1. - = ContainsOnly[1, {1, 2, 3}] - #> ContainsOnly[{1, 2, 3}, 4] - : List or association expected instead of 4. - = ContainsOnly[{1, 2, 3}, 4] +def get_tuples(items): + if not items: + yield [] + else: + for item in items[0]: + for rest in get_tuples(items[1:]): + yield [item] + rest - Use Equal as the comparison function to have numerical tolerance: - >> ContainsOnly[{a, 1.0}, {1, a, b}, {SameTest -> Equal}] - = True - #> ContainsOnly[{c, a}, {a, b, c}, IgnoreCase -> True] - : Unknown option IgnoreCase -> True in ContainsOnly. - : Unknown option IgnoreCase in . - = True +class _IterationFunction(Builtin): + """ + >> Sum[k, {k, Range[5]}] + = 15 """ - attributes = A_PROTECTED | A_READ_PROTECTED - - messages = { - "lsa": "List or association expected instead of `1`.", - "nodef": "Unknown option `1` for ContainsOnly.", - "optx": "Unknown option `1` in `2`.", - } - - options = { - "SameTest": "SameQ", - } + attributes = A_HOLD_ALL | A_PROTECTED + allow_loopcontrol = False + throw_iterb = True - summary_text = "test if all the elements of a list appears into another list" + def get_result(self, items): + pass - def check_options(self, expr, evaluation, options): - for key in options: - if key != "System`SameTest": - if expr is None: - evaluation.message("ContainsOnly", "optx", Symbol(key)) + def eval_symbol(self, expr, iterator, evaluation): + "%(name)s[expr_, iterator_Symbol]" + iterator = iterator.evaluate(evaluation) + if iterator.has_form(["List", "Range", "Sequence"], None): + elements = iterator.elements + if len(elements) == 1: + return self.apply_max(expr, *elements, evaluation) + elif len(elements) == 2: + if elements[1].has_form(["List", "Sequence"], None): + seq = Expression(SymbolSequence, *(elements[1].elements)) + return self.eval_list(expr, elements[0], seq, evaluation) else: - return evaluation.message("ContainsOnly", "optx", Symbol(key), expr) - return None + return self.eval_range(expr, *elements, evaluation) + elif len(elements) == 3: + return self.eval_iter_nostep(expr, *elements, evaluation) + elif len(elements) == 4: + return self.eval_iter(expr, *elements, evaluation) - def eval(self, list1, list2, evaluation, options={}): - "ContainsOnly[list1_List, list2_List, OptionsPattern[ContainsOnly]]" + if self.throw_iterb: + evaluation.message(self.get_name(), "iterb") + return - same_test = self.get_option(options, "SameTest", evaluation) + def eval_range(self, expr, i, imax, evaluation): + "%(name)s[expr_, {i_Symbol, imax_}]" + imax = imax.evaluate(evaluation) + if imax.has_form("Range", None): + # FIXME: this should work as an iterator in Python3, not + # building the sequence explicitly... + seq = Expression(SymbolSequence, *(imax.evaluate(evaluation).elements)) + return self.apply_list(expr, i, seq, evaluation) + elif imax.has_form("List", None): + seq = Expression(SymbolSequence, *(imax.elements)) + return self.eval_list(expr, i, seq, evaluation) + else: + return self.eval_iter(expr, i, Integer1, imax, Integer1, evaluation) - def sameQ(a, b) -> bool: - """Mathics SameQ""" - result = Expression(same_test, a, b).evaluate(evaluation) - return result is SymbolTrue + def eval_max(self, expr, imax, evaluation): + "%(name)s[expr_, {imax_}]" - self.check_options(None, evaluation, options) - for a in list1.elements: - if not any(sameQ(a, b) for b in list2.elements): - return SymbolFalse - return SymbolTrue + # Even though `imax` should be an integeral value, its type does not + # have to be an Integer. - def eval_msg(self, e1, e2, evaluation, options={}): - "ContainsOnly[e1_, e2_, OptionsPattern[ContainsOnly]]" + result = [] - opts = ( - options_to_rules(options) - if len(options) <= 1 - else [ListExpression(*options_to_rules(options))] - ) - expr = Expression(SymbolContainsOnly, e1, e2, *opts) + def do_iteration(): + evaluation.check_stopped() + try: + result.append(expr.evaluate(evaluation)) + except ContinueInterrupt: + if self.allow_loopcontrol: + pass + else: + raise + except BreakInterrupt: + if self.allow_loopcontrol: + raise StopIteration + else: + raise + except ReturnInterrupt as e: + if self.allow_loopcontrol: + return e.expr + else: + raise - if not isinstance(e1, Symbol) and not e1.has_form("List", None): - evaluation.message("ContainsOnly", "lsa", e1) - return self.check_options(expr, evaluation, options) + if isinstance(imax, Integer): + try: + for _ in range(imax.value): + do_iteration() + except StopIteration: + pass - if not isinstance(e2, Symbol) and not e2.has_form("List", None): - evaluation.message("ContainsOnly", "lsa", e2) - return self.check_options(expr, evaluation, options) + else: + imax = imax.evaluate(evaluation) + imax = numerify(imax, evaluation) + if isinstance(imax, Number): + imax = imax.round() + py_max = imax.get_float_value() + if py_max is None: + if self.throw_iterb: + evaluation.message(self.get_name(), "iterb") + return - return self.check_options(expr, evaluation, options) + index = 0 + try: + while index < py_max: + do_iteration() + index += 1 + except StopIteration: + pass + return self.get_result(result) -class Delete(Builtin): - """ - :WMA link:https://reference.wolfram.com/language/ref/Delete.html + def eval_iter_nostep(self, expr, i, imin, imax, evaluation): + "%(name)s[expr_, {i_Symbol, imin_, imax_}]" + return self.eval_iter(expr, i, imin, imax, Integer1, evaluation) -
-
'Delete[$expr$, $i$]' -
deletes the element at position $i$ in $expr$. The position is counted from the end if $i$ is negative. -
'Delete[$expr$, {$m$, $n$, ...}]' -
deletes the element at position {$m$, $n$, ...}. -
'Delete[$expr$, {{$m1$, $n1$, ...}, {$m2$, $n2$, ...}, ...}]' -
deletes the elements at several positions. -
+ def eval_iter(self, expr, i, imin, imax, di, evaluation): + "%(name)s[expr_, {i_Symbol, imin_, imax_, di_}]" - Delete the element at position 3: - >> Delete[{a, b, c, d}, 3] - = {a, b, d} + if isinstance(self, SympyFunction) and di.get_int_value() == 1: + whole_expr = to_expression( + self.get_name(), expr, ListExpression(i, imin, imax) + ) + sympy_expr = whole_expr.to_sympy(evaluation=evaluation) + if sympy_expr is None: + return None - Delete at position 2 from the end: - >> Delete[{a, b, c, d}, -2] - = {a, b, d} + # apply Together to produce results similar to Mathematica + result = sympy.together(sympy_expr) + result = from_sympy(result) + result = cancel(result) - Delete at positions 1 and 3: - >> Delete[{a, b, c, d}, {{1}, {3}}] - = {b, d} + if not result.sameQ(whole_expr): + return result + return - Delete in a 2D array: - >> Delete[{{a, b}, {c, d}}, {2, 1}] - = {{a, b}, {d}} + index = imin.evaluate(evaluation) + imax = imax.evaluate(evaluation) + di = di.evaluate(evaluation) - Deleting the head of a whole expression gives a Sequence object: - >> Delete[{a, b, c}, 0] - = Sequence[a, b, c] + result = [] + compare_type = ( + SymbolGreaterEqual + if Expression(SymbolLess, di, Integer0).evaluate(evaluation).to_python() + else SymbolLessEqual + ) + while True: + cont = Expression(compare_type, index, imax).evaluate(evaluation) + if cont is SymbolFalse: + break + if cont is not SymbolTrue: + if self.throw_iterb: + evaluation.message(self.get_name(), "iterb") + return - Delete in an expression with any head: - >> Delete[f[a, b, c, d], 3] - = f[a, b, d] + evaluation.check_stopped() + try: + item = dynamic_scoping(expr.evaluate, {i.name: index}, evaluation) + result.append(item) + except ContinueInterrupt: + if self.allow_loopcontrol: + pass + else: + raise + except BreakInterrupt: + if self.allow_loopcontrol: + break + else: + raise + except ReturnInterrupt as e: + if self.allow_loopcontrol: + return e.expr + else: + raise + index = Expression(SymbolPlus, index, di).evaluate(evaluation) + return self.get_result(result) + + def eval_list(self, expr, i, items, evaluation): + "%(name)s[expr_, {i_Symbol, {items___}}]" + items = items.evaluate(evaluation).get_sequence() + result = [] + for item in items: + evaluation.check_stopped() + try: + item = dynamic_scoping(expr.evaluate, {i.name: item}, evaluation) + result.append(item) + except ContinueInterrupt: + if self.allow_loopcontrol: + pass + else: + raise + except BreakInterrupt: + if self.allow_loopcontrol: + break + else: + raise + except ReturnInterrupt as e: + if self.allow_loopcontrol: + return e.expr + else: + raise + return self.get_result(result) + + def eval_multi(self, expr, first, sequ, evaluation): + "%(name)s[expr_, first_, sequ__]" + + sequ = sequ.get_sequence() + name = self.get_name() + return to_expression(name, to_expression(name, expr, *sequ), first) + + +class All(Predefined): + """ + :WMA link:https://reference.wolfram.com/language/ref/All.html + +
+
'All' +
is a possible option value for 'Span', 'Quiet', 'Part' and related functions. 'All' specifies all parts at a particular level. +
+ """ + + summary_text = "all the parts in the level" + + +class Delete(Builtin): + """ + + :WMA link: + https://reference.wolfram.com/language/ref/Delete.html + +
+
'Delete[$expr$, $i$]' +
deletes the element at position $i$ in $expr$. The position is counted from the end if $i$ is negative. +
'Delete[$expr$, {$m$, $n$, ...}]' +
deletes the element at position {$m$, $n$, ...}. +
'Delete[$expr$, {{$m1$, $n1$, ...}, {$m2$, $n2$, ...}, ...}]' +
deletes the elements at several positions. +
+ + Delete the element at position 3: + >> Delete[{a, b, c, d}, 3] + = {a, b, d} + + Delete at position 2 from the end: + >> Delete[{a, b, c, d}, -2] + = {a, b, d} + + Delete at positions 1 and 3: + >> Delete[{a, b, c, d}, {{1}, {3}}] + = {b, d} + + Delete in a 2D array: + >> Delete[{{a, b}, {c, d}}, {2, 1}] + = {{a, b}, {d}} + + Deleting the head of a whole expression gives a Sequence object: + >> Delete[{a, b, c}, 0] + = Sequence[a, b, c] + + Delete in an expression with any head: + >> Delete[f[a, b, c, d], 3] + = f[a, b, d] Delete a head to splice in its arguments: >> Delete[f[a, b, u + v, c], {3, 0}] @@ -342,6 +500,23 @@ def eval(self, expr, positions, evaluation): return newexpr +class DisjointQ(Test): + """ + + :WMA link: + https://reference.wolfram.com/language/ref/DisjointQ.html + +
+
'DisjointQ[$a$, $b$]' +
gives True if $a$ and $b$ are disjoint, or False if $a$ and \ + $b$ have any common elements. +
+ """ + + rules = {"DisjointQ[a_List, b_List]": "Not[IntersectingQ[a, b]]"} + summary_text = "test whether two lists do not have common elements" + + class Failure(Builtin): """ :WMA link:https://reference.wolfram.com/language/ref/Failure.html @@ -362,6 +537,49 @@ class Failure(Builtin): # * Complete the support. +class Insert(Builtin): + """ + :WMA link:https://reference.wolfram.com/language/ref/Insert.html + +
+
'Insert[$list$, $elem$, $n$]' +
inserts $elem$ at position $n$ in $list$. When $n$ is negative, the position is counted from the end. +
+ + >> Insert[{a,b,c,d,e}, x, 3] + = {a, b, x, c, d, e} + + >> Insert[{a,b,c,d,e}, x, -2] + = {a, b, c, d, x, e} + """ + + summary_text = "insert an element at a given position" + + def eval(self, expr, elem, n: Integer, evaluation): + "Insert[expr_List, elem_, n_Integer]" + + py_n = n.value + new_list = list(expr.get_elements()) + + position = py_n - 1 if py_n > 0 else py_n + 1 + new_list.insert(position, elem) + return expr.restructure(expr.head, new_list, evaluation, deps=(expr, elem)) + + +class IntersectingQ(Builtin): + """ + :WMA link:https://reference.wolfram.com/language/ref/IntersectingQ.html + +
+
'IntersectingQ[$a$, $b$]' +
gives True if there are any common elements in $a and $b, or False if $a and $b are disjoint. +
+ """ + + rules = {"IntersectingQ[a_List, b_List]": "Length[Intersect[a, b]] > 0"} + summary_text = "test whether two lists have common elements" + + class Key(Builtin): """ :WMA link:https://reference.wolfram.com/language/ref/Key.html @@ -380,6 +598,73 @@ class Key(Builtin): summary_text = "indicate a key within a part specification" +class LeafCount(Builtin): + """ + :WMA link:https://reference.wolfram.com/language/ref/LeafCount.html + +
+
'LeafCount[$expr$]' +
returns the total number of indivisible subexpressions in $expr$. +
+ + >> LeafCount[1 + x + y^a] + = 6 + + >> LeafCount[f[x, y]] + = 3 + + >> LeafCount[{1 / 3, 1 + I}] + = 7 + + >> LeafCount[Sqrt[2]] + = 5 + + >> LeafCount[100!] + = 1 + + #> LeafCount[f[a, b][x, y]] + = 5 + + #> NestList[# /. s[x_][y_][z_] -> x[z][y[z]] &, s[s][s][s[s]][s][s], 4]; + #> LeafCount /@ % + = {7, 8, 8, 11, 11} + + #> LeafCount[1 / 3, 1 + I] + : LeafCount called with 2 arguments; 1 argument is expected. + = LeafCount[1 / 3, 1 + I] + """ + + messages = { + "argx": "LeafCount called with `1` arguments; 1 argument is expected.", + } + summary_text = "the total number of atomic subexpressions" + + def eval(self, expr, evaluation): + "LeafCount[expr___]" + + from mathics.core.atoms import Complex, Rational + + elements = [] + + def callback(level): + if isinstance(level, Rational): + elements.extend( + [level.get_head(), level.numerator(), level.denominator()] + ) + elif isinstance(level, Complex): + elements.extend([level.get_head(), level.real, level.imag]) + else: + elements.append(level) + return level + + expr = expr.get_sequence() + if len(expr) != 1: + return evaluation.message("LeafCount", "argx", Integer(len(expr))) + + walk_levels(expr[0], start=-1, stop=-1, heads=True, callback=callback) + return Integer(len(elements)) + + class Level(Builtin): """ :WMA link:https://reference.wolfram.com/language/ref/Level.html @@ -538,1529 +823,240 @@ class ListQ(Test): >> ListQ[{1, 2, 3}] = True - >> ListQ[{{1, 2}, {3, 4}}] - = True - >> ListQ[x] - = False - """ - - summary_text = "test if an expression is a list" - - def test(self, expr): - return expr.get_head_name() == "System`List" - - -class NotListQ(Test): - """ - :WMA link:https://reference.wolfram.com/language/ref/NotListQ.html - -
-
'NotListQ[$expr$]' -
returns true if $expr$ is not a list. -
- """ - - summary_text = "test if an expression is not a list" - - def test(self, expr): - return expr.get_head_name() != "System`List" - - -def riffle(items, sep): - result = items[:1] - for item in items[1:]: - result.append(sep) - result.append(item) - return result - - -def list_boxes(items, f, evaluation, open=None, close=None): - result = [ - Expression(SymbolMakeBoxes, item, f).evaluate(evaluation) for item in items - ] - if f.get_name() in ("System`OutputForm", "System`InputForm"): - sep = ", " - else: - sep = "," - result = riffle(result, String(sep)) - if len(items) > 1: - result = RowBox(*result) - elif items: - result = result[0] - if result: - result = [result] - else: - result = [] - if open is not None and close is not None: - return [String(open)] + result + [String(close)] - else: - return result - - -class None_(Predefined): - """ - :WMA link:https://reference.wolfram.com/language/ref/None.html - -
-
'None' -
is a possible value for 'Span' and 'Quiet'. -
- """ - - name = "None" - summary_text = "not any part" - - -class Split(Builtin): - """ - :WMA link:https://reference.wolfram.com/language/ref/Split.html - -
-
'Split[$list$]' -
splits $list$ into collections of consecutive identical elements. -
'Split[$list$, $test$]' -
splits $list$ based on whether the function $test$ yields - 'True' on consecutive elements. -
- - >> Split[{x, x, x, y, x, y, y, z}] - = {{x, x, x}, {y}, {x}, {y, y}, {z}} - - #> Split[{x, x, x, y, x, y, y, z}, x] - = {{x}, {x}, {x}, {y}, {x}, {y}, {y}, {z}} - - Split into increasing or decreasing runs of elements - >> Split[{1, 5, 6, 3, 6, 1, 6, 3, 4, 5, 4}, Less] - = {{1, 5, 6}, {3, 6}, {1, 6}, {3, 4, 5}, {4}} - - >> Split[{1, 5, 6, 3, 6, 1, 6, 3, 4, 5, 4}, Greater] - = {{1}, {5}, {6, 3}, {6, 1}, {6, 3}, {4}, {5, 4}} - - Split based on first element - >> Split[{x -> a, x -> y, 2 -> a, z -> c, z -> a}, First[#1] === First[#2] &] - = {{x -> a, x -> y}, {2 -> a}, {z -> c, z -> a}} - - #> Split[{}] - = {} - - #> A[x__] := 321 /; Length[{x}] == 5; - #> Split[A[x, x, x, y, x, y, y, z]] - = 321 - #> ClearAll[A]; - """ - - rules = { - "Split[list_]": "Split[list, SameQ]", - } - - messages = { - "normal": "Nonatomic expression expected at position `1` in `2`.", - } - summary_text = "split into runs of identical elements" - - def eval(self, mlist, test, evaluation): - "Split[mlist_, test_]" - - expr = Expression(SymbolSplit, mlist, test) - - if isinstance(mlist, Atom): - evaluation.message("Select", "normal", 1, expr) - return - - if not mlist.elements: - return Expression(mlist.head) - - result = [[mlist.elements[0]]] - for element in mlist.elements[1:]: - applytest = Expression(test, result[-1][-1], element) - if applytest.evaluate(evaluation) is SymbolTrue: - result[-1].append(element) - else: - result.append([element]) - - inner = structure("List", mlist, evaluation) - outer = structure(mlist.head, inner, evaluation) - return outer([inner(t) for t in result]) - - -class SplitBy(Builtin): - """ - :WMA link:https://reference.wolfram.com/language/ref/SplitBy.html - -
-
'SplitBy[$list$, $f$]' -
splits $list$ into collections of consecutive elements - that give the same result when $f$ is applied. -
- - >> SplitBy[Range[1, 3, 1/3], Round] - = {{1, 4 / 3}, {5 / 3, 2, 7 / 3}, {8 / 3, 3}} - - >> SplitBy[{1, 2, 1, 1.2}, {Round, Identity}] - = {{{1}}, {{2}}, {{1}, {1.2}}} - - #> SplitBy[Tuples[{1, 2}, 3], First] - = {{{1, 1, 1}, {1, 1, 2}, {1, 2, 1}, {1, 2, 2}}, {{2, 1, 1}, {2, 1, 2}, {2, 2, 1}, {2, 2, 2}}} - """ - - messages = { - "normal": "Nonatomic expression expected at position `1` in `2`.", - } - - rules = { - "SplitBy[list_]": "SplitBy[list, Identity]", - } - - summary_text = "split based on values of a function applied to elements" - - def eval(self, mlist, func, evaluation): - "SplitBy[mlist_, func_?NotListQ]" - - expr = Expression(SymbolSplit, mlist, func) - - if isinstance(mlist, Atom): - evaluation.message("Select", "normal", 1, expr) - return - - plist = [t for t in mlist.elements] - - result = [[plist[0]]] - prev = Expression(func, plist[0]).evaluate(evaluation) - for element in plist[1:]: - curr = Expression(func, element).evaluate(evaluation) - if curr == prev: - result[-1].append(element) - else: - result.append([element]) - prev = curr - - inner = structure("List", mlist, evaluation) - outer = structure(mlist.head, inner, evaluation) - return outer([inner(t) for t in result]) - - def eval_multiple(self, mlist, funcs, evaluation): - "SplitBy[mlist_, funcs_List]" - expr = Expression(SymbolSplit, mlist, funcs) - - if isinstance(mlist, Atom): - evaluation.message("Select", "normal", 1, expr) - return - - result = mlist - for f in funcs.elements[::-1]: - result = self.eval(result, f, evaluation) - - return result - - -class LeafCount(Builtin): - """ - :WMA link:https://reference.wolfram.com/language/ref/LeafCount.html - -
-
'LeafCount[$expr$]' -
returns the total number of indivisible subexpressions in $expr$. -
- - >> LeafCount[1 + x + y^a] - = 6 - - >> LeafCount[f[x, y]] - = 3 - - >> LeafCount[{1 / 3, 1 + I}] - = 7 - - >> LeafCount[Sqrt[2]] - = 5 - - >> LeafCount[100!] - = 1 - - #> LeafCount[f[a, b][x, y]] - = 5 - - #> NestList[# /. s[x_][y_][z_] -> x[z][y[z]] &, s[s][s][s[s]][s][s], 4]; - #> LeafCount /@ % - = {7, 8, 8, 11, 11} - - #> LeafCount[1 / 3, 1 + I] - : LeafCount called with 2 arguments; 1 argument is expected. - = LeafCount[1 / 3, 1 + I] - """ - - messages = { - "argx": "LeafCount called with `1` arguments; 1 argument is expected.", - } - summary_text = "the total number of atomic subexpressions" - - def eval(self, expr, evaluation): - "LeafCount[expr___]" - - from mathics.core.atoms import Complex, Rational - - elements = [] - - def callback(level): - if isinstance(level, Rational): - elements.extend( - [level.get_head(), level.numerator(), level.denominator()] - ) - elif isinstance(level, Complex): - elements.extend([level.get_head(), level.real, level.imag]) - else: - elements.append(level) - return level - - expr = expr.get_sequence() - if len(expr) != 1: - return evaluation.message("LeafCount", "argx", Integer(len(expr))) - - walk_levels(expr[0], start=-1, stop=-1, heads=True, callback=callback) - return Integer(len(elements)) - - -class _IterationFunction(Builtin): - """ - >> Sum[k, {k, Range[5]}] - = 15 - """ - - attributes = A_HOLD_ALL | A_PROTECTED - allow_loopcontrol = False - throw_iterb = True - - def get_result(self, items): - pass - - def eval_symbol(self, expr, iterator, evaluation): - "%(name)s[expr_, iterator_Symbol]" - iterator = iterator.evaluate(evaluation) - if iterator.has_form(["List", "Range", "Sequence"], None): - elements = iterator.elements - if len(elements) == 1: - return self.apply_max(expr, *elements, evaluation) - elif len(elements) == 2: - if elements[1].has_form(["List", "Sequence"], None): - seq = Expression(SymbolSequence, *(elements[1].elements)) - return self.eval_list(expr, elements[0], seq, evaluation) - else: - return self.eval_range(expr, *elements, evaluation) - elif len(elements) == 3: - return self.eval_iter_nostep(expr, *elements, evaluation) - elif len(elements) == 4: - return self.eval_iter(expr, *elements, evaluation) - - if self.throw_iterb: - evaluation.message(self.get_name(), "iterb") - return - - def eval_range(self, expr, i, imax, evaluation): - "%(name)s[expr_, {i_Symbol, imax_}]" - imax = imax.evaluate(evaluation) - if imax.has_form("Range", None): - # FIXME: this should work as an iterator in Python3, not - # building the sequence explicitly... - seq = Expression(SymbolSequence, *(imax.evaluate(evaluation).elements)) - return self.apply_list(expr, i, seq, evaluation) - elif imax.has_form("List", None): - seq = Expression(SymbolSequence, *(imax.elements)) - return self.eval_list(expr, i, seq, evaluation) - else: - return self.eval_iter(expr, i, Integer1, imax, Integer1, evaluation) - - def eval_max(self, expr, imax, evaluation): - "%(name)s[expr_, {imax_}]" - - # Even though `imax` should be an integeral value, its type does not - # have to be an Integer. - - result = [] - - def do_iteration(): - evaluation.check_stopped() - try: - result.append(expr.evaluate(evaluation)) - except ContinueInterrupt: - if self.allow_loopcontrol: - pass - else: - raise - except BreakInterrupt: - if self.allow_loopcontrol: - raise StopIteration - else: - raise - except ReturnInterrupt as e: - if self.allow_loopcontrol: - return e.expr - else: - raise - - if isinstance(imax, Integer): - try: - for _ in range(imax.value): - do_iteration() - except StopIteration: - pass - - else: - imax = imax.evaluate(evaluation) - imax = numerify(imax, evaluation) - if isinstance(imax, Number): - imax = imax.round() - py_max = imax.get_float_value() - if py_max is None: - if self.throw_iterb: - evaluation.message(self.get_name(), "iterb") - return - - index = 0 - try: - while index < py_max: - do_iteration() - index += 1 - except StopIteration: - pass - - return self.get_result(result) - - def eval_iter_nostep(self, expr, i, imin, imax, evaluation): - "%(name)s[expr_, {i_Symbol, imin_, imax_}]" - return self.eval_iter(expr, i, imin, imax, Integer1, evaluation) - - def eval_iter(self, expr, i, imin, imax, di, evaluation): - "%(name)s[expr_, {i_Symbol, imin_, imax_, di_}]" - - if isinstance(self, SympyFunction) and di.get_int_value() == 1: - whole_expr = to_expression( - self.get_name(), expr, ListExpression(i, imin, imax) - ) - sympy_expr = whole_expr.to_sympy(evaluation=evaluation) - if sympy_expr is None: - return None - - # apply Together to produce results similar to Mathematica - result = sympy.together(sympy_expr) - result = from_sympy(result) - result = cancel(result) - - if not result.sameQ(whole_expr): - return result - return - - index = imin.evaluate(evaluation) - imax = imax.evaluate(evaluation) - di = di.evaluate(evaluation) - - result = [] - compare_type = ( - SymbolGreaterEqual - if Expression(SymbolLess, di, Integer0).evaluate(evaluation).to_python() - else SymbolLessEqual - ) - while True: - cont = Expression(compare_type, index, imax).evaluate(evaluation) - if cont is SymbolFalse: - break - if cont is not SymbolTrue: - if self.throw_iterb: - evaluation.message(self.get_name(), "iterb") - return - - evaluation.check_stopped() - try: - item = dynamic_scoping(expr.evaluate, {i.name: index}, evaluation) - result.append(item) - except ContinueInterrupt: - if self.allow_loopcontrol: - pass - else: - raise - except BreakInterrupt: - if self.allow_loopcontrol: - break - else: - raise - except ReturnInterrupt as e: - if self.allow_loopcontrol: - return e.expr - else: - raise - index = Expression(SymbolPlus, index, di).evaluate(evaluation) - return self.get_result(result) - - def eval_list(self, expr, i, items, evaluation): - "%(name)s[expr_, {i_Symbol, {items___}}]" - items = items.evaluate(evaluation).get_sequence() - result = [] - for item in items: - evaluation.check_stopped() - try: - item = dynamic_scoping(expr.evaluate, {i.name: item}, evaluation) - result.append(item) - except ContinueInterrupt: - if self.allow_loopcontrol: - pass - else: - raise - except BreakInterrupt: - if self.allow_loopcontrol: - break - else: - raise - except ReturnInterrupt as e: - if self.allow_loopcontrol: - return e.expr - else: - raise - return self.get_result(result) - - def eval_multi(self, expr, first, sequ, evaluation): - "%(name)s[expr_, first_, sequ__]" - - sequ = sequ.get_sequence() - name = self.get_name() - return to_expression(name, to_expression(name, expr, *sequ), first) - - -class Insert(Builtin): - """ - :WMA link:https://reference.wolfram.com/language/ref/Insert.html - -
-
'Insert[$list$, $elem$, $n$]' -
inserts $elem$ at position $n$ in $list$. When $n$ is negative, the position is counted from the end. -
- - >> Insert[{a,b,c,d,e}, x, 3] - = {a, b, x, c, d, e} - - >> Insert[{a,b,c,d,e}, x, -2] - = {a, b, c, d, x, e} - """ - - summary_text = "insert an element at a given position" - - def eval(self, expr, elem, n: Integer, evaluation): - "Insert[expr_List, elem_, n_Integer]" - - py_n = n.value - new_list = list(expr.get_elements()) - - position = py_n - 1 if py_n > 0 else py_n + 1 - new_list.insert(position, elem) - return expr.restructure(expr.head, new_list, evaluation, deps=(expr, elem)) - - -def get_tuples(items): - if not items: - yield [] - else: - for item in items[0]: - for rest in get_tuples(items[1:]): - yield [item] + rest - - -class IntersectingQ(Builtin): - """ - :WMA link:https://reference.wolfram.com/language/ref/IntersectingQ.html - -
-
'IntersectingQ[$a$, $b$]' -
gives True if there are any common elements in $a and $b, or False if $a and $b are disjoint. -
- """ - - rules = {"IntersectingQ[a_List, b_List]": "Length[Intersect[a, b]] > 0"} - summary_text = "test whether two lists have common elements" - - -class DisjointQ(Test): - """ - :WMA link:https://reference.wolfram.com/language/ref/DisjointQ.html - -
-
'DisjointQ[$a$, $b$]' -
gives True if $a and $b are disjoint, or False if $a and $b have any common elements. -
- """ - - rules = {"DisjointQ[a_List, b_List]": "Not[IntersectingQ[a, b]]"} - summary_text = "test whether two lists do not have common elements" - - -class _NotRectangularException(Exception): - pass - - -class _Rectangular(Builtin): - # A helper for Builtins X that allow X[{a1, a2, ...}, {b1, b2, ...}, ...] to be evaluated - # as {X[{a1, b1, ...}, {a1, b2, ...}, ...]}. - - def rect(self, element): - lengths = [len(element.elements) for element in element.elements] - if all(length == 0 for length in lengths): - return # leave as is, without error - - n_columns = lengths[0] - if any(length != n_columns for length in lengths[1:]): - raise _NotRectangularException() - - transposed = [ - [element.elements[i] for element in element.elements] - for i in range(n_columns) - ] - - return ListExpression( - *[ - Expression(Symbol(self.get_name()), ListExpression(*items)) - for items in transposed - ], - ) - - -class _RankedTake(Builtin): - messages = { - "intpm": "Expected non-negative integer at position `1` in `2`.", - "rank": "The specified rank `1` is not between 1 and `2`.", - } - - options = { - "ExcludedForms": "Automatic", - } - - def _compute(self, t, n, evaluation, options, f=None): - try: - limit = CountableInteger.from_expression(n) - except MessageException as e: - e.message(evaluation) - return - except NegativeIntegerException: - if f: - args = (3, Expression(self.get_name(), t, f, n)) - else: - args = (2, Expression(self.get_name(), t, n)) - evaluation.message(self.get_name(), "intpm", *args) - return - - if limit is None: - return - - if limit == 0: - return ListExpression() - else: - excluded = self.get_option(options, "ExcludedForms", evaluation) - if excluded: - if ( - isinstance(excluded, Symbol) - and excluded.get_name() == "System`Automatic" - ): - - def exclude(item): - if isinstance(item, Symbol) and item.get_name() in ( - "System`None", - "System`Null", - "System`Indeterminate", - ): - return True - elif item.get_head_name() == "System`Missing": - return True - else: - return False - - else: - excluded = Expression(SymbolAlternatives, *excluded.elements) - - def exclude(item): - return ( - Expression(SymbolMatchQ, item, excluded).evaluate( - evaluation - ) - is SymbolTrue - ) - - filtered = [element for element in t.elements if not exclude(element)] - else: - filtered = t.elements - - if limit > len(filtered): - if not limit.is_upper_limit(): - evaluation.message( - self.get_name(), "rank", limit.get_int_value(), len(filtered) - ) - return - else: - py_n = len(filtered) - else: - py_n = limit.get_int_value() - - if py_n < 1: - return ListExpression() - - if f: - heap = [ - (Expression(f, element).evaluate(evaluation), element, i) - for i, element in enumerate(filtered) - ] - element_pos = 1 # in tuple above - else: - heap = [(element, i) for i, element in enumerate(filtered)] - element_pos = 0 # in tuple above - - if py_n == 1: - result = [self._get_1(heap)] - else: - result = self._get_n(py_n, heap) - - return t.restructure("List", [x[element_pos] for x in result], evaluation) - - -class _RankedTakeSmallest(_RankedTake): - def _get_1(self, a): - return min(a) - - def _get_n(self, n, heap): - return heapq.nsmallest(n, heap) - - -class _RankedTakeLargest(_RankedTake): - def _get_1(self, a): - return max(a) - - def _get_n(self, n, heap): - return heapq.nlargest(n, heap) - - -class TakeLargestBy(_RankedTakeLargest): - """ - :WMA link:https://reference.wolfram.com/language/ref/TakeLargestBy.html - -
-
'TakeLargestBy[$list$, $f$, $n$]' -
returns the a sorted list of the $n$ largest items in $list$ - using $f$ to retrieve the items' keys to compare them. -
- - For details on how to use the ExcludedForms option, see TakeLargest[]. - - >> TakeLargestBy[{{1, -1}, {10, 100}, {23, 7, 8}, {5, 1}}, Total, 2] - = {{10, 100}, {23, 7, 8}} - - >> TakeLargestBy[{"abc", "ab", "x"}, StringLength, 1] - = {abc} - """ - - summary_text = "sublist of n largest elements according to a given criteria" - - def eval(self, element, f, n, evaluation, options): - "TakeLargestBy[element_List, f_, n_, OptionsPattern[TakeLargestBy]]" - return self._compute(element, n, evaluation, options, f=f) - - -class TakeSmallestBy(_RankedTakeSmallest): - """ - :WMA link:https://reference.wolfram.com/language/ref/TakeSmallestBy.html - -
-
'TakeSmallestBy[$list$, $f$, $n$]' -
returns the a sorted list of the $n$ smallest items in $list$ - using $f$ to retrieve the items' keys to compare them. -
- - For details on how to use the ExcludedForms option, see TakeLargest[]. - - >> TakeSmallestBy[{{1, -1}, {10, 100}, {23, 7, 8}, {5, 1}}, Total, 2] - = {{1, -1}, {5, 1}} - - >> TakeSmallestBy[{"abc", "ab", "x"}, StringLength, 1] - = {x} - """ - - summary_text = "sublist of n largest elements according to a criteria" - - def eval(self, element, f, n, evaluation, options): - "TakeSmallestBy[element_List, f_, n_, OptionsPattern[TakeSmallestBy]]" - return self._compute(element, n, evaluation, options, f=f) - - -class _IllegalPaddingDepth(Exception): - def __init__(self, level): - self.level = level - - -class _Pad(Builtin): - messages = { - "normal": "Expression at position 1 in `` must not be an atom.", - "level": "Cannot pad list `3` which has `4` using padding `1` which specifies `2`.", - "ilsm": "Expected an integer or a list of integers at position `1` in `2`.", - } - - rules = {"%(name)s[l_]": "%(name)s[l, Automatic]"} - - @staticmethod - def _find_dims(expr): - def dive(expr, level): - if isinstance(expr, Expression): - if expr.elements: - return max(dive(x, level + 1) for x in expr.elements) - else: - return level + 1 - else: - return level - - def calc(expr, dims, level): - if isinstance(expr, Expression): - for x in expr.elements: - calc(x, dims, level + 1) - dims[level] = max(dims[level], len(expr.elements)) - - dims = [0] * dive(expr, 0) - calc(expr, dims, 0) - return dims - - @staticmethod - def _build( - element, n, x, m, level, mode - ): # mode < 0 for left pad, > 0 for right pad - if not n: - return element - if not isinstance(element, Expression): - raise _IllegalPaddingDepth(level) - - if isinstance(m, (list, tuple)): - current_m = m[0] if m else 0 - next_m = m[1:] - else: - current_m = m - next_m = m - - def clip(a, d, s): - assert d != 0 - if s < 0: - return a[-d:] # end with a[-1] - else: - return a[:d] # start with a[0] - - def padding(amount, sign): - if amount == 0: - return [] - elif len(n) > 1: - return [ - _Pad._build(ListExpression(), n[1:], x, next_m, level + 1, mode) - ] * amount - else: - return clip(x * (1 + amount // len(x)), amount, sign) - - elements = element.elements - d = n[0] - len(elements) - if d < 0: - new_elements = clip(elements, d, mode) - padding_main = [] - elif d >= 0: - new_elements = elements - padding_main = padding(d, mode) - - if current_m > 0: - padding_margin = padding( - min(current_m, len(new_elements) + len(padding_main)), -mode - ) - - if len(padding_margin) > len(padding_main): - padding_main = [] - new_elements = clip( - new_elements, -(len(padding_margin) - len(padding_main)), mode - ) - elif len(padding_margin) > 0: - padding_main = clip(padding_main, -len(padding_margin), mode) - else: - padding_margin = [] - - if len(n) > 1: - new_elements = ( - _Pad._build(e, n[1:], x, next_m, level + 1, mode) for e in new_elements - ) - - if mode < 0: - parts = (padding_main, new_elements, padding_margin) - else: - parts = (padding_margin, new_elements, padding_main) - - return Expression(element.get_head(), *list(chain(*parts))) - - def _pad(self, in_l, in_n, in_x, in_m, evaluation, expr): - if not isinstance(in_l, Expression): - evaluation.message(self.get_name(), "normal", expr()) - return - - py_n = None - if isinstance(in_n, Symbol) and in_n.get_name() == "System`Automatic": - py_n = _Pad._find_dims(in_l) - elif in_n.get_head_name() == "System`List": - if all(isinstance(element, Integer) for element in in_n.elements): - py_n = [element.get_int_value() for element in in_n.elements] - elif isinstance(in_n, Integer): - py_n = [in_n.get_int_value()] - - if py_n is None: - evaluation.message(self.get_name(), "ilsm", 2, expr()) - return - - if in_x.get_head_name() == "System`List": - py_x = in_x.elements - else: - py_x = [in_x] - - if isinstance(in_m, Integer): - py_m = in_m.get_int_value() - else: - if not all(isinstance(x, Integer) for x in in_m.elements): - evaluation.message(self.get_name(), "ilsm", 4, expr()) - return - py_m = [x.get_int_value() for x in in_m.elements] - - try: - return _Pad._build(in_l, py_n, py_x, py_m, 1, self._mode) - except _IllegalPaddingDepth as e: - - def levels(k): - if k == 1: - return "1 level" - else: - return "%d levels" % k - - evaluation.message( - self.get_name(), - "level", - in_n, - levels(len(py_n)), - in_l, - levels(e.level - 1), - ) - return None - - def eval_zero(self, element, n, evaluation): - "%(name)s[element_, n_]" - return self._pad( - element, - n, - Integer0, - Integer0, - evaluation, - lambda: Expression(self.get_name(), element, n), - ) - - def eval(self, element, n, x, evaluation): - "%(name)s[element_, n_, x_]" - return self._pad( - element, - n, - x, - Integer0, - evaluation, - lambda: Expression(self.get_name(), element, n, x), - ) - - def eval_margin(self, element, n, x, m, evaluation): - "%(name)s[element_, n_, x_, m_]" - return self._pad( - element, - n, - x, - m, - evaluation, - lambda: Expression(self.get_name(), element, n, x, m), - ) - - -class PadLeft(_Pad): - """ - :WMA link:https://reference.wolfram.com/language/ref/PadLeft.html - -
-
'PadLeft[$list$, $n$]' -
pads $list$ to length $n$ by adding 0 on the left. -
'PadLeft[$list$, $n$, $x$]' -
pads $list$ to length $n$ by adding $x$ on the left. -
'PadLeft[$list$, {$n1$, $n2, ...}, $x$]' -
pads $list$ to lengths $n1$, $n2$ at levels 1, 2, ... respectively by adding $x$ on the left. -
'PadLeft[$list$, $n$, $x$, $m$]' -
pads $list$ to length $n$ by adding $x$ on the left and adding a margin of $m$ on the right. -
'PadLeft[$list$, $n$, $x$, {$m1$, $m2$, ...}]' -
pads $list$ to length $n$ by adding $x$ on the left and adding margins of $m1$, $m2$, ... - on levels 1, 2, ... on the right. -
'PadLeft[$list$]' -
turns the ragged list $list$ into a regular list by adding 0 on the left. -
- - >> PadLeft[{1, 2, 3}, 5] - = {0, 0, 1, 2, 3} - >> PadLeft[x[a, b, c], 5] - = x[0, 0, a, b, c] - >> PadLeft[{1, 2, 3}, 2] - = {2, 3} - >> PadLeft[{{}, {1, 2}, {1, 2, 3}}] - = {{0, 0, 0}, {0, 1, 2}, {1, 2, 3}} - >> PadLeft[{1, 2, 3}, 10, {a, b, c}, 2] - = {b, c, a, b, c, 1, 2, 3, a, b} - >> PadLeft[{{1, 2, 3}}, {5, 2}, x, 1] - = {{x, x}, {x, x}, {x, x}, {3, x}, {x, x}} - """ - - _mode = -1 - summary_text = "pad out by the left a ragged array to make a matrix" - - -class PadRight(_Pad): - """ - :WMA link:https://reference.wolfram.com/language/ref/PadRight.html - -
-
'PadRight[$list$, $n$]' -
pads $list$ to length $n$ by adding 0 on the right. -
'PadRight[$list$, $n$, $x$]' -
pads $list$ to length $n$ by adding $x$ on the right. -
'PadRight[$list$, {$n1$, $n2, ...}, $x$]' -
pads $list$ to lengths $n1$, $n2$ at levels 1, 2, ... respectively by adding $x$ on the right. -
'PadRight[$list$, $n$, $x$, $m$]' -
pads $list$ to length $n$ by adding $x$ on the left and adding a margin of $m$ on the left. -
'PadRight[$list$, $n$, $x$, {$m1$, $m2$, ...}]' -
pads $list$ to length $n$ by adding $x$ on the right and adding margins of $m1$, $m2$, ... - on levels 1, 2, ... on the left. -
'PadRight[$list$]' -
turns the ragged list $list$ into a regular list by adding 0 on the right. -
- - >> PadRight[{1, 2, 3}, 5] - = {1, 2, 3, 0, 0} - >> PadRight[x[a, b, c], 5] - = x[a, b, c, 0, 0] - >> PadRight[{1, 2, 3}, 2] - = {1, 2} - >> PadRight[{{}, {1, 2}, {1, 2, 3}}] - = {{0, 0, 0}, {1, 2, 0}, {1, 2, 3}} - >> PadRight[{1, 2, 3}, 10, {a, b, c}, 2] - = {b, c, 1, 2, 3, a, b, c, a, b} - >> PadRight[{{1, 2, 3}}, {5, 2}, x, 1] - = {{x, x}, {x, 1}, {x, x}, {x, x}, {x, x}} - """ - - _mode = 1 - summary_text = "pad out by the right a ragged array to make a matrix" - - -class _IllegalDistance(Exception): - def __init__(self, distance): - self.distance = distance - - -class _IllegalDataPoint(Exception): - pass - - -def _to_real_distance(d): - if not isinstance(d, (Real, Integer)): - raise _IllegalDistance(d) - - mpd = d.to_mpmath() - if mpd is None or mpd < 0: - raise _IllegalDistance(d) - - return mpd - - -class _PrecomputedDistances(PrecomputedDistances): - # computes all n^2 distances for n points with one big evaluation in the beginning. - - def __init__(self, df, p, evaluation): - distances_form = [df(p[i], p[j]) for i in range(len(p)) for j in range(i)] - distances = eval_N(ListExpression(*distances_form), evaluation) - mpmath_distances = [_to_real_distance(d) for d in distances.elements] - super(_PrecomputedDistances, self).__init__(mpmath_distances) - - -class _LazyDistances(LazyDistances): - # computes single distances only as needed, caches already computed distances. - - def __init__(self, df, p, evaluation): - super(_LazyDistances, self).__init__() - self._df = df - self._p = p - self._evaluation = evaluation - - def _compute_distance(self, i, j): - p = self._p - d = eval_N(self._df(p[i], p[j]), self._evaluation) - return _to_real_distance(d) - - -def _dist_repr(p): - dist_p = repr_p = None - if p.has_form("Rule", 2): - if all(q.get_head_name() == "System`List" for q in p.elements): - dist_p, repr_p = (q.elements for q in p.elements) - elif ( - p.elements[0].get_head_name() == "System`List" - and p.elements[1].get_name() == "System`Automatic" - ): - dist_p = p.elements[0].elements - repr_p = [Integer(i + 1) for i in range(len(dist_p))] - elif p.get_head_name() == "System`List": - if all(q.get_head_name() == "System`Rule" for q in p.elements): - dist_p, repr_p = ([q.elements[i] for q in p.elements] for i in range(2)) - else: - dist_p = repr_p = p.elements - return dist_p, repr_p - - -class _Cluster(Builtin): - options = { - "Method": "Optimize", - "DistanceFunction": "Automatic", - "RandomSeed": "Automatic", - } - - messages = { - "amtd": "`1` failed to pick a suitable distance function for `2`.", - "bdmtd": 'Method in `` must be either "Optimize", "Agglomerate" or "KMeans".', - "intpm": "Positive integer expected at position 2 in ``.", - "list": "Expected a list or a rule with equally sized lists at position 1 in ``.", - "nclst": "Cannot find more clusters than there are elements: `1` is larger than `2`.", - "xnum": "The distance function returned ``, which is not a non-negative real value.", - "rseed": "The random seed specified through `` must be an integer or Automatic.", - "kmsud": "KMeans only supports SquaredEuclideanDistance as distance measure.", - } - - _criteria = { - "Optimize": AutomaticSplitCriterion, - "Agglomerate": AutomaticMergeCriterion, - "KMeans": None, - } - - def _cluster(self, p, k, mode, evaluation, options, expr): - method_string, method = self.get_option_string(options, "Method", evaluation) - if method_string not in ("Optimize", "Agglomerate", "KMeans"): - evaluation.message( - self.get_name(), "bdmtd", Expression(SymbolRule, "Method", method) - ) - return - - dist_p, repr_p = _dist_repr(p) - - if dist_p is None or len(dist_p) != len(repr_p): - evaluation.message(self.get_name(), "list", expr) - return - - if not dist_p: - return ListExpression() - - if k is not None: # the number of clusters k is specified as an integer. - if not isinstance(k, Integer): - evaluation.message(self.get_name(), "intpm", expr) - return - py_k = k.get_int_value() - if py_k < 1: - evaluation.message(self.get_name(), "intpm", expr) - return - if py_k > len(dist_p): - evaluation.message(self.get_name(), "nclst", py_k, len(dist_p)) - return - elif py_k == 1: - return ListExpression(*repr_p) - elif py_k == len(dist_p): - return ListExpression(*[ListExpression(q) for q in repr_p]) - else: # automatic detection of k. choose a suitable method here. - if len(dist_p) <= 2: - return ListExpression(*repr_p) - constructor = self._criteria.get(method_string) - py_k = (constructor, {}) if constructor else None - - seed_string, seed = self.get_option_string(options, "RandomSeed", evaluation) - if seed_string == "Automatic": - py_seed = 12345 - elif isinstance(seed, Integer): - py_seed = seed.get_int_value() - else: - evaluation.message( - self.get_name(), "rseed", Expression(SymbolRule, "RandomSeed", seed) - ) - return - - distance_function_string, distance_function = self.get_option_string( - options, "DistanceFunction", evaluation - ) - if distance_function_string == "Automatic": - from mathics.builtin.tensors import get_default_distance - - distance_function = get_default_distance(dist_p) - if distance_function is None: - name_of_builtin = strip_context(self.get_name()) - evaluation.message( - self.get_name(), - "amtd", - name_of_builtin, - ListExpression(*dist_p), - ) - return - if method_string == "KMeans" and distance_function is not Symbol( - "SquaredEuclideanDistance" - ): - evaluation.message(self.get_name(), "kmsud") - return - - def df(i, j) -> Expression: - return Expression(distance_function, i, j) - - try: - if method_string == "Agglomerate": - clusters = self._agglomerate(mode, repr_p, dist_p, py_k, df, evaluation) - elif method_string == "Optimize": - clusters = optimize( - repr_p, py_k, _LazyDistances(df, dist_p, evaluation), mode, py_seed - ) - elif method_string == "KMeans": - clusters = self._kmeans(mode, repr_p, dist_p, py_k, py_seed, evaluation) - except _IllegalDistance as e: - evaluation.message(self.get_name(), "xnum", e.distance) - return - except _IllegalDataPoint: - name_of_builtin = strip_context(self.get_name()) - evaluation.message( - self.get_name(), - "amtd", - name_of_builtin, - ListExpression(*dist_p), - ) - return - - if mode == "clusters": - return ListExpression(*[ListExpression(*c) for c in clusters]) - elif mode == "components": - return to_mathics_list(*clusters) - else: - raise ValueError("illegal mode %s" % mode) - - def _agglomerate(self, mode, repr_p, dist_p, py_k, df, evaluation): - if mode == "clusters": - clusters = agglomerate( - repr_p, py_k, _PrecomputedDistances(df, dist_p, evaluation), mode - ) - elif mode == "components": - clusters = agglomerate( - repr_p, py_k, _PrecomputedDistances(df, dist_p, evaluation), mode - ) - - return clusters - - def _kmeans(self, mode, repr_p, dist_p, py_k, py_seed, evaluation): - items = [] - - def convert_scalars(p): - for q in p: - if not isinstance(q, (Real, Integer)): - raise _IllegalDataPoint - mpq = q.to_mpmath() - if mpq is None: - raise _IllegalDataPoint - items.append(q) - yield mpq - - def convert_vectors(p): - d = None - for q in p: - if q.get_head_name() != "System`List": - raise _IllegalDataPoint - v = list(convert_scalars(q.elements)) - if d is None: - d = len(v) - elif len(v) != d: - raise _IllegalDataPoint - yield v - - if dist_p[0].is_numeric(evaluation): - numeric_p = [[x] for x in convert_scalars(dist_p)] - else: - numeric_p = list(convert_vectors(dist_p)) - - # compute epsilon similar to Real.__eq__, such that "numbers that differ in their last seven binary digits - # are considered equal" + >> ListQ[{{1, 2}, {3, 4}}] + = True + >> ListQ[x] + = False + """ - prec = min_prec(*items) or machine_precision - eps = 0.5 ** (prec - 7) + summary_text = "test if an expression is a list" - return kmeans(numeric_p, repr_p, py_k, mode, py_seed, eps) + def test(self, expr): + return expr.get_head_name() == "System`List" -class FindClusters(_Cluster): +class None_(Predefined): """ - :WMA link:https://reference.wolfram.com/language/ref/FindClusters.html + :WMA link:https://reference.wolfram.com/language/ref/None.html
-
'FindClusters[$list$]' -
returns a list of clusters formed from the elements of $list$. The number of cluster is determined - automatically. -
'FindClusters[$list$, $k$]' -
returns a list of $k$ clusters formed from the elements of $list$. +
'None' +
is a possible value for 'Span' and 'Quiet'.
+ """ - >> FindClusters[{1, 2, 20, 10, 11, 40, 19, 42}] - = {{1, 2, 20, 10, 11, 19}, {40, 42}} - - >> FindClusters[{25, 100, 17, 20}] - = {{25, 17, 20}, {100}} - - >> FindClusters[{3, 6, 1, 100, 20, 5, 25, 17, -10, 2}] - = {{3, 6, 1, 5, -10, 2}, {100}, {20, 25, 17}} + name = "None" + summary_text = "not any part" - >> FindClusters[{1, 2, 10, 11, 20, 21}] - = {{1, 2}, {10, 11}, {20, 21}} - >> FindClusters[{1, 2, 10, 11, 20, 21}, 2] - = {{1, 2, 10, 11}, {20, 21}} +class NotListQ(Test): + """ + :WMA link:https://reference.wolfram.com/language/ref/NotListQ.html - >> FindClusters[{1 -> a, 2 -> b, 10 -> c}] - = {{a, b}, {c}} +
+
'NotListQ[$expr$]' +
returns true if $expr$ is not a list. +
+ """ - >> FindClusters[{1, 2, 5} -> {a, b, c}] - = {{a, b}, {c}} + summary_text = "test if an expression is not a list" - >> FindClusters[{1, 2, 3, 1, 2, 10, 100}, Method -> "Agglomerate"] - = {{1, 2, 3, 1, 2, 10}, {100}} + def test(self, expr): + return expr.get_head_name() != "System`List" - >> FindClusters[{1, 2, 3, 10, 17, 18}, Method -> "Agglomerate"] - = {{1, 2, 3}, {10}, {17, 18}} - >> FindClusters[{{1}, {5, 6}, {7}, {2, 4}}, DistanceFunction -> (Abs[Length[#1] - Length[#2]]&)] - = {{{1}, {7}}, {{5, 6}, {2, 4}}} +class _NotRectangularException(Exception): + pass - >> FindClusters[{"meep", "heap", "deep", "weep", "sheep", "leap", "keep"}, 3] - = {{meep, deep, weep, keep}, {heap, leap}, {sheep}} - FindClusters' automatic distance function detection supports scalars, numeric tensors, boolean vectors and - strings. +class _Rectangular(Builtin): + # A helper for Builtins X that allow X[{a1, a2, ...}, {b1, b2, ...}, ...] to be evaluated + # as {X[{a1, b1, ...}, {a1, b2, ...}, ...]}. - The Method option must be either "Agglomerate" or "Optimize". If not specified, it defaults to "Optimize". - Note that the Agglomerate and Optimize methods usually produce different clusterings. + def rect(self, element): + lengths = [len(element.elements) for element in element.elements] + if all(length == 0 for length in lengths): + return # leave as is, without error - The runtime of the Agglomerate method is quadratic in the number of clustered points n, builds the clustering - from the bottom up, and is exact (no element of randomness). The Optimize method's runtime is linear in n, - Optimize builds the clustering from top down, and uses random sampling. - """ + n_columns = lengths[0] + if any(length != n_columns for length in lengths[1:]): + raise _NotRectangularException() - summary_text = "divide data into lists of similar elements" - - def eval(self, p, evaluation, options): - "FindClusters[p_, OptionsPattern[%(name)s]]" - return self._cluster( - p, - None, - "clusters", - evaluation, - options, - Expression(SymbolFindClusters, p, *options_to_rules(options)), - ) + transposed = [ + [element.elements[i] for element in element.elements] + for i in range(n_columns) + ] - def eval_manual_k(self, p, k: Integer, evaluation, options): - "FindClusters[p_, k_Integer, OptionsPattern[%(name)s]]" - return self._cluster( - p, - k, - "clusters", - evaluation, - options, - Expression(SymbolFindClusters, p, k, *options_to_rules(options)), + return ListExpression( + *[ + Expression(Symbol(self.get_name()), ListExpression(*items)) + for items in transposed + ], ) -class ClusteringComponents(_Cluster): - """ - :WMA link:https://reference.wolfram.com/language/ref/ClusteringComponents.html - -
-
'ClusteringComponents[$list$]' -
forms clusters from $list$ and returns a list of cluster indices, in which each - element shows the index of the cluster in which the corresponding element in $list$ - ended up. -
'ClusteringComponents[$list$, $k$]' -
forms $k$ clusters from $list$ and returns a list of cluster indices, in which - each element shows the index of the cluster in which the corresponding element in - $list$ ended up. -
- - For more detailed documentation regarding options and behavior, see FindClusters[]. - - >> ClusteringComponents[{1, 2, 3, 1, 2, 10, 100}] - = {1, 1, 1, 1, 1, 1, 2} - - >> ClusteringComponents[{10, 100, 20}, Method -> "KMeans"] - = {1, 0, 1} - """ - - summary_text = "label data with the index of the cluster it is in" - - def eval(self, p, evaluation, options): - "ClusteringComponents[p_, OptionsPattern[%(name)s]]" - return self._cluster( - p, - None, - "components", - evaluation, - options, - Expression(SymbolClusteringComponents, p, *options_to_rules(options)), - ) - - def eval_manual_k(self, p, k: Integer, evaluation, options): - "ClusteringComponents[p_, k_Integer, OptionsPattern[%(name)s]]" - return self._cluster( - p, - k, - "components", - evaluation, - options, - Expression(SymbolClusteringComponents, p, k, *options_to_rules(options)), - ) +class _RankedTake(Builtin): + messages = { + "intpm": "Expected non-negative integer at position `1` in `2`.", + "rank": "The specified rank `1` is not between 1 and `2`.", + } + options = { + "ExcludedForms": "Automatic", + } -class Nearest(Builtin): - """ - :WMA link:https://reference.wolfram.com/language/ref/Nearest.html + def _compute(self, t, n, evaluation, options, f=None): + try: + limit = CountableInteger.from_expression(n) + except MessageException as e: + e.message(evaluation) + return + except NegativeIntegerException: + if f: + args = (3, Expression(self.get_name(), t, f, n)) + else: + args = (2, Expression(self.get_name(), t, n)) + evaluation.message(self.get_name(), "intpm", *args) + return -
-
'Nearest[$list$, $x$]' -
returns the one item in $list$ that is nearest to $x$. + if limit is None: + return -
'Nearest[$list$, $x$, $n$]' -
returns the $n$ nearest items. + if limit == 0: + return ListExpression() + else: + excluded = self.get_option(options, "ExcludedForms", evaluation) + if excluded: + if ( + isinstance(excluded, Symbol) + and excluded.get_name() == "System`Automatic" + ): -
'Nearest[$list$, $x$, {$n$, $r$}]' -
returns up to $n$ nearest items that are not farther from $x$ than $r$. + def exclude(item): + if isinstance(item, Symbol) and item.get_name() in ( + "System`None", + "System`Null", + "System`Indeterminate", + ): + return True + elif item.get_head_name() == "System`Missing": + return True + else: + return False -
'Nearest[{$p1$ -> $q1$, $p2$ -> $q2$, ...}, $x$]' -
returns $q1$, $q2$, ... but measures the distances using $p1$, $p2$, ... + else: + excluded = Expression(SymbolAlternatives, *excluded.elements) -
'Nearest[{$p1$, $p2$, ...} -> {$q1$, $q2$, ...}, $x$]' -
returns $q1$, $q2$, ... but measures the distances using $p1$, $p2$, ... -
+ def exclude(item): + return ( + Expression(SymbolMatchQ, item, excluded).evaluate( + evaluation + ) + is SymbolTrue + ) - >> Nearest[{5, 2.5, 10, 11, 15, 8.5, 14}, 12] - = {11} + filtered = [element for element in t.elements if not exclude(element)] + else: + filtered = t.elements - Return all items within a distance of 5: + if limit > len(filtered): + if not limit.is_upper_limit(): + evaluation.message( + self.get_name(), "rank", limit.get_int_value(), len(filtered) + ) + return + else: + py_n = len(filtered) + else: + py_n = limit.get_int_value() - >> Nearest[{5, 2.5, 10, 11, 15, 8.5, 14}, 12, {All, 5}] - = {11, 10, 14} + if py_n < 1: + return ListExpression() - >> Nearest[{Blue -> "blue", White -> "white", Red -> "red", Green -> "green"}, {Orange, Gray}] - = {{red}, {white}} + if f: + heap = [ + (Expression(f, element).evaluate(evaluation), element, i) + for i, element in enumerate(filtered) + ] + element_pos = 1 # in tuple above + else: + heap = [(element, i) for i, element in enumerate(filtered)] + element_pos = 0 # in tuple above - >> Nearest[{{0, 1}, {1, 2}, {2, 3}} -> {a, b, c}, {1.1, 2}] - = {b} - """ + if py_n == 1: + result = [self._get_1(heap)] + else: + result = self._get_n(py_n, heap) - messages = { - "amtd": "`1` failed to pick a suitable distance function for `2`.", - "list": "Expected a list or a rule with equally sized lists at position 1 in ``.", - "nimp": "Method `1` is not implemented yet.", - } + return t.restructure("List", [x[element_pos] for x in result], evaluation) - options = { - "DistanceFunction": "Automatic", - "Method": '"Scan"', - } - rules = { - "Nearest[list_, pattern_]": "Nearest[list, pattern, 1]", - "Nearest[pattern_][list_]": "Nearest[list, pattern]", - } - summary_text = "the nearest element from a list" +class _RankedTakeSmallest(_RankedTake): + def _get_1(self, a): + return min(a) - def eval(self, items, pivot, limit, expression, evaluation, options): - "Nearest[items_, pivot_, limit_, OptionsPattern[%(name)s]]" + def _get_n(self, n, heap): + return heapq.nsmallest(n, heap) - method = self.get_option(options, "Method", evaluation) - if not isinstance(method, String) or method.get_string_value() != "Scan": - evaluation("Nearest", "nimp", method) - return - dist_p, repr_p = _dist_repr(items) +class _RankedTakeLargest(_RankedTake): + def _get_1(self, a): + return max(a) - if dist_p is None or len(dist_p) != len(repr_p): - evaluation.message(self.get_name(), "list", expression) - return + def _get_n(self, n, heap): + return heapq.nlargest(n, heap) - if limit.has_form("List", 2): - up_to = limit.elements[0] - py_r = limit.elements[1].to_mpmath() - else: - up_to = limit - py_r = None - if isinstance(up_to, Integer): - py_n = up_to.get_int_value() - elif up_to.get_name() == "System`All": - py_n = None - else: - return +class TakeLargestBy(_RankedTakeLargest): + """ + :WMA link:https://reference.wolfram.com/language/ref/TakeLargestBy.html - if not dist_p or (py_n is not None and py_n < 1): - return ListExpression() +
+
'TakeLargestBy[$list$, $f$, $n$]' +
returns the a sorted list of the $n$ largest items in $list$ + using $f$ to retrieve the items' keys to compare them. +
- multiple_x = False + For details on how to use the ExcludedForms option, see TakeLargest[]. - distance_function_string, distance_function = self.get_option_string( - options, "DistanceFunction", evaluation - ) - if distance_function_string == "Automatic": - from mathics.builtin.tensors import get_default_distance + >> TakeLargestBy[{{1, -1}, {10, 100}, {23, 7, 8}, {5, 1}}, Total, 2] + = {{10, 100}, {23, 7, 8}} - distance_function = get_default_distance(dist_p) - if distance_function is None: - evaluation.message( - self.get_name(), "amtd", "Nearest", ListExpression(*dist_p) - ) - return + >> TakeLargestBy[{"abc", "ab", "x"}, StringLength, 1] + = {abc} + """ - if pivot.get_head_name() == "System`List": - _, depth_x = walk_levels(pivot) - _, depth_items = walk_levels(dist_p[0]) + summary_text = "sublist of n largest elements according to a given criteria" - if depth_x > depth_items: - multiple_x = True + def eval(self, element, f, n, evaluation, options): + "TakeLargestBy[element_List, f_, n_, OptionsPattern[TakeLargestBy]]" + return self._compute(element, n, evaluation, options, f=f) - def nearest(x) -> ListExpression: - calls = [Expression(distance_function, x, y) for y in dist_p] - distances = ListExpression(*calls).evaluate(evaluation) - if not distances.has_form("List", len(dist_p)): - raise ValueError() +class TakeSmallestBy(_RankedTakeSmallest): + """ + :WMA link:https://reference.wolfram.com/language/ref/TakeSmallestBy.html - py_distances = [ - (_to_real_distance(d), i) for i, d in enumerate(distances.elements) - ] +
+
'TakeSmallestBy[$list$, $f$, $n$]' +
returns the a sorted list of the $n$ smallest items in $list$ + using $f$ to retrieve the items' keys to compare them. +
- if py_r is not None: - py_distances = [(d, i) for d, i in py_distances if d <= py_r] + For details on how to use the ExcludedForms option, see TakeLargest[]. - def pick(): - if py_n is None: - candidates = sorted(py_distances) - else: - candidates = heapq.nsmallest(py_n, py_distances) + >> TakeSmallestBy[{{1, -1}, {10, 100}, {23, 7, 8}, {5, 1}}, Total, 2] + = {{1, -1}, {5, 1}} - for d, i in candidates: - yield repr_p[i] + >> TakeSmallestBy[{"abc", "ab", "x"}, StringLength, 1] + = {x} + """ - return ListExpression(*list(pick())) + summary_text = "sublist of n largest elements according to a criteria" - try: - if not multiple_x: - return nearest(pivot) - else: - return ListExpression(*[nearest(t) for t in pivot.elements]) - except _IllegalDistance: - return SymbolFailed - except ValueError: - return SymbolFailed + def eval(self, element, f, n, evaluation, options): + "TakeSmallestBy[element_List, f_, n_, OptionsPattern[TakeSmallestBy]]" + return self._compute(element, n, evaluation, options, f=f) class SubsetQ(Builtin): @@ -2152,50 +1148,6 @@ def eval(self, expr, subset, evaluation): return SymbolFalse -def delete_one(expr, pos): - if isinstance(expr, Atom): - raise PartDepthError(pos) - elements = expr.elements - if pos == 0: - return Expression(SymbolSequence, *elements) - s = len(elements) - truepos = pos - if truepos < 0: - truepos = s + truepos - else: - truepos = truepos - 1 - if truepos < 0 or truepos >= s: - raise PartRangeError - elements = ( - elements[:truepos] - + (to_expression("System`Sequence"),) - + elements[truepos + 1 :] - ) - return to_expression(expr.get_head(), *elements) - - -def delete_rec(expr, pos): - if len(pos) == 1: - return delete_one(expr, pos[0]) - truepos = pos[0] - if truepos == 0 or isinstance(expr, Atom): - raise PartDepthError(pos[0]) - elements = expr.elements - s = len(elements) - if truepos < 0: - truepos = truepos + s - if truepos < 0: - raise PartRangeError - newelement = delete_rec(elements[truepos], pos[1:]) - elements = elements[:truepos] + (newelement,) + elements[truepos + 1 :] - else: - if truepos > s: - raise PartRangeError - newelement = delete_rec(elements[truepos - 1], pos[1:]) - elements = elements[: truepos - 1] + (newelement,) + elements[truepos:] - return Expression(expr.get_head(), *elements) - - # rules = {'Failure /: MakeBoxes[Failure[tag_, assoc_Association], StandardForm]' : # 'With[{msg = assoc["MessageTemplate"], msgParam = assoc["MessageParameters"], type = assoc["Type"]}, ToBoxes @ Interpretation["Failure" @ Panel @ Grid[{{Style["\[WarningSign]", "Message", FontSize -> 35], Style["Message:", FontColor->GrayLevel[0.5]], ToString[StringForm[msg, Sequence @@ msgParam], StandardForm]}, {SpanFromAbove, Style["Tag:", FontColor->GrayLevel[0.5]], ToString[tag, StandardForm]},{SpanFromAbove,Style["Type:", FontColor->GrayLevel[0.5]],ToString[type, StandardForm]}},Alignment -> {Left, Top}], Failure[tag, assoc]] /; msg =!= Missing["KeyAbsent", "MessageTemplate"] && msgParam =!= Missing["KeyAbsent", "MessageParameters"] && msgParam =!= Missing["KeyAbsent", "Type"]]', # } diff --git a/mathics/core/systemsymbols.py b/mathics/core/systemsymbols.py index 9b0aea436..a0ea3fefc 100644 --- a/mathics/core/systemsymbols.py +++ b/mathics/core/systemsymbols.py @@ -44,6 +44,7 @@ SymbolCatalan = Symbol("System`Cases") SymbolCatalan = Symbol("System`Catalan") SymbolCeiling = Symbol("System`Ceiling") +SymbolClusteringComponents = Symbol("System`ClusteringComponents") SymbolColorConvert = Symbol("System`ColorConvert") SymbolColorData = Symbol("System`ColorData") SymbolCompile = Symbol("System`Compile") @@ -53,6 +54,7 @@ SymbolCondition = Symbol("System`Condition") SymbolConditionalExpression = Symbol("System`ConditionalExpression") SymbolConjugate = Symbol("System`Conjugate") +SymbolContainsOnly = Symbol("System`ContainsOnly") SymbolContext = Symbol("System`$Context") SymbolContextPath = Symbol("System`$ContextPath") SymbolContinue = Symbol("System`Continue") @@ -78,6 +80,7 @@ SymbolFaceForm = Symbol("System`FaceForm") SymbolFactorial = Symbol("System`Factorial") SymbolFailed = Symbol("System`$Failed") +SymbolFindClusters = Symbol("System`FindClusters") SymbolFloor = Symbol("System`Floor") SymbolFormat = Symbol("System`Format") SymbolFractionBox = Symbol("System`FractionBox") @@ -188,6 +191,7 @@ SymbolSin = Symbol("System`Sin") SymbolSinh = Symbol("System`Sinh") SymbolSlot = Symbol("System`Slot") +SymbolSplit = Symbol("System`Split") SymbolSqrt = Symbol("System'Sqrt") SymbolSqrtBox = Symbol("System`SqrtBox") SymbolStandardForm = Symbol("System`StandardForm") diff --git a/mathics/eval/distance.py b/mathics/eval/distance.py new file mode 100644 index 000000000..34c041e7b --- /dev/null +++ b/mathics/eval/distance.py @@ -0,0 +1,43 @@ +""" +Distance-related evaluation functions and exception classes +""" +from mathics.core.atoms import Integer, Real + + +class IllegalDataPoint(Exception): + pass + + +class IllegalDistance(Exception): + def __init__(self, distance): + self.distance = distance + + +def dist_repr(p) -> tuple: + dist_p = repr_p = None + if p.has_form("Rule", 2): + if all(q.get_head_name() == "System`List" for q in p.elements): + dist_p, repr_p = (q.elements for q in p.elements) + elif ( + p.elements[0].get_head_name() == "System`List" + and p.elements[1].get_name() == "System`Automatic" + ): + dist_p = p.elements[0].elements + repr_p = [Integer(i + 1) for i in range(len(dist_p))] + elif p.get_head_name() == "System`List": + if all(q.get_head_name() == "System`Rule" for q in p.elements): + dist_p, repr_p = ([q.elements[i] for q in p.elements] for i in range(2)) + else: + dist_p = repr_p = p.elements + return dist_p, repr_p + + +def to_real_distance(d): + if not isinstance(d, (Real, Integer)): + raise IllegalDistance(d) + + mpd = d.to_mpmath() + if mpd is None or mpd < 0: + raise IllegalDistance(d) + + return mpd diff --git a/mathics/format/asy.py b/mathics/format/asy.py index 3b328ee4b..4e6dde734 100644 --- a/mathics/format/asy.py +++ b/mathics/format/asy.py @@ -750,4 +750,21 @@ def uniform_polyhedron_3d_box(self: RectangleBox, **options) -> str: ) +def tetrahedron_polyhedron_3d_box(self: RectangleBox, **options) -> str: + # l = self.style.get_line_width(face_element=True) + + face_color = self.face_color.to_js() if self.face_color else (1, 1, 1) + opacity = self.face_opacity + color_str = build_3d_pen_color(face_color, opacity) + + # Build an equalateral triangle: + # equilatrial = Polygon[{{1, 0}, {0, Sqrt[3]}, {-1, 0}}] + + # See https://stackoverflow.com/questions/4372556/given-three-points-on-a-tetrahedron-find-the-4th + + return ( + "// Tetrahedara3DBox\n // Still not really implemented. Draw a sphere instead\n" + ) + + add_conversion_fn(UniformPolyhedron3DBox, uniform_polyhedron_3d_box) From 5d0dceee2421b3cbc98a087f83882977764adf5f Mon Sep 17 00:00:00 2001 From: rocky Date: Wed, 4 Jan 2023 16:49:24 -0500 Subject: [PATCH 020/209] apply -> eval --- mathics/builtin/list/rearrange.py | 51 ++++++++++++++++++------------- 1 file changed, 30 insertions(+), 21 deletions(-) diff --git a/mathics/builtin/list/rearrange.py b/mathics/builtin/list/rearrange.py index b57cd3a87..5dbad21cd 100644 --- a/mathics/builtin/list/rearrange.py +++ b/mathics/builtin/list/rearrange.py @@ -224,7 +224,7 @@ def levels(k): ) return None - def eval_zero(self, element, n, evaluation): + def eval_zero(self, element, n, evaluation: Evaluation): "%(name)s[element_, n_]" return self._pad( element, @@ -235,7 +235,7 @@ def eval_zero(self, element, n, evaluation): lambda: Expression(self.get_name(), element, n), ) - def eval(self, element, n, x, evaluation): + def eval(self, element, n, x, evaluation: Evaluation): "%(name)s[element_, n_, x_]" return self._pad( element, @@ -246,7 +246,7 @@ def eval(self, element, n, x, evaluation): lambda: Expression(self.get_name(), element, n, x), ) - def eval_margin(self, element, n, x, m, evaluation): + def eval_margin(self, element, n, x, m, evaluation: Evaluation): "%(name)s[element_, n_, x_, m_]" return self._pad( element, @@ -308,7 +308,7 @@ class _GatherOperation(Builtin): ), } - def apply(self, values, test, evaluation: Evaluation): + def eval(self, values, test, evaluation: Evaluation): "%(name)s[values_, test_]" if not self._check_list(values, test, evaluation): return @@ -372,11 +372,11 @@ def _rotate(self, expr, n, evaluation: Evaluation): return expr.restructure(expr.head, new_elements, evaluation) - def apply_one(self, expr, evaluation: Evaluation): + def eval_one(self, expr, evaluation: Evaluation): "%(name)s[expr_]" return self._rotate(expr, [1], evaluation) - def apply(self, expr, n, evaluation: Evaluation): + def eval(self, expr, n, evaluation: Evaluation): "%(name)s[expr_, n_]" if isinstance(n, Integer): py_cycles = [n.get_int_value()] @@ -419,7 +419,7 @@ def _remove_duplicates(arg, same_test): result.append(a) return result - def apply(self, lists, evaluation, options={}): + def eval(self, lists, evaluation, options={}): "%(name)s[lists__, OptionsPattern[%(name)s]]" seq = lists.get_sequence() @@ -487,7 +487,7 @@ class Catenate(Builtin): summary_text = "catenate elements from a list of lists" messages = {"invrp": "`1` is not a list."} - def apply(self, lists, evaluation: Evaluation): + def eval(self, lists, evaluation: Evaluation): "Catenate[lists_List]" def parts(): @@ -651,7 +651,7 @@ class GatherBy(_GatherOperation): summary_text = "gather based on values of a function applied to elements" _bin = _GatherBin - def apply(self, values, func, evaluation: Evaluation): + def eval(self, values, func, evaluation: Evaluation): "%(name)s[values_, func_]" if not self._check_list(values, func, evaluation): @@ -704,7 +704,7 @@ class Join(Builtin): attributes = A_FLAT | A_ONE_IDENTITY | A_PROTECTED summary_text = "join lists together at any level" - def apply(self, lists, evaluation: Evaluation): + def eval(self, lists, evaluation: Evaluation): "Join[lists___]" result = [] @@ -855,12 +855,12 @@ def slices(): return outer(slices()) - def apply_no_overlap(self, li, n, evaluation: Evaluation): + def eval_no_overlap(self, li, n, evaluation: Evaluation): "Partition[li_List, n_Integer]" # TODO: Error checking return self._partition(li, n.get_int_value(), n.get_int_value(), evaluation) - def apply(self, li, n, d, evaluation: Evaluation): + def eval(self, li, n, d, evaluation: Evaluation): "Partition[li_List, n_Integer, d_Integer]" # TODO: Error checking return self._partition(li, n.get_int_value(), d.get_int_value(), evaluation) @@ -929,11 +929,11 @@ def _reverse( return expr - def apply_top_level(self, expr, evaluation: Evaluation): + def eval_top_level(self, expr, evaluation: Evaluation): "Reverse[expr_]" return Reverse._reverse(expr, 1, (1,), evaluation) - def apply(self, expr, levels, evaluation: Evaluation): + def eval(self, expr, levels, evaluation: Evaluation): "Reverse[expr_, levels_]" if isinstance(levels, Integer): py_levels = [levels.get_int_value()] @@ -1007,7 +1007,7 @@ class Riffle(Builtin): summary_text = "intersperse additional elements" - def apply(self, list, sep, evaluation: Evaluation): + def eval(self, list, sep, evaluation: Evaluation): "Riffle[list_List, sep_]" if sep.has_form("List", None): @@ -1020,7 +1020,9 @@ def apply(self, list, sep, evaluation: Evaluation): class RotateLeft(_Rotate): """ - :WMA link:https://reference.wolfram.com/language/ref/RotateLeft.html + + :WMA link: + https://reference.wolfram.com/language/ref/RotateLeft.html
'RotateLeft[$expr$]' @@ -1049,7 +1051,9 @@ class RotateLeft(_Rotate): class RotateRight(_Rotate): """ - :WMA link:https://reference.wolfram.com/language/ref/RotateRight.html + + :WMA link: + https://reference.wolfram.com/language/ref/RotateRight.html
'RotateRight[$expr$]' @@ -1226,10 +1230,12 @@ class Tally(_GatherOperation):
'Tally[$list$]' -
counts and returns the number of occurences of objects and returns the result as a list of pairs {object, count}. +
counts and returns the number of occurences of objects and returns \ + the result as a list of pairs {object, count}.
'Tally[$list$, $test$]' -
counts the number of occurences of objects and uses $test to determine if two objects should be counted in the same bin. +
counts the number of occurences of objects and uses $test to \ + determine if two objects should be counted in the same bin.
>> Tally[{a, b, c, b, a}] @@ -1246,11 +1252,14 @@ class Tally(_GatherOperation): class Union(_SetOperation): """ - :WMA link:https://reference.wolfram.com/language/ref/Union.html + + :WMA link: + https://reference.wolfram.com/language/ref/Union.html
'Union[$a$, $b$, ...]' -
gives the union of the given set or sets. The resulting list will be sorted and each element will only occur once. +
gives the union of the given set or sets. The resulting list \ + will be sorted and each element will only occur once.
>> Union[{5, 1, 3, 7, 1, 8, 3}] From b7c7e66f1dbded5862321c585cd1d43740067610 Mon Sep 17 00:00:00 2001 From: rocky Date: Wed, 4 Jan 2023 16:50:44 -0500 Subject: [PATCH 021/209] Remove future tetrahedron work --- mathics/format/asy.py | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/mathics/format/asy.py b/mathics/format/asy.py index 4e6dde734..3b328ee4b 100644 --- a/mathics/format/asy.py +++ b/mathics/format/asy.py @@ -750,21 +750,4 @@ def uniform_polyhedron_3d_box(self: RectangleBox, **options) -> str: ) -def tetrahedron_polyhedron_3d_box(self: RectangleBox, **options) -> str: - # l = self.style.get_line_width(face_element=True) - - face_color = self.face_color.to_js() if self.face_color else (1, 1, 1) - opacity = self.face_opacity - color_str = build_3d_pen_color(face_color, opacity) - - # Build an equalateral triangle: - # equilatrial = Polygon[{{1, 0}, {0, Sqrt[3]}, {-1, 0}}] - - # See https://stackoverflow.com/questions/4372556/given-three-points-on-a-tetrahedron-find-the-4th - - return ( - "// Tetrahedara3DBox\n // Still not really implemented. Draw a sphere instead\n" - ) - - add_conversion_fn(UniformPolyhedron3DBox, uniform_polyhedron_3d_box) From d5feb1d6c6430727f17ad84eec9c8c502cf3d686 Mon Sep 17 00:00:00 2001 From: rocky Date: Sat, 7 Jan 2023 04:41:57 -0500 Subject: [PATCH 022/209] builtin.list reduction mathics.eval expansion.. * Move mathics.builtin.list._IterationFunction to mathics.base.IterationFunction * Move eval-like routines out of mathics.builtin.arithmetic into mathics.eval.numbers * Move scoping routine out of builtin.base into mathics.eval.scoping --- mathics/builtin/arithmetic.py | 21 ++- mathics/builtin/base.py | 235 ++++++++++++++++++++++++++- mathics/builtin/list/constructing.py | 10 +- mathics/builtin/lists.py | 221 +------------------------ mathics/builtin/procedural.py | 5 +- mathics/eval/numbers.py | 35 ++++ mathics/eval/scoping.py | 55 +++++++ 7 files changed, 347 insertions(+), 235 deletions(-) create mode 100644 mathics/eval/numbers.py create mode 100644 mathics/eval/scoping.py diff --git a/mathics/builtin/arithmetic.py b/mathics/builtin/arithmetic.py index 049955ad6..68b5669ba 100644 --- a/mathics/builtin/arithmetic.py +++ b/mathics/builtin/arithmetic.py @@ -18,9 +18,14 @@ import mpmath import sympy -from mathics.builtin.base import Builtin, Predefined, SympyFunction, Test +from mathics.builtin.base import ( + Builtin, + IterationFunction, + Predefined, + SympyFunction, + Test, +) from mathics.builtin.inference import evaluate_predicate, get_assumptions_list -from mathics.builtin.lists import _IterationFunction from mathics.builtin.scoping import dynamic_scoping from mathics.core.atoms import ( Complex, @@ -980,7 +985,7 @@ def eval(self, expr, evaluation): return from_python(result) -class Product(_IterationFunction, SympyFunction): +class Product(IterationFunction, SympyFunction): """ :WMA link:https://reference.wolfram.com/language/ref/Product.html @@ -1030,7 +1035,7 @@ class Product(_IterationFunction, SympyFunction): sympy_name = "Product" - rules = _IterationFunction.rules.copy() + rules = IterationFunction.rules.copy() rules.update( { "MakeBoxes[Product[f_, {i_, a_, b_, 1}]," @@ -1299,7 +1304,7 @@ def eval_error(self, x, seqs, evaluation): return evaluation.message("Sign", "argx", Integer(len(seqs.get_sequence()) + 1)) -class Sum(_IterationFunction, SympyFunction): +class Sum(IterationFunction, SympyFunction): """ :WMA link:https://reference.wolfram.com/language/ref/Sum.html @@ -1317,6 +1322,7 @@ class Sum(_IterationFunction, SympyFunction):
evaluates $expr$ as a multiple sum, with {$i$, ...}, {$j$, ...}, ... being in outermost-to-innermost order.
+ A sum that Gauss in elementary school was asked to do to kill time: >> Sum[k, {k, 1, 10}] = 55 @@ -1353,6 +1359,9 @@ class Sum(_IterationFunction, SympyFunction): >> Sum[k, {k, I, I + 1}] = 1 + 2 I + >> Sum[k, {k, Range[5]}] + = 15 + >> Sum[f[i], {i, 1, 7}] = f[1] + f[2] + f[3] + f[4] + f[5] + f[6] + f[7] @@ -1381,7 +1390,7 @@ class Sum(_IterationFunction, SympyFunction): sympy_name = "Sum" - rules = _IterationFunction.rules.copy() + rules = IterationFunction.rules.copy() rules.update( { "MakeBoxes[Sum[f_, {i_, a_, b_, 1}]," diff --git a/mathics/builtin/base.py b/mathics/builtin/base.py index 7475c8e1e..16b32138a 100644 --- a/mathics/builtin/base.py +++ b/mathics/builtin/base.py @@ -9,8 +9,16 @@ import sympy -from mathics.core.atoms import Integer, MachineReal, PrecisionReal, String -from mathics.core.attributes import A_NO_ATTRIBUTES, A_PROTECTED +from mathics.core.atoms import ( + Integer, + Integer0, + Integer1, + MachineReal, + Number, + PrecisionReal, + String, +) +from mathics.core.attributes import A_HOLD_ALL, A_NO_ATTRIBUTES, A_PROTECTED from mathics.core.convert.expression import to_expression, to_numeric_sympy_args from mathics.core.convert.op import ascii_operator_to_symbol from mathics.core.convert.python import from_bool @@ -18,11 +26,31 @@ from mathics.core.definitions import Definition from mathics.core.exceptions import MessageException from mathics.core.expression import Expression, SymbolDefault +from mathics.core.interrupt import BreakInterrupt, ContinueInterrupt, ReturnInterrupt +from mathics.core.list import ListExpression from mathics.core.number import PrecisionValueError, get_precision from mathics.core.parser.util import PyMathicsDefinitions, SystemDefinitions from mathics.core.rules import BuiltinRule, Pattern, Rule -from mathics.core.symbols import BaseElement, Symbol, ensure_context, strip_context -from mathics.core.systemsymbols import SymbolMessageName, SymbolRule +from mathics.core.symbols import ( + BaseElement, + Symbol, + SymbolFalse, + SymbolPlus, + SymbolTrue, + ensure_context, + strip_context, +) +from mathics.core.systemsymbols import ( + SymbolGreaterEqual, + SymbolLess, + SymbolLessEqual, + SymbolMessageName, + SymbolRule, + SymbolSequence, +) +from mathics.eval.numbers import cancel +from mathics.eval.numerify import numerify +from mathics.eval.scoping import dynamic_scoping # Signals to Mathics doc processing not to include this module in its documentation. no_doc = True @@ -496,6 +524,205 @@ def get_name(self, short=False) -> str: return re.sub(r"Atom$", "", name) +class IterationFunction(Builtin): + attributes = A_HOLD_ALL | A_PROTECTED + allow_loopcontrol = False + throw_iterb = True + + def get_result(self, items): + pass + + def eval_symbol(self, expr, iterator, evaluation): + "%(name)s[expr_, iterator_Symbol]" + iterator = iterator.evaluate(evaluation) + if iterator.has_form(["List", "Range", "Sequence"], None): + elements = iterator.elements + if len(elements) == 1: + return self.apply_max(expr, *elements, evaluation) + elif len(elements) == 2: + if elements[1].has_form(["List", "Sequence"], None): + seq = Expression(SymbolSequence, *(elements[1].elements)) + return self.eval_list(expr, elements[0], seq, evaluation) + else: + return self.eval_range(expr, *elements, evaluation) + elif len(elements) == 3: + return self.eval_iter_nostep(expr, *elements, evaluation) + elif len(elements) == 4: + return self.eval_iter(expr, *elements, evaluation) + + if self.throw_iterb: + evaluation.message(self.get_name(), "iterb") + return + + def eval_range(self, expr, i, imax, evaluation): + "%(name)s[expr_, {i_Symbol, imax_}]" + imax = imax.evaluate(evaluation) + if imax.has_form("Range", None): + # FIXME: this should work as an iterator in Python3, not + # building the sequence explicitly... + seq = Expression(SymbolSequence, *(imax.evaluate(evaluation).elements)) + return self.apply_list(expr, i, seq, evaluation) + elif imax.has_form("List", None): + seq = Expression(SymbolSequence, *(imax.elements)) + return self.eval_list(expr, i, seq, evaluation) + else: + return self.eval_iter(expr, i, Integer1, imax, Integer1, evaluation) + + def eval_max(self, expr, imax, evaluation): + "%(name)s[expr_, {imax_}]" + + # Even though `imax` should be an integeral value, its type does not + # have to be an Integer. + + result = [] + + def do_iteration(): + evaluation.check_stopped() + try: + result.append(expr.evaluate(evaluation)) + except ContinueInterrupt: + if self.allow_loopcontrol: + pass + else: + raise + except BreakInterrupt: + if self.allow_loopcontrol: + raise StopIteration + else: + raise + except ReturnInterrupt as e: + if self.allow_loopcontrol: + return e.expr + else: + raise + + if isinstance(imax, Integer): + try: + for _ in range(imax.value): + do_iteration() + except StopIteration: + pass + + else: + imax = imax.evaluate(evaluation) + imax = numerify(imax, evaluation) + if isinstance(imax, Number): + imax = imax.round() + py_max = imax.get_float_value() + if py_max is None: + if self.throw_iterb: + evaluation.message(self.get_name(), "iterb") + return + + index = 0 + try: + while index < py_max: + do_iteration() + index += 1 + except StopIteration: + pass + + return self.get_result(result) + + def eval_iter_nostep(self, expr, i, imin, imax, evaluation): + "%(name)s[expr_, {i_Symbol, imin_, imax_}]" + return self.eval_iter(expr, i, imin, imax, Integer1, evaluation) + + def eval_iter(self, expr, i, imin, imax, di, evaluation): + "%(name)s[expr_, {i_Symbol, imin_, imax_, di_}]" + + if isinstance(self, SympyFunction) and di.get_int_value() == 1: + whole_expr = to_expression( + self.get_name(), expr, ListExpression(i, imin, imax) + ) + sympy_expr = whole_expr.to_sympy(evaluation=evaluation) + if sympy_expr is None: + return None + + # apply Together to produce results similar to Mathematica + result = sympy.together(sympy_expr) + result = from_sympy(result) + result = cancel(result) + + if not result.sameQ(whole_expr): + return result + return + + index = imin.evaluate(evaluation) + imax = imax.evaluate(evaluation) + di = di.evaluate(evaluation) + + result = [] + compare_type = ( + SymbolGreaterEqual + if Expression(SymbolLess, di, Integer0).evaluate(evaluation).to_python() + else SymbolLessEqual + ) + while True: + cont = Expression(compare_type, index, imax).evaluate(evaluation) + if cont is SymbolFalse: + break + if cont is not SymbolTrue: + if self.throw_iterb: + evaluation.message(self.get_name(), "iterb") + return + + evaluation.check_stopped() + try: + item = dynamic_scoping(expr.evaluate, {i.name: index}, evaluation) + result.append(item) + except ContinueInterrupt: + if self.allow_loopcontrol: + pass + else: + raise + except BreakInterrupt: + if self.allow_loopcontrol: + break + else: + raise + except ReturnInterrupt as e: + if self.allow_loopcontrol: + return e.expr + else: + raise + index = Expression(SymbolPlus, index, di).evaluate(evaluation) + return self.get_result(result) + + def eval_list(self, expr, i, items, evaluation): + "%(name)s[expr_, {i_Symbol, {items___}}]" + items = items.evaluate(evaluation).get_sequence() + result = [] + for item in items: + evaluation.check_stopped() + try: + item = dynamic_scoping(expr.evaluate, {i.name: item}, evaluation) + result.append(item) + except ContinueInterrupt: + if self.allow_loopcontrol: + pass + else: + raise + except BreakInterrupt: + if self.allow_loopcontrol: + break + else: + raise + except ReturnInterrupt as e: + if self.allow_loopcontrol: + return e.expr + else: + raise + return self.get_result(result) + + def eval_multi(self, expr, first, sequ, evaluation): + "%(name)s[expr_, first_, sequ__]" + + sequ = sequ.get_sequence() + name = self.get_name() + return to_expression(name, to_expression(name, expr, *sequ), first) + + class Operator(Builtin): operator: Optional[str] = None precedence: Optional[int] = None diff --git a/mathics/builtin/list/constructing.py b/mathics/builtin/list/constructing.py index 499bd5156..b0fd2fdcd 100644 --- a/mathics/builtin/list/constructing.py +++ b/mathics/builtin/list/constructing.py @@ -10,8 +10,8 @@ from itertools import permutations -from mathics.builtin.base import Builtin, Pattern -from mathics.builtin.lists import _IterationFunction, get_tuples +from mathics.builtin.base import Builtin, IterationFunction, Pattern +from mathics.builtin.lists import get_tuples from mathics.core.atoms import Integer, Symbol from mathics.core.attributes import A_HOLD_FIRST, A_LISTABLE, A_PROTECTED from mathics.core.convert.expression import to_expression @@ -405,9 +405,11 @@ def apply(self, e, tags, evaluation): return e -class Table(_IterationFunction): +class Table(IterationFunction): """ - :WMA link:https://reference.wolfram.com/language/ref/Table.html + + :WMA link: + https://reference.wolfram.com/language/ref/Table.html
'Table[$expr$, $n$]' diff --git a/mathics/builtin/lists.py b/mathics/builtin/lists.py index fc0c9bc49..2c6c3e1a9 100644 --- a/mathics/builtin/lists.py +++ b/mathics/builtin/lists.py @@ -7,24 +7,18 @@ import heapq -import sympy - from mathics.algorithm.parts import python_levelspec, walk_levels from mathics.builtin.base import ( Builtin, CountableInteger, NegativeIntegerException, Predefined, - SympyFunction, Test, ) from mathics.builtin.box.layout import RowBox -from mathics.builtin.numbers.algebra import cancel -from mathics.builtin.scoping import dynamic_scoping -from mathics.core.atoms import Integer, Integer0, Integer1, Integer2, Number, String -from mathics.core.attributes import A_HOLD_ALL, A_LOCKED, A_PROTECTED +from mathics.core.atoms import Integer, Integer1, Integer2, String +from mathics.core.attributes import A_LOCKED, A_PROTECTED from mathics.core.convert.expression import to_expression -from mathics.core.convert.sympy import from_sympy from mathics.core.exceptions import ( InvalidLevelspecError, MessageException, @@ -33,20 +27,15 @@ PartRangeError, ) from mathics.core.expression import Expression -from mathics.core.interrupt import BreakInterrupt, ContinueInterrupt, ReturnInterrupt from mathics.core.list import ListExpression -from mathics.core.symbols import Atom, Symbol, SymbolFalse, SymbolPlus, SymbolTrue +from mathics.core.symbols import Atom, Symbol, SymbolFalse, SymbolTrue from mathics.core.systemsymbols import ( SymbolAlternatives, - SymbolGreaterEqual, - SymbolLess, - SymbolLessEqual, SymbolMakeBoxes, SymbolMatchQ, SymbolSequence, SymbolSubsetQ, ) -from mathics.eval.numerify import numerify SymbolKey = Symbol("Key") @@ -135,210 +124,6 @@ def get_tuples(items): yield [item] + rest -class _IterationFunction(Builtin): - """ - >> Sum[k, {k, Range[5]}] - = 15 - """ - - attributes = A_HOLD_ALL | A_PROTECTED - allow_loopcontrol = False - throw_iterb = True - - def get_result(self, items): - pass - - def eval_symbol(self, expr, iterator, evaluation): - "%(name)s[expr_, iterator_Symbol]" - iterator = iterator.evaluate(evaluation) - if iterator.has_form(["List", "Range", "Sequence"], None): - elements = iterator.elements - if len(elements) == 1: - return self.apply_max(expr, *elements, evaluation) - elif len(elements) == 2: - if elements[1].has_form(["List", "Sequence"], None): - seq = Expression(SymbolSequence, *(elements[1].elements)) - return self.eval_list(expr, elements[0], seq, evaluation) - else: - return self.eval_range(expr, *elements, evaluation) - elif len(elements) == 3: - return self.eval_iter_nostep(expr, *elements, evaluation) - elif len(elements) == 4: - return self.eval_iter(expr, *elements, evaluation) - - if self.throw_iterb: - evaluation.message(self.get_name(), "iterb") - return - - def eval_range(self, expr, i, imax, evaluation): - "%(name)s[expr_, {i_Symbol, imax_}]" - imax = imax.evaluate(evaluation) - if imax.has_form("Range", None): - # FIXME: this should work as an iterator in Python3, not - # building the sequence explicitly... - seq = Expression(SymbolSequence, *(imax.evaluate(evaluation).elements)) - return self.apply_list(expr, i, seq, evaluation) - elif imax.has_form("List", None): - seq = Expression(SymbolSequence, *(imax.elements)) - return self.eval_list(expr, i, seq, evaluation) - else: - return self.eval_iter(expr, i, Integer1, imax, Integer1, evaluation) - - def eval_max(self, expr, imax, evaluation): - "%(name)s[expr_, {imax_}]" - - # Even though `imax` should be an integeral value, its type does not - # have to be an Integer. - - result = [] - - def do_iteration(): - evaluation.check_stopped() - try: - result.append(expr.evaluate(evaluation)) - except ContinueInterrupt: - if self.allow_loopcontrol: - pass - else: - raise - except BreakInterrupt: - if self.allow_loopcontrol: - raise StopIteration - else: - raise - except ReturnInterrupt as e: - if self.allow_loopcontrol: - return e.expr - else: - raise - - if isinstance(imax, Integer): - try: - for _ in range(imax.value): - do_iteration() - except StopIteration: - pass - - else: - imax = imax.evaluate(evaluation) - imax = numerify(imax, evaluation) - if isinstance(imax, Number): - imax = imax.round() - py_max = imax.get_float_value() - if py_max is None: - if self.throw_iterb: - evaluation.message(self.get_name(), "iterb") - return - - index = 0 - try: - while index < py_max: - do_iteration() - index += 1 - except StopIteration: - pass - - return self.get_result(result) - - def eval_iter_nostep(self, expr, i, imin, imax, evaluation): - "%(name)s[expr_, {i_Symbol, imin_, imax_}]" - return self.eval_iter(expr, i, imin, imax, Integer1, evaluation) - - def eval_iter(self, expr, i, imin, imax, di, evaluation): - "%(name)s[expr_, {i_Symbol, imin_, imax_, di_}]" - - if isinstance(self, SympyFunction) and di.get_int_value() == 1: - whole_expr = to_expression( - self.get_name(), expr, ListExpression(i, imin, imax) - ) - sympy_expr = whole_expr.to_sympy(evaluation=evaluation) - if sympy_expr is None: - return None - - # apply Together to produce results similar to Mathematica - result = sympy.together(sympy_expr) - result = from_sympy(result) - result = cancel(result) - - if not result.sameQ(whole_expr): - return result - return - - index = imin.evaluate(evaluation) - imax = imax.evaluate(evaluation) - di = di.evaluate(evaluation) - - result = [] - compare_type = ( - SymbolGreaterEqual - if Expression(SymbolLess, di, Integer0).evaluate(evaluation).to_python() - else SymbolLessEqual - ) - while True: - cont = Expression(compare_type, index, imax).evaluate(evaluation) - if cont is SymbolFalse: - break - if cont is not SymbolTrue: - if self.throw_iterb: - evaluation.message(self.get_name(), "iterb") - return - - evaluation.check_stopped() - try: - item = dynamic_scoping(expr.evaluate, {i.name: index}, evaluation) - result.append(item) - except ContinueInterrupt: - if self.allow_loopcontrol: - pass - else: - raise - except BreakInterrupt: - if self.allow_loopcontrol: - break - else: - raise - except ReturnInterrupt as e: - if self.allow_loopcontrol: - return e.expr - else: - raise - index = Expression(SymbolPlus, index, di).evaluate(evaluation) - return self.get_result(result) - - def eval_list(self, expr, i, items, evaluation): - "%(name)s[expr_, {i_Symbol, {items___}}]" - items = items.evaluate(evaluation).get_sequence() - result = [] - for item in items: - evaluation.check_stopped() - try: - item = dynamic_scoping(expr.evaluate, {i.name: item}, evaluation) - result.append(item) - except ContinueInterrupt: - if self.allow_loopcontrol: - pass - else: - raise - except BreakInterrupt: - if self.allow_loopcontrol: - break - else: - raise - except ReturnInterrupt as e: - if self.allow_loopcontrol: - return e.expr - else: - raise - return self.get_result(result) - - def eval_multi(self, expr, first, sequ, evaluation): - "%(name)s[expr_, first_, sequ__]" - - sequ = sequ.get_sequence() - name = self.get_name() - return to_expression(name, to_expression(name, expr, *sequ), first) - - class All(Predefined): """ :WMA link:https://reference.wolfram.com/language/ref/All.html diff --git a/mathics/builtin/procedural.py b/mathics/builtin/procedural.py index 735f70675..4f129aa30 100644 --- a/mathics/builtin/procedural.py +++ b/mathics/builtin/procedural.py @@ -11,8 +11,7 @@ """ -from mathics.builtin.base import BinaryOperator, Builtin -from mathics.builtin.lists import _IterationFunction +from mathics.builtin.base import BinaryOperator, Builtin, IterationFunction from mathics.builtin.patterns import match from mathics.core.attributes import ( A_HOLD_ALL, @@ -242,7 +241,7 @@ def apply(self, evaluation): raise ContinueInterrupt -class Do(_IterationFunction): +class Do(IterationFunction): """ :WMA link:https://reference.wolfram.com/language/ref/Do.html diff --git a/mathics/eval/numbers.py b/mathics/eval/numbers.py new file mode 100644 index 000000000..4e1db1dc3 --- /dev/null +++ b/mathics/eval/numbers.py @@ -0,0 +1,35 @@ +import sympy + +from mathics.core.convert.sympy import from_sympy +from mathics.core.expression import Expression +from mathics.core.symbols import SymbolPlus + + +def cancel(expr): + if expr.has_form("Plus", None): + return Expression(SymbolPlus, *[cancel(element) for element in expr.elements]) + else: + try: + result = expr.to_sympy() + if result is None: + return None + + # result = sympy.powsimp(result, deep=True) + result = sympy.cancel(result) + + # cancel factors out rationals, so we factor them again + result = sympy_factor(result) + + return from_sympy(result) + except sympy.PolynomialError: + # e.g. for non-commutative expressions + return expr + + +def sympy_factor(expr_sympy): + try: + result = sympy.together(expr_sympy) + result = sympy.factor(result) + except sympy.PolynomialError: + return expr_sympy + return result diff --git a/mathics/eval/scoping.py b/mathics/eval/scoping.py new file mode 100644 index 000000000..08b4b73ee --- /dev/null +++ b/mathics/eval/scoping.py @@ -0,0 +1,55 @@ +from mathics.core.evaluation import Evaluation +from mathics.core.symbols import Symbol, fully_qualified_symbol_name + + +def dynamic_scoping(func, vars, evaluation: Evaluation): + """ + Changes temporarily the value of a set of symbols listed in vars, + and evaluates func(evaluation) + """ + original_definitions = {} + for var_name, new_def in vars.items(): + assert fully_qualified_symbol_name(var_name) + original_definitions[var_name] = evaluation.definitions.get_user_definition( + var_name + ) + evaluation.definitions.reset_user_definition(var_name) + if new_def is not None: + new_def = new_def.evaluate(evaluation) + evaluation.definitions.set_ownvalue(var_name, new_def) + try: + result = func(evaluation) + finally: + for name, definition in original_definitions.items(): + evaluation.definitions.add_user_definition(name, definition) + return result + + +def get_scoping_vars(var_list, msg_symbol="", evaluation=None): + def message(tag, *args): + if msg_symbol and evaluation: + evaluation.message(msg_symbol, tag, *args) + + if not var_list.has_form("List", None): + message("lvlist", var_list) + return + vars = var_list.elements + scoping_vars = set() + for var in vars: + var_name = None + if var.has_form("Set", 2): + var_name = var.elements[0].get_name() + new_def = var.elements[1] + if evaluation: + new_def = new_def.evaluate(evaluation) + elif isinstance(var, Symbol): + var_name = var.get_name() + new_def = None + if not var_name: + message("lvsym", var) + continue + if var_name in scoping_vars: + message("dup", Symbol(var_name)) + else: + scoping_vars.add(var_name) + yield var_name, new_def From 52fb2854908f8638e9d0548ce7f3a0beed73834c Mon Sep 17 00:00:00 2001 From: rocky Date: Sat, 7 Jan 2023 05:17:24 -0500 Subject: [PATCH 023/209] move Iteration, more eval... Move mathics.builtin.list._IterationFunction to mathics.base.IterationFunction Move eval-like routines out of mathics.builtin.arithmetic into mathics.eval.numbers Move scoping routine out of builtin.base into mathics.eval.scoping Split long lines, improper "apply" reduction --- mathics/builtin/lists.py | 21 +++++++--- mathics/builtin/procedural.py | 74 +++++++++++++++++++++-------------- 2 files changed, 60 insertions(+), 35 deletions(-) diff --git a/mathics/builtin/lists.py b/mathics/builtin/lists.py index 2c6c3e1a9..5ec76e3e6 100644 --- a/mathics/builtin/lists.py +++ b/mathics/builtin/lists.py @@ -308,7 +308,8 @@ class Failure(Builtin):
Failure[$tag$, $assoc$] -
represents a failure of a type indicated by $tag$, with details given by the association $assoc$. +
represents a failure of a type indicated by $tag$, with details \ + given by the association $assoc$.
""" @@ -328,7 +329,8 @@ class Insert(Builtin):
'Insert[$list$, $elem$, $n$]' -
inserts $elem$ at position $n$ in $list$. When $n$ is negative, the position is counted from the end. +
inserts $elem$ at position $n$ in $list$. When $n$ is negative, \ + the position is counted from the end.
>> Insert[{a,b,c,d,e}, x, 3] @@ -353,11 +355,14 @@ def eval(self, expr, elem, n: Integer, evaluation): class IntersectingQ(Builtin): """ - :WMA link:https://reference.wolfram.com/language/ref/IntersectingQ.html + + :WMA link: + https://reference.wolfram.com/language/ref/IntersectingQ.html
'IntersectingQ[$a$, $b$]' -
gives True if there are any common elements in $a and $b, or False if $a and $b are disjoint. +
gives True if there are any common elements in $a and $b, or \ + False if $a and $b are disjoint.
""" @@ -367,7 +372,9 @@ class IntersectingQ(Builtin): class Key(Builtin): """ - :WMA link:https://reference.wolfram.com/language/ref/Key.html + + :WMA link: + https://reference.wolfram.com/language/ref/Key.html
Key[$key$] @@ -385,7 +392,9 @@ class Key(Builtin): class LeafCount(Builtin): """ - :WMA link:https://reference.wolfram.com/language/ref/LeafCount.html + + :WMA link: + https://reference.wolfram.com/language/ref/LeafCount.html
'LeafCount[$expr$]' diff --git a/mathics/builtin/procedural.py b/mathics/builtin/procedural.py index 4f129aa30..52a3ab84e 100644 --- a/mathics/builtin/procedural.py +++ b/mathics/builtin/procedural.py @@ -3,11 +3,17 @@ """ Procedural Programming -Procedural programming is a programming paradigm, derived from imperative programming, based on the concept of the procedure call. This term is sometimes compared and contrasted with Functional Programming. +Procedural programming is a programming paradigm, derived from imperative \ +programming, based on the concept of the procedure call. This term is \ +sometimes compared and contrasted with Functional Programming. -Procedures (a type of routine or subroutine) simply contain a series of computational steps to be carried out. Any given procedure might be called at any point during a program's execution, including by other procedures or itself. +Procedures (a type of routine or subroutine) simply contain a series of \ +computational steps to be carried out. Any given procedure might be called \ +at any point during a program's execution, including by other procedures \ +or itself. -Procedural functions are integrated into Mathics symbolic programming environment. +Procedural functions are integrated into Mathics symbolic programming \ +environment. """ @@ -35,7 +41,8 @@ class Abort(Builtin): """ - :WMA link:https://reference.wolfram.com/language/ref/Abort.html + :WMA link: + https://reference.wolfram.com/language/ref/Abort.html
'Abort[]' @@ -48,7 +55,7 @@ class Abort(Builtin): summary_text = "generate an abort" - def apply(self, evaluation): + def eval(self, evaluation): "Abort[]" raise AbortInterrupt @@ -74,7 +81,7 @@ class Break(Builtin): summary_text = "exit a 'For', 'While', or 'Do' loop" - def apply(self, evaluation): + def eval(self, evaluation): "Break[]" raise BreakInterrupt @@ -115,7 +122,7 @@ class Catch(Builtin): summary_text = "handle an exception raised by a 'Throw'" - def apply_expr(self, expr, evaluation): + def eval_expr(self, expr, evaluation): "Catch[expr_]" try: ret = expr.evaluate(evaluation) @@ -123,7 +130,7 @@ def apply_expr(self, expr, evaluation): return e.value return ret - def apply_with_form_and_fn(self, expr, form, f, evaluation): + def eval_with_form_and_fn(self, expr, form, f, evaluation): "Catch[expr_, form_, f__:Identity]" try: ret = expr.evaluate(evaluation) @@ -195,7 +202,7 @@ class CompoundExpression(BinaryOperator): summary_text = "execute expressions in sequence" - def apply(self, expr, evaluation): + def eval(self, expr, evaluation): "CompoundExpression[expr___]" items = expr.get_sequence() @@ -235,7 +242,7 @@ class Continue(Builtin): summary_text = "continue with the next iteration in a 'For', 'While' or 'Do' loop" - def apply(self, evaluation): + def eval(self, evaluation): "Continue[]" raise ContinueInterrupt @@ -329,7 +336,7 @@ class For(Builtin): } summary_text = "a 'For' loop" - def apply(self, start, test, incr, body, evaluation): + def eval(self, start, test, incr, body, evaluation): "For[start_, test_, incr_, body_]" while test.evaluate(evaluation) is SymbolTrue: evaluation.check_stopped() @@ -382,7 +389,7 @@ class If(Builtin): attributes = A_HOLD_REST | A_PROTECTED summary_text = "test if a condition is true, false, or of unknown truth value" - def apply_2(self, condition, t, evaluation): + def eval(self, condition, t, evaluation): "If[condition_, t_]" if condition is SymbolTrue: @@ -390,7 +397,7 @@ def apply_2(self, condition, t, evaluation): elif condition is SymbolFalse: return SymbolNull - def apply_3(self, condition, t, f, evaluation): + def eval_with_false(self, condition, t, f, evaluation): "If[condition_, t_, f_]" if condition is SymbolTrue: @@ -398,7 +405,7 @@ def apply_3(self, condition, t, f, evaluation): elif condition is SymbolFalse: return f.evaluate(evaluation) - def apply_4(self, condition, t, f, u, evaluation): + def eval_with_false_and_other(self, condition, t, f, u, evaluation): "If[condition_, t_, f_, u_]" if condition is SymbolTrue: @@ -424,7 +431,7 @@ class Interrupt(Builtin): summary_text = "interrupt evaluation and return '$Aborted'" - def apply(self, evaluation): + def eval(self, evaluation): "Interrupt[]" raise AbortInterrupt @@ -432,7 +439,8 @@ def apply(self, evaluation): class Return(Builtin): """ - :WMA link:https://reference.wolfram.com/language/ref/Return.html + :WMA link: + https://reference.wolfram.com/language/ref/Return.html
'Return[$expr$]' @@ -473,7 +481,7 @@ class Return(Builtin): summary_text = "return from a function" - def apply(self, expr, evaluation): + def eval(self, expr, evaluation): "Return[expr_]" raise ReturnInterrupt(expr) @@ -481,11 +489,13 @@ def apply(self, expr, evaluation): class Switch(Builtin): """ - :WMA link:https://reference.wolfram.com/language/ref/Switch.html + :WMA link: + https://reference.wolfram.com/language/ref/Switch.html
'Switch[$expr$, $pattern1$, $value1$, $pattern2$, $value2$, ...]' -
yields the first $value$ for which $expr$ matches the corresponding $pattern$. +
yields the first $value$ for which $expr$ matches the corresponding \ + $pattern$.
>> Switch[2, 1, x, 2, y, 3, z] @@ -521,7 +531,7 @@ class Switch(Builtin): summary_text = "switch based on a value, with patterns allowed" - def apply(self, expr, rules, evaluation): + def eval(self, expr, rules, evaluation): "Switch[expr_, rules___]" rules = rules.get_sequence() @@ -536,11 +546,14 @@ def apply(self, expr, rules, evaluation): class Which(Builtin): """ - :WMA link:https://reference.wolfram.com/language/ref/Which.html + + :WMA link: + https://reference.wolfram.com/language/ref/Which.html
'Which[$cond1$, $expr1$, $cond2$, $expr2$, ...]' -
yields $expr1$ if $cond1$ evaluates to 'True', $expr2$ if $cond2$ evaluates to 'True', etc. +
yields $expr1$ if $cond1$ evaluates to 'True', $expr2$ if $cond2$ \ + evaluates to 'True', etc.
>> n = 5; @@ -570,7 +583,7 @@ class Which(Builtin): attributes = A_HOLD_ALL | A_PROTECTED summary_text = "test which of a sequence of conditions are true" - def apply(self, items, evaluation): + def eval(self, items, evaluation): "Which[items___]" items = items.get_sequence() @@ -596,7 +609,8 @@ def apply(self, items, evaluation): class While(Builtin): """ - :WMA link:https://reference.wolfram.com/language/ref/While.html + :WMA link: + https://reference.wolfram.com/language/ref/While.html
'While[$test$, $body$]' @@ -622,7 +636,7 @@ class While(Builtin): "While[test_]": "While[test, Null]", } - def apply(self, test, body, evaluation): + def eval(self, test, body, evaluation): "While[test_, body_]" while test.evaluate(evaluation) is SymbolTrue: @@ -640,11 +654,13 @@ def apply(self, test, body, evaluation): class Throw(Builtin): """ - :WMA link:https://reference.wolfram.com/language/ref/Throw.html + :WMA link: + https://reference.wolfram.com/language/ref/Throw.html
'Throw[`value`]' -
stops evaluation and returns `value` as the value of the nearest enclosing 'Catch'. +
stops evaluation and returns `value` as the value of the nearest \ + enclosing 'Catch'.
'Catch[`value`, `tag`]'
is caught only by `Catch[expr,form]`, where tag matches form. @@ -667,10 +683,10 @@ class Throw(Builtin): summary_text = "throw an expression to be caught by a surrounding 'Catch'" - def apply1(self, value, evaluation): + def eval1(self, value, evaluation): "Throw[value_]" raise WLThrowInterrupt(value) - def apply_with_tag(self, value, tag, evaluation): + def eval_with_tag(self, value, tag, evaluation): "Throw[value_, tag_]" raise WLThrowInterrupt(value, tag) From 541364c0884e3ebd6f3c32bd2dfe8302b7847965 Mon Sep 17 00:00:00 2001 From: rocky Date: Sat, 7 Jan 2023 04:59:31 -0500 Subject: [PATCH 024/209] Move Key[] ... from builtin.list to builtin.list.associations --- mathics/builtin/list/associations.py | 18 ++++++++++++++++++ mathics/builtin/lists.py | 23 +---------------------- mathics/core/systemsymbols.py | 1 + 3 files changed, 20 insertions(+), 22 deletions(-) diff --git a/mathics/builtin/list/associations.py b/mathics/builtin/list/associations.py index 4683d05d1..e1447bf43 100644 --- a/mathics/builtin/list/associations.py +++ b/mathics/builtin/list/associations.py @@ -192,6 +192,24 @@ def validate(elements): return expr.get_head_name() == "System`Association" and validate(expr.elements) +class Key(Builtin): + """ + :WMA link:https://reference.wolfram.com/language/ref/Key.html + +
+
Key[$key$] +
represents a key used to access a value in an association. +
Key[$key$][$assoc$] +
+
+ """ + + rules = { + "Key[key_][assoc_Association]": "assoc[key]", + } + summary_text = "indicate a key within a part specification" + + class Keys(Builtin): """ :WMA link:https://reference.wolfram.com/language/ref/Keys.html diff --git a/mathics/builtin/lists.py b/mathics/builtin/lists.py index 5ec76e3e6..6adea1c91 100644 --- a/mathics/builtin/lists.py +++ b/mathics/builtin/lists.py @@ -31,14 +31,13 @@ from mathics.core.symbols import Atom, Symbol, SymbolFalse, SymbolTrue from mathics.core.systemsymbols import ( SymbolAlternatives, + SymbolKey, SymbolMakeBoxes, SymbolMatchQ, SymbolSequence, SymbolSubsetQ, ) -SymbolKey = Symbol("Key") - def delete_one(expr, pos): if isinstance(expr, Atom): @@ -370,26 +369,6 @@ class IntersectingQ(Builtin): summary_text = "test whether two lists have common elements" -class Key(Builtin): - """ - - :WMA link: - https://reference.wolfram.com/language/ref/Key.html - -
-
Key[$key$] -
represents a key used to access a value in an association. -
Key[$key$][$assoc$] -
-
- """ - - rules = { - "Key[key_][assoc_Association]": "assoc[key]", - } - summary_text = "indicate a key within a part specification" - - class LeafCount(Builtin): """ diff --git a/mathics/core/systemsymbols.py b/mathics/core/systemsymbols.py index a55e261ac..197edfdba 100644 --- a/mathics/core/systemsymbols.py +++ b/mathics/core/systemsymbols.py @@ -114,6 +114,7 @@ SymbolLength = Symbol("System`Length") SymbolLess = Symbol("System`Less") SymbolLessEqual = Symbol("System`LessEqual") +SymbolKey = Symbol("System`Key") SymbolLine = Symbol("System`Line") SymbolLog = Symbol("System`Log") SymbolLog10 = Symbol("System`Log10") From 7ad643e1e06180b99cfe3240698c4f540e509e2d Mon Sep 17 00:00:00 2001 From: rocky Date: Sat, 7 Jan 2023 09:33:01 -0500 Subject: [PATCH 025/209] Move Take[] builtins to mathics.builtin.list.math --- mathics/builtin/list/math.py | 176 ++++++++++++++++++++++ mathics/builtin/lists.py | 182 +---------------------- mathics/builtin/statistics/orderstats.py | 2 +- 3 files changed, 178 insertions(+), 182 deletions(-) create mode 100644 mathics/builtin/list/math.py diff --git a/mathics/builtin/list/math.py b/mathics/builtin/list/math.py new file mode 100644 index 000000000..ad2a5f9b2 --- /dev/null +++ b/mathics/builtin/list/math.py @@ -0,0 +1,176 @@ +""" +Math & Counting Operations on Lists +""" +import heapq + +from mathics.builtin.base import Builtin, CountableInteger, NegativeIntegerException +from mathics.core.exceptions import MessageException +from mathics.core.expression import Expression +from mathics.core.list import ListExpression +from mathics.core.symbols import Symbol, SymbolTrue +from mathics.core.systemsymbols import SymbolAlternatives, SymbolMatchQ + + +class _RankedTake(Builtin): + messages = { + "intpm": "Expected non-negative integer at position `1` in `2`.", + "rank": "The specified rank `1` is not between 1 and `2`.", + } + + options = { + "ExcludedForms": "Automatic", + } + + def _compute(self, t, n, evaluation, options, f=None): + try: + limit = CountableInteger.from_expression(n) + except MessageException as e: + e.message(evaluation) + return + except NegativeIntegerException: + if f: + args = (3, Expression(self.get_name(), t, f, n)) + else: + args = (2, Expression(self.get_name(), t, n)) + evaluation.message(self.get_name(), "intpm", *args) + return + + if limit is None: + return + + if limit == 0: + return ListExpression() + else: + excluded = self.get_option(options, "ExcludedForms", evaluation) + if excluded: + if ( + isinstance(excluded, Symbol) + and excluded.get_name() == "System`Automatic" + ): + + def exclude(item): + if isinstance(item, Symbol) and item.get_name() in ( + "System`None", + "System`Null", + "System`Indeterminate", + ): + return True + elif item.get_head_name() == "System`Missing": + return True + else: + return False + + else: + excluded = Expression(SymbolAlternatives, *excluded.elements) + + def exclude(item): + return ( + Expression(SymbolMatchQ, item, excluded).evaluate( + evaluation + ) + is SymbolTrue + ) + + filtered = [element for element in t.elements if not exclude(element)] + else: + filtered = t.elements + + if limit > len(filtered): + if not limit.is_upper_limit(): + evaluation.message( + self.get_name(), "rank", limit.get_int_value(), len(filtered) + ) + return + else: + py_n = len(filtered) + else: + py_n = limit.get_int_value() + + if py_n < 1: + return ListExpression() + + if f: + heap = [ + (Expression(f, element).evaluate(evaluation), element, i) + for i, element in enumerate(filtered) + ] + element_pos = 1 # in tuple above + else: + heap = [(element, i) for i, element in enumerate(filtered)] + element_pos = 0 # in tuple above + + if py_n == 1: + result = [self._get_1(heap)] + else: + result = self._get_n(py_n, heap) + + return t.restructure("List", [x[element_pos] for x in result], evaluation) + + +class _RankedTakeSmallest(_RankedTake): + def _get_1(self, a): + return min(a) + + def _get_n(self, n, heap): + return heapq.nsmallest(n, heap) + + +class _RankedTakeLargest(_RankedTake): + def _get_1(self, a): + return max(a) + + def _get_n(self, n, heap): + return heapq.nlargest(n, heap) + + +class TakeLargestBy(_RankedTakeLargest): + """ + :WMA link:https://reference.wolfram.com/language/ref/TakeLargestBy.html + +
+
'TakeLargestBy[$list$, $f$, $n$]' +
returns the a sorted list of the $n$ largest items in $list$ + using $f$ to retrieve the items' keys to compare them. +
+ + For details on how to use the ExcludedForms option, see TakeLargest[]. + + >> TakeLargestBy[{{1, -1}, {10, 100}, {23, 7, 8}, {5, 1}}, Total, 2] + = {{10, 100}, {23, 7, 8}} + + >> TakeLargestBy[{"abc", "ab", "x"}, StringLength, 1] + = {abc} + """ + + summary_text = "sublist of n largest elements according to a given criteria" + + def eval(self, element, f, n, evaluation, options): + "TakeLargestBy[element_List, f_, n_, OptionsPattern[TakeLargestBy]]" + return self._compute(element, n, evaluation, options, f=f) + + +class TakeSmallestBy(_RankedTakeSmallest): + """ + :WMA link: + https://reference.wolfram.com/language/ref/TakeSmallestBy.html + +
+
'TakeSmallestBy[$list$, $f$, $n$]' +
returns the a sorted list of the $n$ smallest items in $list$ + using $f$ to retrieve the items' keys to compare them. +
+ + For details on how to use the ExcludedForms option, see TakeLargest[]. + + >> TakeSmallestBy[{{1, -1}, {10, 100}, {23, 7, 8}, {5, 1}}, Total, 2] + = {{1, -1}, {5, 1}} + + >> TakeSmallestBy[{"abc", "ab", "x"}, StringLength, 1] + = {x} + """ + + summary_text = "sublist of n largest elements according to a criteria" + + def eval(self, element, f, n, evaluation, options): + "TakeSmallestBy[element_List, f_, n_, OptionsPattern[TakeSmallestBy]]" + return self._compute(element, n, evaluation, options, f=f) diff --git a/mathics/builtin/lists.py b/mathics/builtin/lists.py index 6adea1c91..0c04b7bf4 100644 --- a/mathics/builtin/lists.py +++ b/mathics/builtin/lists.py @@ -5,23 +5,14 @@ Functions here will eventually get moved to more suitable subsections. """ -import heapq - from mathics.algorithm.parts import python_levelspec, walk_levels -from mathics.builtin.base import ( - Builtin, - CountableInteger, - NegativeIntegerException, - Predefined, - Test, -) +from mathics.builtin.base import Builtin, Predefined, Test from mathics.builtin.box.layout import RowBox from mathics.core.atoms import Integer, Integer1, Integer2, String from mathics.core.attributes import A_LOCKED, A_PROTECTED from mathics.core.convert.expression import to_expression from mathics.core.exceptions import ( InvalidLevelspecError, - MessageException, PartDepthError, PartError, PartRangeError, @@ -30,10 +21,8 @@ from mathics.core.list import ListExpression from mathics.core.symbols import Atom, Symbol, SymbolFalse, SymbolTrue from mathics.core.systemsymbols import ( - SymbolAlternatives, SymbolKey, SymbolMakeBoxes, - SymbolMatchQ, SymbolSequence, SymbolSubsetQ, ) @@ -668,170 +657,6 @@ def rect(self, element): ) -class _RankedTake(Builtin): - messages = { - "intpm": "Expected non-negative integer at position `1` in `2`.", - "rank": "The specified rank `1` is not between 1 and `2`.", - } - - options = { - "ExcludedForms": "Automatic", - } - - def _compute(self, t, n, evaluation, options, f=None): - try: - limit = CountableInteger.from_expression(n) - except MessageException as e: - e.message(evaluation) - return - except NegativeIntegerException: - if f: - args = (3, Expression(self.get_name(), t, f, n)) - else: - args = (2, Expression(self.get_name(), t, n)) - evaluation.message(self.get_name(), "intpm", *args) - return - - if limit is None: - return - - if limit == 0: - return ListExpression() - else: - excluded = self.get_option(options, "ExcludedForms", evaluation) - if excluded: - if ( - isinstance(excluded, Symbol) - and excluded.get_name() == "System`Automatic" - ): - - def exclude(item): - if isinstance(item, Symbol) and item.get_name() in ( - "System`None", - "System`Null", - "System`Indeterminate", - ): - return True - elif item.get_head_name() == "System`Missing": - return True - else: - return False - - else: - excluded = Expression(SymbolAlternatives, *excluded.elements) - - def exclude(item): - return ( - Expression(SymbolMatchQ, item, excluded).evaluate( - evaluation - ) - is SymbolTrue - ) - - filtered = [element for element in t.elements if not exclude(element)] - else: - filtered = t.elements - - if limit > len(filtered): - if not limit.is_upper_limit(): - evaluation.message( - self.get_name(), "rank", limit.get_int_value(), len(filtered) - ) - return - else: - py_n = len(filtered) - else: - py_n = limit.get_int_value() - - if py_n < 1: - return ListExpression() - - if f: - heap = [ - (Expression(f, element).evaluate(evaluation), element, i) - for i, element in enumerate(filtered) - ] - element_pos = 1 # in tuple above - else: - heap = [(element, i) for i, element in enumerate(filtered)] - element_pos = 0 # in tuple above - - if py_n == 1: - result = [self._get_1(heap)] - else: - result = self._get_n(py_n, heap) - - return t.restructure("List", [x[element_pos] for x in result], evaluation) - - -class _RankedTakeSmallest(_RankedTake): - def _get_1(self, a): - return min(a) - - def _get_n(self, n, heap): - return heapq.nsmallest(n, heap) - - -class _RankedTakeLargest(_RankedTake): - def _get_1(self, a): - return max(a) - - def _get_n(self, n, heap): - return heapq.nlargest(n, heap) - - -class TakeLargestBy(_RankedTakeLargest): - """ - :WMA link:https://reference.wolfram.com/language/ref/TakeLargestBy.html - -
-
'TakeLargestBy[$list$, $f$, $n$]' -
returns the a sorted list of the $n$ largest items in $list$ - using $f$ to retrieve the items' keys to compare them. -
- - For details on how to use the ExcludedForms option, see TakeLargest[]. - - >> TakeLargestBy[{{1, -1}, {10, 100}, {23, 7, 8}, {5, 1}}, Total, 2] - = {{10, 100}, {23, 7, 8}} - - >> TakeLargestBy[{"abc", "ab", "x"}, StringLength, 1] - = {abc} - """ - - summary_text = "sublist of n largest elements according to a given criteria" - - def eval(self, element, f, n, evaluation, options): - "TakeLargestBy[element_List, f_, n_, OptionsPattern[TakeLargestBy]]" - return self._compute(element, n, evaluation, options, f=f) - - -class TakeSmallestBy(_RankedTakeSmallest): - """ - :WMA link:https://reference.wolfram.com/language/ref/TakeSmallestBy.html - -
-
'TakeSmallestBy[$list$, $f$, $n$]' -
returns the a sorted list of the $n$ smallest items in $list$ - using $f$ to retrieve the items' keys to compare them. -
- - For details on how to use the ExcludedForms option, see TakeLargest[]. - - >> TakeSmallestBy[{{1, -1}, {10, 100}, {23, 7, 8}, {5, 1}}, Total, 2] - = {{1, -1}, {5, 1}} - - >> TakeSmallestBy[{"abc", "ab", "x"}, StringLength, 1] - = {x} - """ - - summary_text = "sublist of n largest elements according to a criteria" - - def eval(self, element, f, n, evaluation, options): - "TakeSmallestBy[element_List, f_, n_, OptionsPattern[TakeSmallestBy]]" - return self._compute(element, n, evaluation, options, f=f) - - class SubsetQ(Builtin): """ :WMA link:https://reference.wolfram.com/language/ref/SubsetQ.html @@ -919,8 +744,3 @@ def eval(self, expr, subset, evaluation): return SymbolTrue else: return SymbolFalse - - -# rules = {'Failure /: MakeBoxes[Failure[tag_, assoc_Association], StandardForm]' : -# 'With[{msg = assoc["MessageTemplate"], msgParam = assoc["MessageParameters"], type = assoc["Type"]}, ToBoxes @ Interpretation["Failure" @ Panel @ Grid[{{Style["\[WarningSign]", "Message", FontSize -> 35], Style["Message:", FontColor->GrayLevel[0.5]], ToString[StringForm[msg, Sequence @@ msgParam], StandardForm]}, {SpanFromAbove, Style["Tag:", FontColor->GrayLevel[0.5]], ToString[tag, StandardForm]},{SpanFromAbove,Style["Type:", FontColor->GrayLevel[0.5]],ToString[type, StandardForm]}},Alignment -> {Left, Top}], Failure[tag, assoc]] /; msg =!= Missing["KeyAbsent", "MessageTemplate"] && msgParam =!= Missing["KeyAbsent", "MessageParameters"] && msgParam =!= Missing["KeyAbsent", "Type"]]', -# } diff --git a/mathics/builtin/statistics/orderstats.py b/mathics/builtin/statistics/orderstats.py index 2ed6712e1..a176d2878 100644 --- a/mathics/builtin/statistics/orderstats.py +++ b/mathics/builtin/statistics/orderstats.py @@ -12,7 +12,7 @@ from mathics.algorithm.introselect import introselect from mathics.builtin.base import Builtin -from mathics.builtin.lists import _RankedTakeLargest, _RankedTakeSmallest +from mathics.builtin.list.math import _RankedTakeLargest, _RankedTakeSmallest from mathics.core.atoms import Atom, Integer, Symbol, SymbolTrue from mathics.core.expression import Expression from mathics.core.list import ListExpression From e83cae87f22328b8671d020839960fa7c1963bbf Mon Sep 17 00:00:00 2001 From: rocky Date: Sat, 7 Jan 2023 09:37:05 -0500 Subject: [PATCH 026/209] Reinstate some commented code... Seems to be about formatting the Failure builtin --- mathics/builtin/lists.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/mathics/builtin/lists.py b/mathics/builtin/lists.py index 0c04b7bf4..c6000a4af 100644 --- a/mathics/builtin/lists.py +++ b/mathics/builtin/lists.py @@ -304,6 +304,12 @@ class Failure(Builtin): summary_text = "a failure at the level of the interpreter" +# TODO: seems to want to produces a fancy box for failure. +# rules = {'Failure /: MakeBoxes[Failure[tag_, assoc_Association], StandardForm]' : +# 'With[{msg = assoc["MessageTemplate"], msgParam = assoc["MessageParameters"], type = assoc["Type"]}, ToBoxes @ Interpretation["Failure" @ Panel @ Grid[{{Style["\[WarningSign]", "Message", FontSize -> 35], Style["Message:", FontColor->GrayLevel[0.5]], ToString[StringForm[msg, Sequence @@ msgParam], StandardForm]}, {SpanFromAbove, Style["Tag:", FontColor->GrayLevel[0.5]], ToString[tag, StandardForm]},{SpanFromAbove,Style["Type:", FontColor->GrayLevel[0.5]],ToString[type, StandardForm]}},Alignment -> {Left, Top}], Failure[tag, assoc]] /; msg =!= Missing["KeyAbsent", "MessageTemplate"] && msgParam =!= Missing["KeyAbsent", "MessageParameters"] && msgParam =!= Missing["KeyAbsent", "Type"]]', +# } + + # From backports in CellsToTeX. This functions provides compatibility to WMA 10. # TODO: # * Add doctests From 3a11ecf52d33b6822264997993ab957cc77849d2 Mon Sep 17 00:00:00 2001 From: rocky Date: Sat, 7 Jan 2023 10:02:40 -0500 Subject: [PATCH 027/209] WIP --- mathics/builtin/exp_structure/__init__.py | 3 + .../builtin/{ => exp_structure}/structure.py | 86 ++++++++++++------- 2 files changed, 59 insertions(+), 30 deletions(-) create mode 100644 mathics/builtin/exp_structure/__init__.py rename mathics/builtin/{ => exp_structure}/structure.py (91%) diff --git a/mathics/builtin/exp_structure/__init__.py b/mathics/builtin/exp_structure/__init__.py new file mode 100644 index 000000000..67f7dd86d --- /dev/null +++ b/mathics/builtin/exp_structure/__init__.py @@ -0,0 +1,3 @@ +""" +Expression Structure +""" diff --git a/mathics/builtin/structure.py b/mathics/builtin/exp_structure/structure.py similarity index 91% rename from mathics/builtin/structure.py rename to mathics/builtin/exp_structure/structure.py index 66c71f701..bdb6a05e5 100644 --- a/mathics/builtin/structure.py +++ b/mathics/builtin/exp_structure/structure.py @@ -1,8 +1,8 @@ # -*- coding: utf-8 -*- """ -Structural Operations on Expressions +Expression Structure -Structural transformations on lists, and general symbolic expressions. +Structural transformations on Lists. """ import platform @@ -28,7 +28,9 @@ class ApplyLevel(BinaryOperator): """ - :WMA link:https://reference.wolfram.com/language/ref/ApplyLevel.html + + :WMA link: + https://reference.wolfram.com/language/ref/ApplyLevel.html
'ApplyLevel[$f$, $expr$]' @@ -54,7 +56,9 @@ class ApplyLevel(BinaryOperator): class BinarySearch(Builtin): """ - :WMA link:https://reference.wolfram.com/language/ref/BinarySearch.html + + :WMA link: + https://reference.wolfram.com/language/ref/BinarySearch.html
'CombinatoricaOld`BinarySearch[$l$, $k$]' @@ -95,7 +99,7 @@ class BinarySearch(Builtin): summary_text = "search a sorted list for a key" - def apply(self, l, k, f, evaluation): + def eval(self, l, k, f, evaluation): "CombinatoricaOld`BinarySearch[l_List, k_, f_] /; Length[l] > 0" elements = l.elements @@ -145,7 +149,9 @@ def transform(x): class ByteCount(Builtin): """ - :WMA link:https://reference.wolfram.com/language/ref/ByteCount.html + + :WMA link: + https://reference.wolfram.com/language/ref/ByteCount.html
'ByteCount[$expr$]' @@ -157,7 +163,7 @@ class ByteCount(Builtin): summary_text = "amount of memory used by expr, in bytes" - def apply(self, expression, evaluation): + def eval(self, expression, evaluation): "ByteCount[expression_]" if not bytecount_support: return evaluation.message("ByteCount", "pypy") @@ -196,7 +202,7 @@ class Depth(Builtin): summary_text = "the maximum number of indices to specify any part" - def apply(self, expr, evaluation): + def eval(self, expr, evaluation): "Depth[expr_]" expr, depth = walk_levels(expr) return Integer(depth + 1) @@ -204,7 +210,9 @@ def apply(self, expr, evaluation): class Flatten(Builtin): """ - :WMA link:https://reference.wolfram.com/language/ref/Flatten.html + + :WMA link: + https://reference.wolfram.com/language/ref/Flatten.html
'Flatten[$expr$]' @@ -286,7 +294,7 @@ class Flatten(Builtin): summary_text = "flatten out any sequence of levels in a nested list" - def apply_list(self, expr, n, h, evaluation): + def eval_list(self, expr, n, h, evaluation): "Flatten[expr_, n_List, h_]" # prepare levels @@ -381,7 +389,7 @@ def insert_element(elements): return Expression(h, *insert_element(elements)) - def apply(self, expr, n, h, evaluation): + def eval(self, expr, n, h, evaluation): "Flatten[expr_, n_, h_]" if n == Expression(SymbolDirectedInfinity, Integer1): @@ -399,7 +407,9 @@ def apply(self, expr, n, h, evaluation): class FreeQ(Builtin): """ - :WMA link:https://reference.wolfram.com/language/ref/FreeQ.html + + :WMA link: + https://reference.wolfram.com/language/ref/FreeQ.html
'FreeQ[$expr$, $x$]' @@ -428,7 +438,7 @@ class FreeQ(Builtin): "test whether an expression is free of subexpressions matching a pattern" ) - def apply(self, expr, form, evaluation): + def eval(self, expr, form, evaluation): "FreeQ[expr_, form_]" form = Pattern.create(form) @@ -440,7 +450,9 @@ def apply(self, expr, form, evaluation): class Null(Predefined): """ - :WMA link:https://reference.wolfram.com/language/ref/Null.html + + :WMA link: + https://reference.wolfram.com/language/ref/Null.html
'Null' @@ -462,7 +474,9 @@ class Null(Predefined): class Operate(Builtin): """ - :WMA link:https://reference.wolfram.com/language/ref/Operate.html + + :WMA link: + https://reference.wolfram.com/language/ref/Operate.html
'Operate[$p$, $expr$]' @@ -493,7 +507,7 @@ class Operate(Builtin): "intnn": "Non-negative integer expected at position `2` in `1`.", } - def apply(self, p, expr, n, evaluation): + def eval(self, p, expr, n, evaluation): "Operate[p_, expr_, Optional[n_, 1]]" head_depth = n.get_int_value() @@ -533,8 +547,10 @@ class Order(Builtin):
'Order[$x$, $y$]' -
returns a number indicating the canonical ordering of $x$ and $y$. 1 indicates that $x$ is before $y$, - -1 that $y$ is before $x$. 0 indicates that there is no specific ordering. Uses the same order as 'Sort'. +
returns a number indicating the canonical ordering of $x$ and $y$. \ + 1 indicates that $x$ is before $y$, \-1 that $y$ is before $x$. \ + 0 indicates that there is no specific ordering. Uses the same order \ + as 'Sort'.
>> Order[7, 11] @@ -552,7 +568,7 @@ class Order(Builtin): summary_text = "canonical ordering of expressions" - def apply(self, x, y, evaluation): + def eval(self, x, y, evaluation): "Order[x_, y_]" if x < y: return Integer1 @@ -564,7 +580,9 @@ def apply(self, x, y, evaluation): class OrderedQ(Builtin): """ - :WMA link:https://reference.wolfram.com/language/ref/OrderedQ.html + + :WMA link: + https://reference.wolfram.com/language/ref/OrderedQ.html
'OrderedQ[{$a$, $b$}]' @@ -580,7 +598,7 @@ class OrderedQ(Builtin): summary_text = "test whether elements are canonically sorted" - def apply(self, expr, evaluation): + def eval(self, expr, evaluation): "OrderedQ[expr_]" for index, value in enumerate(expr.elements[:-1]): @@ -593,7 +611,9 @@ def apply(self, expr, evaluation): class PatternsOrderedQ(Builtin): """ - :WMA link:https://reference.wolfram.com/language/ref/PatternsOrderedQ.html + + :WMA link: + https://reference.wolfram.com/language/ref/PatternsOrderedQ.html
'PatternsOrderedQ[$patt1$, $patt2$]' @@ -611,7 +631,7 @@ class PatternsOrderedQ(Builtin): summary_text = "test whether patterns are canonically sorted" - def apply(self, p1, p2, evaluation): + def eval(self, p1, p2, evaluation): "PatternsOrderedQ[p1_, p2_]" if p1.get_sort_key(True) <= p2.get_sort_key(True): @@ -622,13 +642,17 @@ def apply(self, p1, p2, evaluation): class SortBy(Builtin): """ - :WMA link:https://reference.wolfram.com/language/ref/SortBy.html + + :WMA link: + https://reference.wolfram.com/language/ref/SortBy.html
'SortBy[$list$, $f$]' -
sorts $list$ (or the elements of any other expression) according to canonical ordering of the keys that are - extracted from the $list$'s elements using $f. Chunks of elements that appear the same under $f are sorted - according to their natural order (without applying $f). +
sorts $list$ (or the elements of any other expression) according to \ + canonical ordering of the keys that are extracted from the $list$'s \ + elements using $f. Chunks of elements that appear the same under $f \ + are sorted according to their natural order (without applying $f). +
'SortBy[$f$]'
creates an operator function that, when applied, sorts by $f.
@@ -651,7 +675,7 @@ class SortBy(Builtin): summary_text = "sort by the values of a function applied to elements" - def apply(self, li, f, evaluation): + def eval(self, li, f, evaluation): "SortBy[li_, f_]" if isinstance(li, Atom): @@ -696,7 +720,9 @@ def __gt__(self, other): class Through(Builtin): """ - :WMA link:https://reference.wolfram.com/language/ref/Through.html + + :WMA link: + https://reference.wolfram.com/language/ref/Through.html
'Through[$p$[$f$][$x$]]' @@ -711,7 +737,7 @@ class Through(Builtin): summary_text = "distribute operators that appears inside the head of expressions" - def apply(self, p, args, x, evaluation): + def eval(self, p, args, x, evaluation): "Through[p_[args___][x___]]" elements = [] From 2fc148ae92db7c79a52af60d1e0f6c254f9664e2 Mon Sep 17 00:00:00 2001 From: rocky Date: Sat, 7 Jan 2023 10:47:55 -0500 Subject: [PATCH 028/209] Make Expression Structure its own section... Move LeafCount into that under Sizes and Signature --- mathics/builtin/__init__.py | 1 + .../{structure.py => general.py} | 339 +++++------------- mathics/builtin/exp_structure/size_and_sig.py | 208 +++++++++++ mathics/builtin/files_io/filesystem.py | 2 +- .../builtin/functional/apply_fns_to_lists.py | 3 +- mathics/builtin/list/rearrange.py | 202 ++++++++++- mathics/builtin/lists.py | 150 +------- mathics/builtin/logic.py | 3 +- mathics/builtin/string/operations.py | 142 ++------ setup.py | 1 + 10 files changed, 535 insertions(+), 516 deletions(-) rename mathics/builtin/exp_structure/{structure.py => general.py} (61%) create mode 100644 mathics/builtin/exp_structure/size_and_sig.py diff --git a/mathics/builtin/__init__.py b/mathics/builtin/__init__.py index 0f88784ef..9ab1bb33e 100755 --- a/mathics/builtin/__init__.py +++ b/mathics/builtin/__init__.py @@ -190,6 +190,7 @@ def name_is_builtin_symbol(module, name: str) -> Optional[type]: "colors", "distance", "drawing", + "exp_structure", "fileformats", "files_io", "forms", diff --git a/mathics/builtin/exp_structure/structure.py b/mathics/builtin/exp_structure/general.py similarity index 61% rename from mathics/builtin/exp_structure/structure.py rename to mathics/builtin/exp_structure/general.py index bdb6a05e5..c76386039 100644 --- a/mathics/builtin/exp_structure/structure.py +++ b/mathics/builtin/exp_structure/general.py @@ -1,27 +1,18 @@ # -*- coding: utf-8 -*- """ -Expression Structure - -Structural transformations on Lists. +General Structural Expression Functions """ -import platform - +from mathics.algorithm.parts import python_levelspec, walk_levels from mathics.builtin.base import BinaryOperator, Builtin, Predefined -from mathics.builtin.lists import walk_levels from mathics.core.atoms import Integer, Integer0, Integer1, Rational -from mathics.core.expression import Expression +from mathics.core.exceptions import InvalidLevelspecError +from mathics.core.expression import Evaluation, Expression +from mathics.core.list import ListExpression from mathics.core.rules import Pattern from mathics.core.symbols import Atom, Symbol, SymbolFalse, SymbolTrue from mathics.core.systemsymbols import SymbolDirectedInfinity, SymbolMap -if platform.python_implementation() == "PyPy": - bytecount_support = False -else: - from .pympler.asizeof import asizeof as count_bytes - - bytecount_support = True - SymbolOperate = Symbol("Operate") SymbolSortBy = Symbol("SortBy") @@ -99,7 +90,7 @@ class BinarySearch(Builtin): summary_text = "search a sorted list for a key" - def eval(self, l, k, f, evaluation): + def eval(self, l, k, f, evaluation: Evaluation): "CombinatoricaOld`BinarySearch[l_List, k_, f_] /; Length[l] > 0" elements = l.elements @@ -147,30 +138,6 @@ def transform(x): lower_index = pivot_index + 1 -class ByteCount(Builtin): - """ - - :WMA link: - https://reference.wolfram.com/language/ref/ByteCount.html - -
-
'ByteCount[$expr$]' -
gives the internal memory space used by $expr$, in bytes. -
- - The results may heavily depend on the Python implementation in use. - """ - - summary_text = "amount of memory used by expr, in bytes" - - def eval(self, expression, evaluation): - "ByteCount[expression_]" - if not bytecount_support: - return evaluation.message("ByteCount", "pypy") - else: - return Integer(count_bytes(expression)) - - class Depth(Builtin): """ :WMA link:https://reference.wolfram.com/language/ref/Depth.html @@ -202,209 +169,12 @@ class Depth(Builtin): summary_text = "the maximum number of indices to specify any part" - def eval(self, expr, evaluation): + def eval(self, expr, evaluation: Evaluation): "Depth[expr_]" expr, depth = walk_levels(expr) return Integer(depth + 1) -class Flatten(Builtin): - """ - - :WMA link: - https://reference.wolfram.com/language/ref/Flatten.html - -
-
'Flatten[$expr$]' -
flattens out nested lists in $expr$. - -
'Flatten[$expr$, $n$]' -
stops flattening at level $n$. - -
'Flatten[$expr$, $n$, $h$]' -
flattens expressions with head $h$ instead of 'List'. -
- - >> Flatten[{{a, b}, {c, {d}, e}, {f, {g, h}}}] - = {a, b, c, d, e, f, g, h} - >> Flatten[{{a, b}, {c, {e}, e}, {f, {g, h}}}, 1] - = {a, b, c, {e}, e, f, {g, h}} - >> Flatten[f[a, f[b, f[c, d]], e], Infinity, f] - = f[a, b, c, d, e] - - >> Flatten[{{a, b}, {c, d}}, {{2}, {1}}] - = {{a, c}, {b, d}} - - >> Flatten[{{a, b}, {c, d}}, {{1, 2}}] - = {a, b, c, d} - - Flatten also works in irregularly shaped arrays - >> Flatten[{{1, 2, 3}, {4}, {6, 7}, {8, 9, 10}}, {{2}, {1}}] - = {{1, 4, 6, 8}, {2, 7, 9}, {3, 10}} - - #> Flatten[{{1, 2}, {3, 4}}, {{-1, 2}}] - : Levels to be flattened together in {{-1, 2}} should be lists of positive integers. - = Flatten[{{1, 2}, {3, 4}}, {{-1, 2}}, List] - - #> Flatten[{a, b}, {{1}, {2}}] - : Level 2 specified in {{1}, {2}} exceeds the levels, 1, which can be flattened together in {a, b}. - = Flatten[{a, b}, {{1}, {2}}, List] - - ## Check `n` completion - #> m = {{{1, 2}, {3}}, {{4}, {5, 6}}}; - #> Flatten[m, {{2}, {1}, {3}, {4}}] - : Level 4 specified in {{2}, {1}, {3}, {4}} exceeds the levels, 3, which can be flattened together in {{{1, 2}, {3}}, {{4}, {5, 6}}}. - = Flatten[{{{1, 2}, {3}}, {{4}, {5, 6}}}, {{2}, {1}, {3}, {4}}, List] - - ## Test from issue #251 - #> m = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}; - #> Flatten[m, {3}] - : Level 3 specified in {3} exceeds the levels, 2, which can be flattened together in {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}. - = Flatten[{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}, {3}, List] - - ## Reproduce strange head behaviour - #> Flatten[{{1}, 2}, {1, 2}] - : Level 2 specified in {1, 2} exceeds the levels, 1, which can be flattened together in {{1}, 2}. - = Flatten[{{1}, 2}, {1, 2}, List] - #> Flatten[a[b[1, 2], b[3]], {1, 2}, b] (* MMA BUG: {{1, 2}} not {1, 2} *) - : Level 1 specified in {1, 2} exceeds the levels, 0, which can be flattened together in a[b[1, 2], b[3]]. - = Flatten[a[b[1, 2], b[3]], {1, 2}, b] - - #> Flatten[{{1, 2}, {3, {4}}}, {{1, 2, 3}}] - : Level 3 specified in {{1, 2, 3}} exceeds the levels, 2, which can be flattened together in {{1, 2}, {3, {4}}}. - = Flatten[{{1, 2}, {3, {4}}}, {{1, 2, 3}}, List] - """ - - messages = { - "flpi": ( - "Levels to be flattened together in `1` " - "should be lists of positive integers." - ), - "flrep": ("Level `1` specified in `2` should not be repeated."), - "fldep": ( - "Level `1` specified in `2` exceeds the levels, `3`, " - "which can be flattened together in `4`." - ), - } - - rules = { - "Flatten[expr_]": "Flatten[expr, Infinity, Head[expr]]", - "Flatten[expr_, n_]": "Flatten[expr, n, Head[expr]]", - } - - summary_text = "flatten out any sequence of levels in a nested list" - - def eval_list(self, expr, n, h, evaluation): - "Flatten[expr_, n_List, h_]" - - # prepare levels - # find max depth which matches `h` - expr, max_depth = walk_levels(expr) - max_depth = {"max_depth": max_depth} # hack to modify max_depth from callback - - def callback(expr, pos): - if len(pos) < max_depth["max_depth"] and ( - isinstance(expr, Atom) or expr.head != h - ): - max_depth["max_depth"] = len(pos) - return expr - - expr, depth = walk_levels(expr, callback=callback, include_pos=True, start=0) - max_depth = max_depth["max_depth"] - - levels = n.to_python() - - # mappings - if isinstance(levels, list) and all(isinstance(level, int) for level in levels): - levels = [levels] - - # verify levels is list of lists of positive ints - if not (isinstance(levels, list) and len(levels) > 0): - evaluation.message("Flatten", "flpi", n) - return - seen_levels = [] - for level in levels: - if not (isinstance(level, list) and len(level) > 0): - evaluation.message("Flatten", "flpi", n) - return - for r in level: - if not (isinstance(r, int) and r > 0): - evaluation.message("Flatten", "flpi", n) - return - if r in seen_levels: - # level repeated - evaluation.message("Flatten", "flrep", r) - return - seen_levels.append(r) - - # complete the level spec e.g. {{2}} -> {{2}, {1}, {3}} - for s in range(1, max_depth + 1): - if s not in seen_levels: - levels.append([s]) - - # verify specified levels are smaller max depth - for level in levels: - for s in level: - if s > max_depth: - evaluation.message("Flatten", "fldep", s, n, max_depth, expr) - return - - # assign new indices to each element - new_indices = {} - - def callback(expr, pos): - if len(pos) == max_depth: - new_depth = tuple(tuple(pos[i - 1] for i in level) for level in levels) - new_indices[new_depth] = expr - return expr - - expr, depth = walk_levels(expr, callback=callback, include_pos=True) - - # build new tree inserting nodes as needed - elements = sorted(new_indices.items()) - - def insert_element(elements): - # gather elements into groups with the same leading index - # e.g. [((0, 0), a), ((0, 1), b), ((1, 0), c), ((1, 1), d)] - # -> [[(0, a), (1, b)], [(0, c), (1, d)]] - leading_index = None - grouped_elements = [] - for index, element in elements: - if index[0] == leading_index: - grouped_elements[-1].append((index[1:], element)) - else: - leading_index = index[0] - grouped_elements.append([(index[1:], element)]) - # for each group of elements we either insert them into the current level - # or make a new level and recurse - new_elements = [] - for group in grouped_elements: - if len(group[0][0]) == 0: # bottom level element or leaf - assert len(group) == 1 - new_elements.append(group[0][1]) - else: - new_elements.append(Expression(h, *insert_element(group))) - - return new_elements - - return Expression(h, *insert_element(elements)) - - def eval(self, expr, n, h, evaluation): - "Flatten[expr_, n_, h_]" - - if n == Expression(SymbolDirectedInfinity, Integer1): - n = -1 # a negative number indicates an unbounded level - else: - n_int = n.get_int_value() - # Here we test for negative since in Mathics Flatten[] as opposed to flatten_with_respect_to_head() - # negative numbers (and None) are not allowed. - if n_int is None or n_int < 0: - return evaluation.message("Flatten", "flpi", n) - n = n_int - - return expr.flatten_with_respect_to_head(h, level=n) - - class FreeQ(Builtin): """ @@ -438,7 +208,7 @@ class FreeQ(Builtin): "test whether an expression is free of subexpressions matching a pattern" ) - def eval(self, expr, form, evaluation): + def eval(self, expr, form, evaluation: Evaluation): "FreeQ[expr_, form_]" form = Pattern.create(form) @@ -448,6 +218,87 @@ def eval(self, expr, form, evaluation): return SymbolFalse +class Level(Builtin): + """ + + :WMA link: + https://reference.wolfram.com/language/ref/Level.html + +
+
'Level[$expr$, $levelspec$]' +
gives a list of all subexpressions of $expr$ at the + level(s) specified by $levelspec$. +
+ + Level uses standard level specifications: + +
+
$n$ +
levels 1 through $n$ +
'Infinity' +
all levels from level 1 +
'{$n$}' +
level $n$ only +
'{$m$, $n$}' +
levels $m$ through $n$ +
+ + Level 0 corresponds to the whole expression. + + A negative level '-$n$' consists of parts with depth $n$. + + Level -1 is the set of atoms in an expression: + >> Level[a + b ^ 3 * f[2 x ^ 2], {-1}] + = {a, b, 3, 2, x, 2} + + >> Level[{{{{a}}}}, 3] + = {{a}, {{a}}, {{{a}}}} + >> Level[{{{{a}}}}, -4] + = {{{{a}}}} + >> Level[{{{{a}}}}, -5] + = {} + + >> Level[h0[h1[h2[h3[a]]]], {0, -1}] + = {a, h3[a], h2[h3[a]], h1[h2[h3[a]]], h0[h1[h2[h3[a]]]]} + + Use the option 'Heads -> True' to include heads: + >> Level[{{{{a}}}}, 3, Heads -> True] + = {List, List, List, {a}, {{a}}, {{{a}}}} + >> Level[x^2 + y^3, 3, Heads -> True] + = {Plus, Power, x, 2, x ^ 2, Power, y, 3, y ^ 3} + + >> Level[a ^ 2 + 2 * b, {-1}, Heads -> True] + = {Plus, Power, a, 2, Times, 2, b} + >> Level[f[g[h]][x], {-1}, Heads -> True] + = {f, g, h, x} + >> Level[f[g[h]][x], {-2, -1}, Heads -> True] + = {f, g, h, g[h], x, f[g[h]][x]} + """ + + options = { + "Heads": "False", + } + summary_text = "parts specified by a given number of indices" + + def eval(self, expr, ls, evaluation, options={}): + "Level[expr_, ls_, OptionsPattern[Level]]" + + try: + start, stop = python_levelspec(ls) + except InvalidLevelspecError: + evaluation.message("Level", "level", ls) + return + result = [] + + def callback(level): + result.append(level) + return level + + heads = self.get_option(options, "Heads", evaluation) is SymbolTrue + walk_levels(expr, start, stop, heads=heads, callback=callback) + return ListExpression(*result) + + class Null(Predefined): """ @@ -507,7 +358,7 @@ class Operate(Builtin): "intnn": "Non-negative integer expected at position `2` in `1`.", } - def eval(self, p, expr, n, evaluation): + def eval(self, p, expr, n, evaluation: Evaluation): "Operate[p_, expr_, Optional[n_, 1]]" head_depth = n.get_int_value() @@ -568,7 +419,7 @@ class Order(Builtin): summary_text = "canonical ordering of expressions" - def eval(self, x, y, evaluation): + def eval(self, x, y, evaluation: Evaluation): "Order[x_, y_]" if x < y: return Integer1 @@ -598,7 +449,7 @@ class OrderedQ(Builtin): summary_text = "test whether elements are canonically sorted" - def eval(self, expr, evaluation): + def eval(self, expr, evaluation: Evaluation): "OrderedQ[expr_]" for index, value in enumerate(expr.elements[:-1]): @@ -631,7 +482,7 @@ class PatternsOrderedQ(Builtin): summary_text = "test whether patterns are canonically sorted" - def eval(self, p1, p2, evaluation): + def eval(self, p1, p2, evaluation: Evaluation): "PatternsOrderedQ[p1_, p2_]" if p1.get_sort_key(True) <= p2.get_sort_key(True): @@ -675,7 +526,7 @@ class SortBy(Builtin): summary_text = "sort by the values of a function applied to elements" - def eval(self, li, f, evaluation): + def eval(self, li, f, evaluation: Evaluation): "SortBy[li_, f_]" if isinstance(li, Atom): @@ -737,7 +588,7 @@ class Through(Builtin): summary_text = "distribute operators that appears inside the head of expressions" - def eval(self, p, args, x, evaluation): + def eval(self, p, args, x, evaluation: Evaluation): "Through[p_[args___][x___]]" elements = [] diff --git a/mathics/builtin/exp_structure/size_and_sig.py b/mathics/builtin/exp_structure/size_and_sig.py new file mode 100644 index 000000000..342e33a6b --- /dev/null +++ b/mathics/builtin/exp_structure/size_and_sig.py @@ -0,0 +1,208 @@ +""" +Expression Sizes and Signatures +""" +import hashlib +import platform +import zlib + +from mathics.algorithm.parts import walk_levels +from mathics.builtin.base import Builtin +from mathics.core.atoms import ByteArrayAtom, Integer, String +from mathics.core.attributes import A_PROTECTED, A_READ_PROTECTED +from mathics.core.evaluation import Evaluation +from mathics.core.expression import Expression +from mathics.core.systemsymbols import SymbolByteArray + +if platform.python_implementation() == "PyPy": + bytecount_support = False +else: + from mathics.builtin.pympler.asizeof import asizeof as count_bytes + + bytecount_support = True + +# This tells documentation how to sort this module +sort_order = "mathics.builtin.exp_structure.exp_sizes_and" + + +class _ZLibHash: # make zlib hashes behave as if they were from hashlib + def __init__(self, fn): + self._bytes = b"" + self._fn = fn + + def update(self, bytes): + self._bytes += bytes + + def hexdigest(self): + return format(self._fn(self._bytes), "x") + + +class ByteCount(Builtin): + """ + + :WMA link: + https://reference.wolfram.com/language/ref/ByteCount.html + +
+
'ByteCount[$expr$]' +
gives the internal memory space used by $expr$, in bytes. +
+ + The results may heavily depend on the Python implementation in use. + """ + + summary_text = "amount of memory used by expr, in bytes" + + def eval(self, expression, evaluation: Evaluation): + "ByteCount[expression_]" + if not bytecount_support: + return evaluation.message("ByteCount", "pypy") + else: + return Integer(count_bytes(expression)) + + +class Hash(Builtin): + """ + :Hash function:https://en.wikipedia.org/wiki/Hash_function \ + (:WMA link:https://reference.wolfram.com/language/ref/Hash.html) + +
+
'Hash[$expr$]' +
returns an integer hash for the given $expr$. + +
'Hash[$expr$, $type$]' +
returns an integer hash of the specified $type$ for the given $expr$. +
The types supported are "MD5", "Adler32", "CRC32", "SHA", "SHA224", "SHA256", "SHA384", and "SHA512". + +
'Hash[$expr$, $type$, $format$]' +
Returns the hash in the specified format. +
+ + > Hash["The Adventures of Huckleberry Finn"] + = 213425047836523694663619736686226550816 + + > Hash["The Adventures of Huckleberry Finn", "SHA256"] + = 95092649594590384288057183408609254918934351811669818342876362244564858646638 + + > Hash[1/3] + = 56073172797010645108327809727054836008 + + > Hash[{a, b, {c, {d, e, f}}}] + = 135682164776235407777080772547528225284 + + > Hash[SomeHead[3.1415]] + = 58042316473471877315442015469706095084 + + >> Hash[{a, b, c}, "xyzstr"] + = Hash[{a, b, c}, xyzstr, Integer] + """ + + attributes = A_PROTECTED | A_READ_PROTECTED + + rules = { + "Hash[expr_]": 'Hash[expr, "MD5", "Integer"]', + "Hash[expr_, type_String]": 'Hash[expr, type, "Integer"]', + } + + summary_text = "compute hash codes for a string" + + # FIXME md2 + _supported_hashes = { + "Adler32": lambda: _ZLibHash(zlib.adler32), + "CRC32": lambda: _ZLibHash(zlib.crc32), + "MD5": hashlib.md5, + "SHA": hashlib.sha1, + "SHA224": hashlib.sha224, + "SHA256": hashlib.sha256, + "SHA384": hashlib.sha384, + "SHA512": hashlib.sha512, + } + + @staticmethod + def compute(user_hash, py_hashtype, py_format): + hash_func = Hash._supported_hashes.get(py_hashtype) + if hash_func is None: # unknown hash function? + return # in order to return original Expression + h = hash_func() + user_hash(h.update) + res = h.hexdigest() + if py_format in ("HexString", "HexStringLittleEndian"): + return String(res) + res = int(res, 16) + if py_format == "DecimalString": + return String(str(res)) + elif py_format == "ByteArray": + return Expression(SymbolByteArray, ByteArrayAtom(res)) + return Integer(res) + + def eval(self, expr, hashtype: String, outformat: String, evaluation: Evaluation): + "Hash[expr_, hashtype_String, outformat_String]" + return Hash.compute(expr.user_hash, hashtype.value, outformat.value) + + +class LeafCount(Builtin): + """ + + :WMA link: + https://reference.wolfram.com/language/ref/LeafCount.html + +
+
'LeafCount[$expr$]' +
returns the total number of indivisible subexpressions in $expr$. +
+ + >> LeafCount[1 + x + y^a] + = 6 + + >> LeafCount[f[x, y]] + = 3 + + >> LeafCount[{1 / 3, 1 + I}] + = 7 + + >> LeafCount[Sqrt[2]] + = 5 + + >> LeafCount[100!] + = 1 + + #> LeafCount[f[a, b][x, y]] + = 5 + + #> NestList[# /. s[x_][y_][z_] -> x[z][y[z]] &, s[s][s][s[s]][s][s], 4]; + #> LeafCount /@ % + = {7, 8, 8, 11, 11} + + #> LeafCount[1 / 3, 1 + I] + : LeafCount called with 2 arguments; 1 argument is expected. + = LeafCount[1 / 3, 1 + I] + """ + + messages = { + "argx": "LeafCount called with `1` arguments; 1 argument is expected.", + } + summary_text = "the total number of atomic subexpressions" + + def eval(self, expr, evaluation: Evaluation): + "LeafCount[expr___]" + + from mathics.core.atoms import Complex, Rational + + elements = [] + + def callback(level): + if isinstance(level, Rational): + elements.extend( + [level.get_head(), level.numerator(), level.denominator()] + ) + elif isinstance(level, Complex): + elements.extend([level.get_head(), level.real, level.imag]) + else: + elements.append(level) + return level + + expr = expr.get_sequence() + if len(expr) != 1: + return evaluation.message("LeafCount", "argx", Integer(len(expr))) + + walk_levels(expr[0], start=-1, stop=-1, heads=True, callback=callback) + return Integer(len(elements)) diff --git a/mathics/builtin/files_io/filesystem.py b/mathics/builtin/files_io/filesystem.py index 43b5fefc0..3b8f86d6c 100644 --- a/mathics/builtin/files_io/filesystem.py +++ b/mathics/builtin/files_io/filesystem.py @@ -14,9 +14,9 @@ from mathics.builtin.atomic.strings import to_regex from mathics.builtin.base import Builtin, MessageException, Predefined +from mathics.builtin.exp_structure.size_and_sig import Hash from mathics.builtin.files_io.files import INITIAL_DIR # noqa is used via global from mathics.builtin.files_io.files import DIRECTORY_STACK, MathicsOpen -from mathics.builtin.string.operations import Hash from mathics.core.atoms import Integer, Real, String from mathics.core.attributes import ( A_LISTABLE, diff --git a/mathics/builtin/functional/apply_fns_to_lists.py b/mathics/builtin/functional/apply_fns_to_lists.py index 87ccb6380..9bbcf9c3d 100644 --- a/mathics/builtin/functional/apply_fns_to_lists.py +++ b/mathics/builtin/functional/apply_fns_to_lists.py @@ -12,8 +12,9 @@ from typing import Iterable +from mathics.algorithm.parts import python_levelspec, walk_levels from mathics.builtin.base import BinaryOperator, Builtin -from mathics.builtin.lists import List, python_levelspec, walk_levels +from mathics.builtin.lists import List from mathics.core.atoms import Integer from mathics.core.convert.expression import to_mathics_list from mathics.core.exceptions import ( diff --git a/mathics/builtin/list/rearrange.py b/mathics/builtin/list/rearrange.py index 5dbad21cd..0ed299f05 100644 --- a/mathics/builtin/list/rearrange.py +++ b/mathics/builtin/list/rearrange.py @@ -10,14 +10,15 @@ from itertools import chain from typing import Callable +from mathics.algorithm.parts import walk_levels from mathics.builtin.base import Builtin, MessageException -from mathics.core.atoms import Integer, Integer0 +from mathics.core.atoms import Integer, Integer0, Integer1 from mathics.core.attributes import A_FLAT, A_ONE_IDENTITY, A_PROTECTED from mathics.core.evaluation import Evaluation from mathics.core.expression import Expression, structure from mathics.core.list import ListExpression from mathics.core.symbols import Atom, Symbol, SymbolTrue -from mathics.core.systemsymbols import SymbolMap, SymbolSplit +from mathics.core.systemsymbols import SymbolDirectedInfinity, SymbolMap, SymbolSplit SymbolReverse = Symbol("Reverse") @@ -613,6 +614,203 @@ class Gather(_GatherOperation): _bin = _GatherBin +class Flatten(Builtin): + """ + + :WMA link: + https://reference.wolfram.com/language/ref/Flatten.html + +
+
'Flatten[$expr$]' +
flattens out nested lists in $expr$. + +
'Flatten[$expr$, $n$]' +
stops flattening at level $n$. + +
'Flatten[$expr$, $n$, $h$]' +
flattens expressions with head $h$ instead of 'List'. +
+ + >> Flatten[{{a, b}, {c, {d}, e}, {f, {g, h}}}] + = {a, b, c, d, e, f, g, h} + >> Flatten[{{a, b}, {c, {e}, e}, {f, {g, h}}}, 1] + = {a, b, c, {e}, e, f, {g, h}} + >> Flatten[f[a, f[b, f[c, d]], e], Infinity, f] + = f[a, b, c, d, e] + + >> Flatten[{{a, b}, {c, d}}, {{2}, {1}}] + = {{a, c}, {b, d}} + + >> Flatten[{{a, b}, {c, d}}, {{1, 2}}] + = {a, b, c, d} + + Flatten also works in irregularly shaped arrays + >> Flatten[{{1, 2, 3}, {4}, {6, 7}, {8, 9, 10}}, {{2}, {1}}] + = {{1, 4, 6, 8}, {2, 7, 9}, {3, 10}} + + #> Flatten[{{1, 2}, {3, 4}}, {{-1, 2}}] + : Levels to be flattened together in {{-1, 2}} should be lists of positive integers. + = Flatten[{{1, 2}, {3, 4}}, {{-1, 2}}, List] + + #> Flatten[{a, b}, {{1}, {2}}] + : Level 2 specified in {{1}, {2}} exceeds the levels, 1, which can be flattened together in {a, b}. + = Flatten[{a, b}, {{1}, {2}}, List] + + ## Check `n` completion + #> m = {{{1, 2}, {3}}, {{4}, {5, 6}}}; + #> Flatten[m, {{2}, {1}, {3}, {4}}] + : Level 4 specified in {{2}, {1}, {3}, {4}} exceeds the levels, 3, which can be flattened together in {{{1, 2}, {3}}, {{4}, {5, 6}}}. + = Flatten[{{{1, 2}, {3}}, {{4}, {5, 6}}}, {{2}, {1}, {3}, {4}}, List] + + ## Test from issue #251 + #> m = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}; + #> Flatten[m, {3}] + : Level 3 specified in {3} exceeds the levels, 2, which can be flattened together in {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}. + = Flatten[{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}, {3}, List] + + ## Reproduce strange head behaviour + #> Flatten[{{1}, 2}, {1, 2}] + : Level 2 specified in {1, 2} exceeds the levels, 1, which can be flattened together in {{1}, 2}. + = Flatten[{{1}, 2}, {1, 2}, List] + #> Flatten[a[b[1, 2], b[3]], {1, 2}, b] (* MMA BUG: {{1, 2}} not {1, 2} *) + : Level 1 specified in {1, 2} exceeds the levels, 0, which can be flattened together in a[b[1, 2], b[3]]. + = Flatten[a[b[1, 2], b[3]], {1, 2}, b] + + #> Flatten[{{1, 2}, {3, {4}}}, {{1, 2, 3}}] + : Level 3 specified in {{1, 2, 3}} exceeds the levels, 2, which can be flattened together in {{1, 2}, {3, {4}}}. + = Flatten[{{1, 2}, {3, {4}}}, {{1, 2, 3}}, List] + """ + + messages = { + "flpi": ( + "Levels to be flattened together in `1` " + "should be lists of positive integers." + ), + "flrep": ("Level `1` specified in `2` should not be repeated."), + "fldep": ( + "Level `1` specified in `2` exceeds the levels, `3`, " + "which can be flattened together in `4`." + ), + } + + rules = { + "Flatten[expr_]": "Flatten[expr, Infinity, Head[expr]]", + "Flatten[expr_, n_]": "Flatten[expr, n, Head[expr]]", + } + + summary_text = "flatten out any sequence of levels in a nested list" + + def eval_list(self, expr, n, h, evaluation): + "Flatten[expr_, n_List, h_]" + + # prepare levels + # find max depth which matches `h` + expr, max_depth = walk_levels(expr) + max_depth = {"max_depth": max_depth} # hack to modify max_depth from callback + + def callback(expr, pos): + if len(pos) < max_depth["max_depth"] and ( + isinstance(expr, Atom) or expr.head != h + ): + max_depth["max_depth"] = len(pos) + return expr + + expr, depth = walk_levels(expr, callback=callback, include_pos=True, start=0) + max_depth = max_depth["max_depth"] + + levels = n.to_python() + + # mappings + if isinstance(levels, list) and all(isinstance(level, int) for level in levels): + levels = [levels] + + # verify levels is list of lists of positive ints + if not (isinstance(levels, list) and len(levels) > 0): + evaluation.message("Flatten", "flpi", n) + return + seen_levels = [] + for level in levels: + if not (isinstance(level, list) and len(level) > 0): + evaluation.message("Flatten", "flpi", n) + return + for r in level: + if not (isinstance(r, int) and r > 0): + evaluation.message("Flatten", "flpi", n) + return + if r in seen_levels: + # level repeated + evaluation.message("Flatten", "flrep", r) + return + seen_levels.append(r) + + # complete the level spec e.g. {{2}} -> {{2}, {1}, {3}} + for s in range(1, max_depth + 1): + if s not in seen_levels: + levels.append([s]) + + # verify specified levels are smaller max depth + for level in levels: + for s in level: + if s > max_depth: + evaluation.message("Flatten", "fldep", s, n, max_depth, expr) + return + + # assign new indices to each element + new_indices = {} + + def callback(expr, pos): + if len(pos) == max_depth: + new_depth = tuple(tuple(pos[i - 1] for i in level) for level in levels) + new_indices[new_depth] = expr + return expr + + expr, depth = walk_levels(expr, callback=callback, include_pos=True) + + # build new tree inserting nodes as needed + elements = sorted(new_indices.items()) + + def insert_element(elements): + # gather elements into groups with the same leading index + # e.g. [((0, 0), a), ((0, 1), b), ((1, 0), c), ((1, 1), d)] + # -> [[(0, a), (1, b)], [(0, c), (1, d)]] + leading_index = None + grouped_elements = [] + for index, element in elements: + if index[0] == leading_index: + grouped_elements[-1].append((index[1:], element)) + else: + leading_index = index[0] + grouped_elements.append([(index[1:], element)]) + # for each group of elements we either insert them into the current level + # or make a new level and recurse + new_elements = [] + for group in grouped_elements: + if len(group[0][0]) == 0: # bottom level element or leaf + assert len(group) == 1 + new_elements.append(group[0][1]) + else: + new_elements.append(Expression(h, *insert_element(group))) + + return new_elements + + return Expression(h, *insert_element(elements)) + + def eval(self, expr, n, h, evaluation): + "Flatten[expr_, n_, h_]" + + if n == Expression(SymbolDirectedInfinity, Integer1): + n = -1 # a negative number indicates an unbounded level + else: + n_int = n.get_int_value() + # Here we test for negative since in Mathics Flatten[] as opposed to flatten_with_respect_to_head() + # negative numbers (and None) are not allowed. + if n_int is None or n_int < 0: + return evaluation.message("Flatten", "flpi", n) + n = n_int + + return expr.flatten_with_respect_to_head(h, level=n) + + class GatherBy(_GatherOperation): """ diff --git a/mathics/builtin/lists.py b/mathics/builtin/lists.py index c6000a4af..8c4180b55 100644 --- a/mathics/builtin/lists.py +++ b/mathics/builtin/lists.py @@ -5,7 +5,7 @@ Functions here will eventually get moved to more suitable subsections. """ -from mathics.algorithm.parts import python_levelspec, walk_levels +from mathics.algorithm.parts import python_levelspec from mathics.builtin.base import Builtin, Predefined, Test from mathics.builtin.box.layout import RowBox from mathics.core.atoms import Integer, Integer1, Integer2, String @@ -364,154 +364,6 @@ class IntersectingQ(Builtin): summary_text = "test whether two lists have common elements" -class LeafCount(Builtin): - """ - - :WMA link: - https://reference.wolfram.com/language/ref/LeafCount.html - -
-
'LeafCount[$expr$]' -
returns the total number of indivisible subexpressions in $expr$. -
- - >> LeafCount[1 + x + y^a] - = 6 - - >> LeafCount[f[x, y]] - = 3 - - >> LeafCount[{1 / 3, 1 + I}] - = 7 - - >> LeafCount[Sqrt[2]] - = 5 - - >> LeafCount[100!] - = 1 - - #> LeafCount[f[a, b][x, y]] - = 5 - - #> NestList[# /. s[x_][y_][z_] -> x[z][y[z]] &, s[s][s][s[s]][s][s], 4]; - #> LeafCount /@ % - = {7, 8, 8, 11, 11} - - #> LeafCount[1 / 3, 1 + I] - : LeafCount called with 2 arguments; 1 argument is expected. - = LeafCount[1 / 3, 1 + I] - """ - - messages = { - "argx": "LeafCount called with `1` arguments; 1 argument is expected.", - } - summary_text = "the total number of atomic subexpressions" - - def eval(self, expr, evaluation): - "LeafCount[expr___]" - - from mathics.core.atoms import Complex, Rational - - elements = [] - - def callback(level): - if isinstance(level, Rational): - elements.extend( - [level.get_head(), level.numerator(), level.denominator()] - ) - elif isinstance(level, Complex): - elements.extend([level.get_head(), level.real, level.imag]) - else: - elements.append(level) - return level - - expr = expr.get_sequence() - if len(expr) != 1: - return evaluation.message("LeafCount", "argx", Integer(len(expr))) - - walk_levels(expr[0], start=-1, stop=-1, heads=True, callback=callback) - return Integer(len(elements)) - - -class Level(Builtin): - """ - :WMA link:https://reference.wolfram.com/language/ref/Level.html - -
-
'Level[$expr$, $levelspec$]' -
gives a list of all subexpressions of $expr$ at the - level(s) specified by $levelspec$. -
- - Level uses standard level specifications: - -
-
$n$ -
levels 1 through $n$ -
'Infinity' -
all levels from level 1 -
'{$n$}' -
level $n$ only -
'{$m$, $n$}' -
levels $m$ through $n$ -
- - Level 0 corresponds to the whole expression. - - A negative level '-$n$' consists of parts with depth $n$. - - Level -1 is the set of atoms in an expression: - >> Level[a + b ^ 3 * f[2 x ^ 2], {-1}] - = {a, b, 3, 2, x, 2} - - >> Level[{{{{a}}}}, 3] - = {{a}, {{a}}, {{{a}}}} - >> Level[{{{{a}}}}, -4] - = {{{{a}}}} - >> Level[{{{{a}}}}, -5] - = {} - - >> Level[h0[h1[h2[h3[a]]]], {0, -1}] - = {a, h3[a], h2[h3[a]], h1[h2[h3[a]]], h0[h1[h2[h3[a]]]]} - - Use the option 'Heads -> True' to include heads: - >> Level[{{{{a}}}}, 3, Heads -> True] - = {List, List, List, {a}, {{a}}, {{{a}}}} - >> Level[x^2 + y^3, 3, Heads -> True] - = {Plus, Power, x, 2, x ^ 2, Power, y, 3, y ^ 3} - - >> Level[a ^ 2 + 2 * b, {-1}, Heads -> True] - = {Plus, Power, a, 2, Times, 2, b} - >> Level[f[g[h]][x], {-1}, Heads -> True] - = {f, g, h, x} - >> Level[f[g[h]][x], {-2, -1}, Heads -> True] - = {f, g, h, g[h], x, f[g[h]][x]} - """ - - options = { - "Heads": "False", - } - summary_text = "parts specified by a given number of indices" - - def eval(self, expr, ls, evaluation, options={}): - "Level[expr_, ls_, OptionsPattern[Level]]" - - try: - start, stop = python_levelspec(ls) - except InvalidLevelspecError: - evaluation.message("Level", "level", ls) - return - result = [] - - def callback(level): - result.append(level) - return level - - heads = self.get_option(options, "Heads", evaluation) is SymbolTrue - walk_levels(expr, start, stop, heads=heads, callback=callback) - return ListExpression(*result) - - class LevelQ(Test): """ :WMA link:https://reference.wolfram.com/language/ref/LevelQ.html diff --git a/mathics/builtin/logic.py b/mathics/builtin/logic.py index fa3ec2b54..e764f5672 100644 --- a/mathics/builtin/logic.py +++ b/mathics/builtin/logic.py @@ -1,8 +1,8 @@ # -*- coding: utf-8 -*- +from mathics.algorithm.parts import python_levelspec, walk_levels from mathics.builtin.base import BinaryOperator, Builtin, Predefined, PrefixOperator -from mathics.builtin.lists import InvalidLevelspecError, python_levelspec, walk_levels from mathics.core.attributes import ( A_FLAT, A_HOLD_ALL, @@ -11,6 +11,7 @@ A_ORDERLESS, A_PROTECTED, ) +from mathics.core.exceptions import InvalidLevelspecError from mathics.core.expression import Expression from mathics.core.symbols import Symbol, SymbolFalse, SymbolTrue from mathics.core.systemsymbols import ( diff --git a/mathics/builtin/string/operations.py b/mathics/builtin/string/operations.py index bc3eca85d..db2509b71 100644 --- a/mathics/builtin/string/operations.py +++ b/mathics/builtin/string/operations.py @@ -4,9 +4,7 @@ Operations on Strings """ -import hashlib import re -import zlib from mathics.algorithm.parts import convert_seq, python_seq from mathics.builtin.atomic.strings import ( @@ -17,7 +15,7 @@ to_regex, ) from mathics.builtin.base import BinaryOperator, Builtin -from mathics.core.atoms import ByteArrayAtom, Integer, Integer1, String +from mathics.core.atoms import Integer, Integer1, String from mathics.core.attributes import ( A_FLAT, A_LISTABLE, @@ -31,7 +29,6 @@ from mathics.core.symbols import Symbol, SymbolFalse, SymbolList, SymbolTrue from mathics.core.systemsymbols import ( SymbolAll, - SymbolByteArray, SymbolDirectedInfinity, SymbolOutputForm, ) @@ -44,102 +41,11 @@ SymbolStringSplit = Symbol("StringSplit") -class _ZLibHash: # make zlib hashes behave as if they were from hashlib - def __init__(self, fn): - self._bytes = b"" - self._fn = fn - - def update(self, bytes): - self._bytes += bytes - - def hexdigest(self): - return format(self._fn(self._bytes), "x") - - -class Hash(Builtin): - """ - :Hash function:https://en.wikipedia.org/wiki/Hash_function \ - (:WMA link:https://reference.wolfram.com/language/ref/Hash.html) - -
-
'Hash[$expr$]' -
returns an integer hash for the given $expr$. - -
'Hash[$expr$, $type$]' -
returns an integer hash of the specified $type$ for the given $expr$. -
The types supported are "MD5", "Adler32", "CRC32", "SHA", "SHA224", "SHA256", "SHA384", and "SHA512". - -
'Hash[$expr$, $type$, $format$]' -
Returns the hash in the specified format. -
- - > Hash["The Adventures of Huckleberry Finn"] - = 213425047836523694663619736686226550816 - - > Hash["The Adventures of Huckleberry Finn", "SHA256"] - = 95092649594590384288057183408609254918934351811669818342876362244564858646638 - - > Hash[1/3] - = 56073172797010645108327809727054836008 - - > Hash[{a, b, {c, {d, e, f}}}] - = 135682164776235407777080772547528225284 - - > Hash[SomeHead[3.1415]] - = 58042316473471877315442015469706095084 - - >> Hash[{a, b, c}, "xyzstr"] - = Hash[{a, b, c}, xyzstr, Integer] - """ - - attributes = A_PROTECTED | A_READ_PROTECTED - - rules = { - "Hash[expr_]": 'Hash[expr, "MD5", "Integer"]', - "Hash[expr_, type_String]": 'Hash[expr, type, "Integer"]', - } - - summary_text = "compute hash codes for a string" - - # FIXME md2 - _supported_hashes = { - "Adler32": lambda: _ZLibHash(zlib.adler32), - "CRC32": lambda: _ZLibHash(zlib.crc32), - "MD5": hashlib.md5, - "SHA": hashlib.sha1, - "SHA224": hashlib.sha224, - "SHA256": hashlib.sha256, - "SHA384": hashlib.sha384, - "SHA512": hashlib.sha512, - } - - @staticmethod - def compute(user_hash, py_hashtype, py_format): - hash_func = Hash._supported_hashes.get(py_hashtype) - if hash_func is None: # unknown hash function? - return # in order to return original Expression - h = hash_func() - user_hash(h.update) - res = h.hexdigest() - if py_format in ("HexString", "HexStringLittleEndian"): - return String(res) - res = int(res, 16) - if py_format == "DecimalString": - return String(str(res)) - elif py_format == "ByteArray": - return Expression(SymbolByteArray, ByteArrayAtom(res)) - return Integer(res) - - def apply(self, expr, hashtype, outformat, evaluation): - "Hash[expr_, hashtype_String, outformat_String]" - return Hash.compute( - expr.user_hash, hashtype.get_string_value(), outformat.get_string_value() - ) - - class StringDrop(Builtin): """ - :WMA link:https://reference.wolfram.com/language/ref/StringDrop.html + + :WMA link: + https://reference.wolfram.com/language/ref/StringDrop.html
'StringDrop["$string$", $n$]' @@ -177,7 +83,7 @@ class StringDrop(Builtin): summary_text = "drop a part of a string" - def apply_with_n(self, string, n, evaluation): + def eval_with_n(self, string, n, evaluation): "StringDrop[string_,n_Integer]" if not isinstance(string, String): return evaluation.message("StringDrop", "strse") @@ -195,7 +101,7 @@ def apply_with_n(self, string, n, evaluation): return string return evaluation.message("StringDrop", "mseqs") - def apply_with_ni_nf(self, string, ni, nf, evaluation): + def eval_with_ni_nf(self, string, ni, nf, evaluation): "StringDrop[string_,{ni_Integer,nf_Integer}]" if not isinstance(string, String): return evaluation.message("StringDrop", "strse", string) @@ -217,7 +123,7 @@ def apply_with_ni_nf(self, string, ni, nf, evaluation): return string # this is what actually mma does return String(fullstring[: (posi - 1)] + fullstring[posf:]) - def apply_with_ni(self, string, ni, evaluation): + def eval_with_ni(self, string, ni, evaluation): "StringDrop[string_,{ni_Integer}]" if not isinstance(string, String): return evaluation.message("StringDrop", "strse", string) @@ -232,7 +138,7 @@ def apply_with_ni(self, string, ni, evaluation): return evaluation.message("StringDrop", "drop", ni, ni, fullstring) return String(fullstring[: (posi - 1)] + fullstring[posi:]) - def apply(self, string, something, evaluation): + def eval(self, string, something, evaluation): "StringDrop[string_,something___]" if not isinstance(string, String): return evaluation.message("StringDrop", "strse") @@ -386,7 +292,7 @@ def _insert(self, str, add, lpos, evaluation): return result - def apply(self, strsource, strnew, pos, evaluation): + def eval(self, strsource, strnew, pos, evaluation): "StringInsert[strsource_, strnew_, pos_]" exp = Expression(SymbolStringInsert, strsource, strnew, pos) @@ -457,7 +363,7 @@ class StringJoin(BinaryOperator): precedence = 600 summary_text = "join strings together" - def apply(self, items, evaluation): + def eval(self, items, evaluation): "StringJoin[items___]" result = "" if hasattr(items, "flatten_with_respect_to_head"): @@ -498,7 +404,7 @@ class StringLength(Builtin): summary_text = "length of a string (in Unicode characters)" - def apply(self, str, evaluation): + def eval(self, str, evaluation): "StringLength[str_]" if not isinstance(str, String): evaluation.message("StringLength", "string") @@ -580,9 +486,9 @@ class StringPosition(Builtin): summary_text = "range of positions where substrings match a pattern" - def apply(self, string, patt, evaluation, options): + def eval(self, string, patt, evaluation, options): "StringPosition[string_, patt_, OptionsPattern[StringPosition]]" - return self.apply_n( + return self.eval_n( string, patt, Expression(SymbolDirectedInfinity, Integer1), @@ -590,7 +496,7 @@ def apply(self, string, patt, evaluation, options): options, ) - def apply_n(self, string, patt, n, evaluation, options): + def eval_n(self, string, patt, n, evaluation, options): "StringPosition[string_, patt_, n:(_Integer|DirectedInfinity[1]), OptionsPattern[StringPosition]]" expr = Expression(SymbolStringPosition, string, patt, n) @@ -777,7 +683,7 @@ def cases(): return Expression(SymbolStringJoin, *list(cases())) - def apply(self, string, rule, n, evaluation, options): + def eval(self, string, rule, n, evaluation, options): "%(name)s[string_, rule_, OptionsPattern[%(name)s], n_:System`Private`Null]" # this pattern is a slight hack to get around missing Shortest/Longest. return self._apply(string, rule, n, evaluation, options, False) @@ -799,7 +705,7 @@ class StringReverse(Builtin): attributes = A_LISTABLE | A_PROTECTED summary_text = "reverses the order of the characters in a string" - def apply(self, string, evaluation): + def eval(self, string, evaluation): "StringReverse[string_String]" return String(string.get_string_value()[::-1]) @@ -880,7 +786,7 @@ class StringRiffle(Builtin): summary_text = "assemble a string from a list, inserting delimiters" - def apply(self, liststr, seps, evaluation): + def eval(self, liststr, seps, evaluation): "StringRiffle[liststr_, seps___]" separators = seps.get_sequence() exp = ( @@ -1006,12 +912,12 @@ class StringSplit(Builtin): summary_text = "split strings at whitespace, or at a pattern" - def apply(self, string, patt, evaluation, options): + def eval(self, string, patt, evaluation, options): "StringSplit[string_, patt_, OptionsPattern[%(name)s]]" if string.get_head_name() == "System`List": elements = [ - self.apply(s, patt, evaluation, options) for s in string.elements + self.eval(s, patt, evaluation, options) for s in string.elements ] return ListExpression(*elements) @@ -1129,7 +1035,7 @@ class StringTake(Builtin): summary_text = "sub-string from a range of positions" - def apply(self, string, seqspec, evaluation): + def eval(self, string, seqspec, evaluation): "StringTake[string_String, seqspec_]" result = string.get_string_value() if result is None: @@ -1155,11 +1061,11 @@ def apply(self, string, seqspec, evaluation): return String(result[py_slice]) - def apply_strings(self, strings, spec, evaluation): + def eval_strings(self, strings, spec, evaluation): "StringTake[strings__, spec_]" result_list = [] for string in strings.elements: - result = self.apply(string, spec, evaluation) + result = self.eval(string, spec, evaluation) if result is None: return None result_list.append(result) @@ -1184,11 +1090,11 @@ class StringTrim(Builtin): summary_text = "trim whitespace etc. from strings" - def apply(self, s, evaluation): + def eval(self, s, evaluation): "StringTrim[s_String]" return String(s.get_string_value().strip(" \t\n")) - def apply_pattern(self, s, patt, expression, evaluation): + def eval_pattern(self, s, patt, expression, evaluation): "StringTrim[s_String, patt_]" text = s.get_string_value() if not text: diff --git a/setup.py b/setup.py index 317d9b1cb..0e6124979 100644 --- a/setup.py +++ b/setup.py @@ -173,6 +173,7 @@ def subdirs(root, file="*.*", depth=10): "mathics.builtin.box", "mathics.builtin.colors", "mathics.builtin.distance", + "mathics.builtin.exp_structure", "mathics.builtin.drawing", "mathics.builtin.fileformats", "mathics.builtin.files_io", From 1846690be53c747cd14df5ba142b895c213d0bee Mon Sep 17 00:00:00 2001 From: rocky Date: Sat, 7 Jan 2023 11:15:16 -0500 Subject: [PATCH 029/209] Correct title on Layout --- mathics/builtin/layout.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/mathics/builtin/layout.py b/mathics/builtin/layout.py index 26419763f..a79729f67 100644 --- a/mathics/builtin/layout.py +++ b/mathics/builtin/layout.py @@ -1,6 +1,8 @@ # -*- coding: utf-8 -*- """ +Layout + This module contains symbols used to define the high level layout for expression formatting. From 80f25f16c17f47c74ab8079d5899b4fae12bca57 Mon Sep 17 00:00:00 2001 From: rocky Date: Sat, 7 Jan 2023 11:17:23 -0500 Subject: [PATCH 030/209] A doc format typo --- mathics/builtin/layout.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mathics/builtin/layout.py b/mathics/builtin/layout.py index a79729f67..0940ff1ce 100644 --- a/mathics/builtin/layout.py +++ b/mathics/builtin/layout.py @@ -7,7 +7,7 @@ expression formatting. For instance, to represent a set of consecutive expressions in a row, -we can use ``Row`` +we can use 'Row'. """ From 1c019372e95ce0c58ca59e01b743685c4ed43e9e Mon Sep 17 00:00:00 2001 From: rocky Date: Sat, 7 Jan 2023 11:40:22 -0500 Subject: [PATCH 031/209] More apply->eval conversions --- mathics/builtin/numeric.py | 28 +++++++++++++--------- mathics/builtin/physchemdata.py | 7 +++--- mathics/builtin/recurrence.py | 2 +- mathics/builtin/string/patterns.py | 11 +++++---- mathics/builtin/tensors.py | 38 ++++++++++++++++++++---------- mathics/builtin/trace.py | 22 ++++++++--------- 6 files changed, 64 insertions(+), 44 deletions(-) diff --git a/mathics/builtin/numeric.py b/mathics/builtin/numeric.py index d769f4d7a..c54a78c60 100644 --- a/mathics/builtin/numeric.py +++ b/mathics/builtin/numeric.py @@ -2,12 +2,14 @@ # -*- coding: utf-8 -*- # Note: docstring is flowed in documentation. Line breaks in the docstring will appear in the -# printed output, so be carful not to add then mid-sentence. +# printed output, so be careful not to add them mid-sentence. Line breaks like \ +# this work though. """ Numerical Functions -Support for approximate real numbers and exact real numbers represented in algebraic or symbolic form. +Support for approximate real numbers and exact real numbers represented \ +in algebraic or symbolic form. """ import sympy @@ -16,6 +18,7 @@ from mathics.core.atoms import Complex, Integer, Integer0, Rational, Real from mathics.core.attributes import A_LISTABLE, A_NUMERIC_FUNCTION, A_PROTECTED from mathics.core.convert.sympy import from_sympy +from mathics.core.evaluation import Evaluation from mathics.core.expression import Expression from mathics.core.number import machine_epsilon from mathics.core.symbols import SymbolDivide, SymbolMachinePrecision, SymbolTimes @@ -74,7 +77,7 @@ class Chop(Builtin): summary_text = "set sufficiently small numbers or imaginary parts to zero" - def apply(self, expr, delta, evaluation): + def eval(self, expr, delta, evaluation: Evaluation): "Chop[expr_, delta_:(10^-10)]" delta = delta.round_to_float(evaluation) @@ -210,7 +213,7 @@ class N(Builtin): summary_text = "numerical evaluation to specified precision and accuracy" - def apply_with_prec(self, expr, prec, evaluation, options=None): + def eval_with_prec(self, expr, prec, evaluation, options=None): "N[expr_, prec_, OptionsPattern[%(name)s]]" # If options are passed, set the preference in evaluation, and call again @@ -241,7 +244,7 @@ def apply_with_prec(self, expr, prec, evaluation, options=None): return eval_nvalues(expr, prec, evaluation) - def apply_N(self, expr, evaluation): + def eval_N(self, expr, evaluation: Evaluation): """N[expr_]""" # TODO: Specialize for atoms return eval_nvalues(expr, SymbolMachinePrecision, evaluation) @@ -249,11 +252,13 @@ def apply_N(self, expr, evaluation): class Rationalize(Builtin): """ - :WMA link:https://reference.wolfram.com/language/ref/Rationalize.html + :WMA link: + https://reference.wolfram.com/language/ref/Rationalize.html
'Rationalize[$x$]' -
converts a real number $x$ to a nearby rational number with small denominator. +
converts a real number $x$ to a nearby rational number with \ + small denominator.
'Rationalize[$x$, $dx$]'
finds the rational number lies within $dx$ of $x$. @@ -262,7 +267,8 @@ class Rationalize(Builtin): >> Rationalize[2.2] = 11 / 5 - For negative $x$, '-Rationalize[-$x$] == Rationalize[$x$]' which gives symmetric results: + For negative $x$, '-Rationalize[-$x$] == Rationalize[$x$]' which \ + gives symmetric results: >> Rationalize[-11.5, 1] = -11 @@ -298,7 +304,7 @@ class Rationalize(Builtin): summary_text = "find a rational approximation" - def apply(self, x, evaluation): + def eval(self, x, evaluation: Evaluation): "Rationalize[x_]" py_x = x.to_sympy() @@ -341,7 +347,7 @@ def find_exact(x): if abs(x - i) < machine_epsilon: return i - def apply_dx(self, x, dx, evaluation): + def eval_dx(self, x, dx, evaluation: Evaluation): "Rationalize[x_, dx_]" py_x = x.to_sympy() if py_x is None: @@ -470,7 +476,7 @@ class Round(Builtin): summary_text = "find closest integer or multiple of" - def apply(self, expr, k, evaluation): + def eval(self, expr, k, evaluation: Evaluation): "Round[expr_?NumericQ, k_?NumericQ]" n = Expression(SymbolDivide, expr, k).round_to_float( diff --git a/mathics/builtin/physchemdata.py b/mathics/builtin/physchemdata.py index 6f12885c4..60d6776f1 100644 --- a/mathics/builtin/physchemdata.py +++ b/mathics/builtin/physchemdata.py @@ -11,6 +11,7 @@ from mathics.builtin.base import Builtin from mathics.core.atoms import Integer, String from mathics.core.convert.python import from_python +from mathics.core.evaluation import Evaluation from mathics.core.expression import Expression from mathics.core.symbols import Symbol, strip_context @@ -113,16 +114,16 @@ class ElementData(Builtin): summary_text = "Data about chemical elements" - def apply_all(self, evaluation): + def eval_all(self, evaluation: Evaluation): "ElementData[All]" iprop = _ELEMENT_DATA[0].index("StandardName") return from_python([element[iprop] for element in _ELEMENT_DATA[1:]]) - def apply_all_properties(self, evaluation): + def eval_all_properties(self, evaluation: Evaluation): 'ElementData[All, "Properties"]' return from_python(sorted(_ELEMENT_DATA[0])) - def apply_name(self, expr, prop, evaluation): + def eval_name(self, expr, prop, evaluation: Evaluation): "ElementData[expr_, prop_]" if isinstance(expr, String): diff --git a/mathics/builtin/recurrence.py b/mathics/builtin/recurrence.py index afc0cb0d3..f93afec1b 100644 --- a/mathics/builtin/recurrence.py +++ b/mathics/builtin/recurrence.py @@ -63,7 +63,7 @@ class RSolve(Builtin): } summary_text = "recurrence equations solver" - def apply(self, eqns, a, n, evaluation): + def eval(self, eqns, a, n, evaluation): "RSolve[eqns_, a_, n_]" # TODO: Do this with rules? diff --git a/mathics/builtin/string/patterns.py b/mathics/builtin/string/patterns.py index 601bfa7c5..c614918b7 100644 --- a/mathics/builtin/string/patterns.py +++ b/mathics/builtin/string/patterns.py @@ -16,6 +16,7 @@ from mathics.builtin.base import BinaryOperator, Builtin from mathics.core.atoms import Integer1, String from mathics.core.attributes import A_FLAT, A_LISTABLE, A_ONE_IDENTITY, A_PROTECTED +from mathics.core.evaluation import Evaluation from mathics.core.expression import Expression from mathics.core.list import ListExpression from mathics.core.symbols import Symbol, SymbolFalse, SymbolTrue @@ -223,7 +224,7 @@ class StringCases(_StringFind): } summary_text = "occurrences of string patterns in a string" - def _find(self, py_stri, py_rules, py_n, flags, evaluation): + def _find(self, py_stri, py_rules, py_n, flags, evaluation: Evaluation): def cases(): for match, form in _parallel_match(py_stri, py_rules, flags, py_n): if form is None: @@ -233,7 +234,7 @@ def cases(): return ListExpression(*list(cases())) - def apply(self, string, rule, n, evaluation, options): + def eval(self, string, rule, n, evaluation: Evaluation, options): "%(name)s[string_, rule_, OptionsPattern[%(name)s], n_:System`Private`Null]" # this pattern is a slight hack to get around missing Shortest/Longest. return self._apply(string, rule, n, evaluation, options, True) @@ -268,7 +269,7 @@ class StringExpression(BinaryOperator): } summary_text = "an arbitrary string expression" - def apply(self, args, evaluation): + def eval(self, args, evaluation: Evaluation): "StringExpression[args__String]" args = args.get_sequence() args = [arg.get_string_value() for arg in args] @@ -376,7 +377,7 @@ class StringFreeQ(Builtin): summary_text = "test whether a string is free of substrings matching a pattern" - def apply(self, string, patt, evaluation, options): + def eval(self, string, patt, evaluation: Evaluation, options): "StringFreeQ[string_, patt_, OptionsPattern[%(name)s]]" return _pattern_search( self.__class__.__name__, string, patt, evaluation, options, False @@ -461,7 +462,7 @@ class StringMatchQ(Builtin): } summary_text = "test whether a string matches a pattern" - def apply(self, string, patt, evaluation, options): + def eval(self, string, patt, evaluation: Evaluation, options): "StringMatchQ[string_, patt_, OptionsPattern[%(name)s]]" py_string = string.get_string_value() if py_string is None: diff --git a/mathics/builtin/tensors.py b/mathics/builtin/tensors.py index aca59104d..17fd3583f 100644 --- a/mathics/builtin/tensors.py +++ b/mathics/builtin/tensors.py @@ -3,11 +3,19 @@ """ Tensors -A :tensor: https://en.wikipedia.org/wiki/Tensor is an algebraic object that describes a (multilinear) relationship between sets of algebraic objects related to a vector space. Objects that tensors may map between include vectors and scalars, and even other tensors. - -There are many types of tensors, including scalars and vectors (which are the simplest tensors), dual vectors, multilinear maps between vector spaces, and even some operations such as the dot product. Tensors are defined independent of any basis, although they are often referred to by their components in a basis related to a particular coordinate system. - -Mathics represents tensors of vectors and matrices as lists; tensors of any rank can be handled. +A :tensor: https://en.wikipedia.org/wiki/Tensor is an algebraic \ +object that describes a (multilinear) relationship between sets of algebraic \ +objects related to a vector space. Objects that tensors may map between \ +include vectors and scalars, and even other tensors. + +There are many types of tensors, including scalars and vectors (which are \ +the simplest tensors), dual vectors, multilinear maps between vector spaces, \ +and even some operations such as the dot product. Tensors are defined \ +independent of any basis, although they are often referred to by their \ +components in a basis related to a particular coordinate system. + +Mathics3 represents tensors of vectors and matrices as lists; tensors \ +of any rank can be handled. """ @@ -15,6 +23,7 @@ from mathics.builtin.base import BinaryOperator, Builtin from mathics.core.atoms import Integer, String from mathics.core.attributes import A_FLAT, A_ONE_IDENTITY, A_PROTECTED +from mathics.core.evaluation import Evaluation from mathics.core.expression import Expression from mathics.core.list import ListExpression from mathics.core.rules import Pattern @@ -74,11 +83,13 @@ def get_dimensions(expr, head=None): class ArrayDepth(Builtin): """ - :WMA: https://reference.wolfram.com/language/ref/ArrayDepth.html + :WMA link: + https://reference.wolfram.com/language/ref/ArrayDepth.html
'ArrayDepth[$a$]' -
returns the depth of the non-ragged array $a$, defined as 'Length[Dimensions[$a$]]'. +
returns the depth of the non-ragged array $a$, defined as \ + 'Length[Dimensions[$a$]]'.
>> ArrayDepth[{{a,b},{c,d}}] @@ -127,7 +138,7 @@ class ArrayQ(Builtin): summary_text = "test whether an object is a tensor of a given rank" - def apply(self, expr, pattern, test, evaluation): + def eval(self, expr, pattern, test, evaluation: Evaluation): "ArrayQ[expr_, pattern_, test_]" pattern = Pattern.create(pattern) @@ -196,7 +207,7 @@ class Dimensions(Builtin): summary_text = "the dimensions of a tensor" - def apply(self, expr, evaluation): + def eval(self, expr, evaluation: Evaluation): "Dimensions[expr_]" return ListExpression(*[Integer(dim) for dim in get_dimensions(expr)]) @@ -285,7 +296,7 @@ class Inner(Builtin): summary_text = "generalized inner product" - def apply(self, f, list1, list2, g, evaluation): + def eval(self, f, list1, list2, g, evaluation: Evaluation): "Inner[f_, list1_, list2_, g_]" m = get_dimensions(list1) @@ -369,7 +380,7 @@ class Outer(Builtin): summary_text = "generalized outer product" - def apply(self, f, lists, evaluation): + def eval(self, f, lists, evaluation: Evaluation): "Outer[f_, lists__]" lists = lists.get_sequence() @@ -554,7 +565,7 @@ class Transpose(Builtin): summary_text = "transpose to rearrange indices in any way" - def apply(self, m, evaluation): + def eval(self, m, evaluation: Evaluation): "Transpose[m_?MatrixQ]" result = [] @@ -571,7 +582,8 @@ def apply(self, m, evaluation): # are subsumed by Elements of Lists. class VectorQ(Builtin): """ - :WMA link: https://reference.wolfram.com/language/ref/VectorQ.html + :WMA link: + https://reference.wolfram.com/language/ref/VectorQ.html
'VectorQ[$v$]' diff --git a/mathics/builtin/trace.py b/mathics/builtin/trace.py index a523baa35..84a7c161c 100644 --- a/mathics/builtin/trace.py +++ b/mathics/builtin/trace.py @@ -1,5 +1,4 @@ # -*- coding: utf-8 -*- - """ Tracing Built-in Functions @@ -7,7 +6,8 @@ getting evaluated and where the time is spent in evaluation. With this, it may be possible for both users and implementers to follow \ -how Mathics arrives at its results, or guide how to speed up expression evaluation. +how Mathics3 arrives at its results, or guide how to speed up expression \ +evaluation. """ @@ -24,7 +24,7 @@ from mathics.core.symbols import SymbolFalse, SymbolNull, SymbolTrue, strip_context -def traced_do_replace(self, expression, vars, options, evaluation): +def traced_do_replace(self, expression, vars, options, evaluation: Evaluation): if options and self.check_options: if not self.check_options(options, evaluation): return None @@ -80,7 +80,7 @@ class ClearTrace(Builtin): summary_text = "clear any statistics collected for Built-in functions" - def apply(self, evaluation): + def eval(self, evaluation: Evaluation): "%(name)s[]" TraceBuiltins.function_stats: "defaultdict" = defaultdict( @@ -124,7 +124,7 @@ class PrintTrace(_TraceBase): summary_text = "print statistics collected for Built-in functions" - def apply(self, evaluation, options={}): + def eval(self, evaluation, options={}): "%(name)s[OptionsPattern[%(name)s]]" TraceBuiltins.dump_tracing_stats( @@ -229,7 +229,7 @@ def disable_trace(evaluation) -> None: BuiltinRule.do_replace = TraceBuiltins.do_replace_copy evaluation.definitions = TraceBuiltins.definitions_copy - def apply(self, expr, evaluation, options={}): + def eval(self, expr, evaluation, options={}): "%(name)s[expr_, OptionsPattern[%(name)s]]" # Reset function_stats @@ -295,12 +295,12 @@ class TraceBuiltinsVariable(Builtin): summary_text = "enable or disable Built-in function evaluation statistics" - def apply_get(self, evaluation): + def eval_get(self, evaluation: Evaluation): "%(name)s" return self.value - def apply_set(self, value, evaluation): + def eval_set(self, value, evaluation: Evaluation): "%(name)s = value_" if value is SymbolTrue: @@ -339,7 +339,7 @@ class TraceEvaluation(Builtin): } summary_text = "trace the succesive evaluations" - def apply(self, expr, evaluation, options): + def eval(self, expr, evaluation, options): "TraceEvaluation[expr_, OptionsPattern[]]" curr_trace_evaluation = evaluation.definitions.trace_evaluation curr_time_by_steps = evaluation.definitions.timing_trace_evaluation @@ -393,11 +393,11 @@ class TraceEvaluationVariable(Builtin): summary_text = "enable or disable displaying the steps to get the result" - def apply_get(self, evaluation): + def eval_get(self, evaluation: Evaluation): "%(name)s" return from_bool(evaluation.definitions.trace_evaluation) - def apply_set(self, value, evaluation): + def eval_set(self, value, evaluation: Evaluation): "%(name)s = value_" if value is SymbolTrue: evaluation.definitions.trace_evaluation = True From 98a5db7485062c427e66591f5118034ec0d6c6fa Mon Sep 17 00:00:00 2001 From: rocky Date: Sat, 7 Jan 2023 12:40:15 -0500 Subject: [PATCH 032/209] Back off `apply` a in one place --- mathics/builtin/numeric.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mathics/builtin/numeric.py b/mathics/builtin/numeric.py index c54a78c60..c5bb41a02 100644 --- a/mathics/builtin/numeric.py +++ b/mathics/builtin/numeric.py @@ -213,7 +213,7 @@ class N(Builtin): summary_text = "numerical evaluation to specified precision and accuracy" - def eval_with_prec(self, expr, prec, evaluation, options=None): + def apply_with_prec(self, expr, prec, evaluation, options=None): "N[expr_, prec_, OptionsPattern[%(name)s]]" # If options are passed, set the preference in evaluation, and call again @@ -244,7 +244,7 @@ def eval_with_prec(self, expr, prec, evaluation, options=None): return eval_nvalues(expr, prec, evaluation) - def eval_N(self, expr, evaluation: Evaluation): + def apply_N(self, expr, evaluation): """N[expr_]""" # TODO: Specialize for atoms return eval_nvalues(expr, SymbolMachinePrecision, evaluation) From c7ff11c5c2d6ac7008f0c9bd1955a29ff102a7f5 Mon Sep 17 00:00:00 2001 From: rocky Date: Sat, 7 Jan 2023 13:24:15 -0500 Subject: [PATCH 033/209] More of the same -- apply -> eval, split long lines, evaluation annotation type --- mathics/builtin/specialfns/bessel.py | 97 ++++++++++++++++++++---- mathics/builtin/statistics/dependency.py | 36 ++++++--- mathics/builtin/statistics/location.py | 7 +- mathics/builtin/statistics/orderstats.py | 61 ++++++++++----- mathics/builtin/string/characters.py | 31 +++++--- 5 files changed, 177 insertions(+), 55 deletions(-) diff --git a/mathics/builtin/specialfns/bessel.py b/mathics/builtin/specialfns/bessel.py index 3a861eb9c..b3b097ab5 100644 --- a/mathics/builtin/specialfns/bessel.py +++ b/mathics/builtin/specialfns/bessel.py @@ -15,6 +15,7 @@ A_READ_PROTECTED, ) from mathics.core.convert.mpmath import from_mpmath +from mathics.core.evaluation import Evaluation from mathics.core.number import ( PrecisionValueError, get_precision, @@ -32,7 +33,10 @@ class _Bessel(_MPMathFunction): class AiryAi(_MPMathFunction): """ - :Airy function of the first kind: https://en.wikipedia.org/wiki/Airy_function (:SymPy: https://docs.sympy.org/latest/modules/functions/special.html#sympy.functions.special.bessel.airyai, :WMA: https://reference.wolfram.com/language/ref/AiryAi.html) + :Airy function of the first kind: + https://en.wikipedia.org/wiki/Airy_function ( + :SymPy: https://docs.sympy.org/latest/modules/functions/special.html#sympy.functions.special.bessel.airyai, + :WMA: https://reference.wolfram.com/language/ref/AiryAi.html)
'AiryAi[$x$]'
returns the Airy function Ai($x$). @@ -63,7 +67,11 @@ class AiryAi(_MPMathFunction): class AiryAiPrime(_MPMathFunction): """ - Derivative of Airy function (:Sympy: https://docs.sympy.org/latest/modules/functions/special.html#sympy.functions.special.bessel.airyaiprime, :WMA link:https://reference.wolfram.com/language/ref/AiryAiPrime.html) + Derivative of Airy function ( + :Sympy: + https://docs.sympy.org/latest/modules/functions/special.html#sympy.functions.special.bessel.airyaiprime, + :WMA link: + https://reference.wolfram.com/language/ref/AiryAiPrime.html)
'AiryAiPrime[$x$]'
returns the derivative of the Airy function 'AiryAi[$x$]'. @@ -132,7 +140,7 @@ class AiryAiZero(Builtin): summary_text = "kth zero of the Airy's function Ai" - def apply_N(self, k, precision, evaluation): + def eval_N(self, k, precision, evaluation: Evaluation): "N[AiryAiZero[k_Integer], precision_]" try: @@ -258,7 +266,7 @@ class AiryBiZero(Builtin): summary_text = "kth zero of the Airy's function Bi" - def apply_N(self, k: Integer, precision, evaluation): + def eval_N(self, k: Integer, precision, evaluation: Evaluation): "N[AiryBiZero[k_Integer], precision_]" try: @@ -280,7 +288,13 @@ def apply_N(self, k: Integer, precision, evaluation): class AngerJ(_Bessel): """ - :Anger function: https://en.wikipedia.org/wiki/Anger_function (:mpmath: https://mpmath.org/doc/current/functions/bessel.html#mpmath.angerj, :WMA: https://reference.wolfram.com/language/ref/AngerJ.html) + + :Anger function: + https://en.wikipedia.org/wiki/Anger_function ( + :mpmath: + https://mpmath.org/doc/current/functions/bessel.html#mpmath.angerj, + :WMA: + https://reference.wolfram.com/language/ref/AngerJ.html)
'AngerJ[$n$, $z$]'
returns the Anger function J_$n$($z$). @@ -307,7 +321,13 @@ class BesselI(_Bessel): """ - :Modified Bessel function of the first kind: https://en.wikipedia.org/wiki/Bessel_function#Bessel_functions_of_the_first_kind:_J%CE%B1 (:Sympy: https://docs.sympy.org/latest/modules/functions/special.html#sympy.functions.special.bessel.besseli, :WMA: https://reference.wolfram.com/language/ref/BesselI.html) + + :Modified Bessel function of the first kind: + https://en.wikipedia.org/wiki/Bessel_function#Bessel_functions_of_the_first_kind:_J%CE%B1 ( + :Sympy: + https://docs.sympy.org/latest/modules/functions/special.html#sympy.functions.special.bessel.besseli, + :WMA: + https://reference.wolfram.com/language/ref/BesselI.html)
'BesselI[$n$, $z$]' @@ -336,7 +356,13 @@ class BesselI(_Bessel): class BesselJ(_Bessel): """ - :Bessel function of the first kind: https://en.wikipedia.org/wiki/Bessel_function#Bessel_functions_of_the_first_kind:_J%CE%B1 (:SymPy: https://docs.sympy.org/latest/modules/functions/special.html#sympy.functions.special.bessel.besselj, :WMA: https://reference.wolfram.com/language/ref/BesselJ.html) + + :Bessel function of the first kind: + https://en.wikipedia.org/wiki/Bessel_function#Bessel_functions_of_the_first_kind:_J%CE%B1 ( + :SymPy: + https://docs.sympy.org/latest/modules/functions/special.html#sympy.functions.special.bessel.besselj, + :WMA: + https://reference.wolfram.com/language/ref/BesselJ.html)
'BesselJ[$n$, $z$]' @@ -379,7 +405,13 @@ class BesselJ(_Bessel): class BesselK(_Bessel): """ - :Modified Bessel function of the second kind: https://en.wikipedia.org/wiki/Bessel_function#Modified_Bessel_functions:_I%CE%B1,_K%CE%B1 (:SymPy: https://docs.sympy.org/latest/modules/functions/special.html#sympy.functions.special.bessel.besselk, :WMA:https://reference.wolfram.com/language/ref/BesselJ.html) + + :Modified Bessel function of the second kind: + https://en.wikipedia.org/wiki/Bessel_function#Modified_Bessel_functions:_I%CE%B1,_K%CE%B1 ( + :SymPy: + https://docs.sympy.org/latest/modules/functions/special.html#sympy.functions.special.bessel.besselk, + :WMA: + https://reference.wolfram.com/language/ref/BesselJ.html)
'BesselK[$n$, $z$]' @@ -407,8 +439,13 @@ class BesselK(_Bessel): class BesselY(_Bessel): """ - :Bessel function of the second kind: https://en.wikipedia.org/wiki/Bessel_function#Bessel_functions_of_the_second_kind:_Y%CE%B1 (:SymPy: https://docs.sympy.org/latest/modules/functions/special.html#sympy.functions.special.bessel.bessely, :WMA:https://reference.wolfram.com/language/ref/BesselY.html) - + + :Bessel function of the second kind: + https://en.wikipedia.org/wiki/Bessel_function#Bessel_functions_of_the_second_kind:_Y%CE%B1 ( + :SymPy: + https://docs.sympy.org/latest/modules/functions/special.html#sympy.functions.special.bessel.bessely, + :WMA: + https://reference.wolfram.com/language/ref/BesselY.html)
'BesselY[$n$, $z$]' @@ -539,7 +576,13 @@ class HankelH2(_Bessel): class KelvinBei(_Bessel): """ - :Kelvin function bei: https://en.wikipedia.org/wiki/Kelvin_functions#bei(x) (:mpmath: https://mpmath.org/doc/current/functions/bessel.html#bei, :WMA: https://reference.wolfram.com/language/ref/KelvinBei.html) + + :Kelvin function bei: + https://en.wikipedia.org/wiki/Kelvin_functions#bei(x) ( + :mpmath: + https://mpmath.org/doc/current/functions/bessel.html#bei, + :WMA: + https://reference.wolfram.com/language/ref/KelvinBei.html)
'KelvinBei[$z$]' @@ -574,7 +617,13 @@ class KelvinBei(_Bessel): class KelvinBer(_Bessel): """ - :Kelvin function ber: https://en.wikipedia.org/wiki/Kelvin_functions#ber(x) (:mpmath: https://mpmath.org/doc/current/functions/bessel.html#ber, :WMA: https://reference.wolfram.com/language/ref/KelvinBer.html) + + :Kelvin function ber: + https://en.wikipedia.org/wiki/Kelvin_functions#ber(x) ( + :mpmath: + https://mpmath.org/doc/current/functions/bessel.html#ber, + :WMA: + https://reference.wolfram.com/language/ref/KelvinBer.html)
'KelvinBer[$z$]'
returns the Kelvin function ber($z$). @@ -609,7 +658,13 @@ class KelvinBer(_Bessel): class KelvinKei(_Bessel): """ - :Kelvin function kei: https://en.wikipedia.org/wiki/Kelvin_functions#kei(x) (:mpmath: https://mpmath.org/doc/current/functions/bessel.html#kei, :WMA: https://reference.wolfram.com/language/ref/KelvinKei.html) + + :Kelvin function kei: + https://en.wikipedia.org/wiki/Kelvin_functions#kei(x) ( + :mpmath: + https://mpmath.org/doc/current/functions/bessel.html#kei, + :WMA: + https://reference.wolfram.com/language/ref/KelvinKei.html)
'KelvinKei[$z$]' @@ -676,7 +731,13 @@ class KelvinKer(_Bessel): class SphericalBesselJ(_Bessel): """ - :Spherical Bessel function of the first kind: https://en.wikipedia.org/wiki/Bessel_function#Spherical_Bessel_functions (:Sympy: https://docs.sympy.org/latest/modules/functions/special.html#sympy.functions.special.bessel.jn, :WMA: https://reference.wolfram.com/language/ref/SphericalBesselJ.html) + + :Spherical Bessel function of the first kind: + https://en.wikipedia.org/wiki/Bessel_function#Spherical_Bessel_functions ( + :Sympy: + https://docs.sympy.org/latest/modules/functions/special.html#sympy.functions.special.bessel.jn, + :WMA: + https://reference.wolfram.com/language/ref/SphericalBesselJ.html)
'SphericalBesselJ[$n$, $z$]' @@ -699,7 +760,13 @@ class SphericalBesselJ(_Bessel): class SphericalBesselY(_Bessel): """ - :Spherical Bessel function of the first kind: https://en.wikipedia.org/wiki/Bessel_function#Spherical_Bessel_functions (:Sympy: https://docs.sympy.org/latest/modules/functions/special.html#sympy.functions.special.bessel.yn, :WMA: https://reference.wolfram.com/language/ref/SphericalBesselY.html) + + :Spherical Bessel function of the first kind: + https://en.wikipedia.org/wiki/Bessel_function#Spherical_Bessel_functions ( + :Sympy: + https://docs.sympy.org/latest/modules/functions/special.html#sympy.functions.special.bessel.yn, + :WMA: + https://reference.wolfram.com/language/ref/SphericalBesselY.html)
'SphericalBesselY[$n$, $z$]' diff --git a/mathics/builtin/statistics/dependency.py b/mathics/builtin/statistics/dependency.py index fdc0e75f3..8e3262e1a 100644 --- a/mathics/builtin/statistics/dependency.py +++ b/mathics/builtin/statistics/dependency.py @@ -12,6 +12,7 @@ from mathics.builtin.base import Builtin from mathics.builtin.lists import _NotRectangularException, _Rectangular from mathics.core.atoms import Integer +from mathics.core.evaluation import Evaluation from mathics.core.expression import Expression from mathics.core.symbols import Symbol, SymbolDivide from mathics.core.systemsymbols import SymbolDot, SymbolMean, SymbolSubtract @@ -29,7 +30,11 @@ class Correlation(Builtin): """ - :Pearson correlation coefficient:https://en.wikipedia.org/wiki/Pearson_correlation_coefficient (:WMA: https://reference.wolfram.com/language/ref/Correlation.html) + + :Pearson correlation coefficient: + https://en.wikipedia.org/wiki/Pearson_correlation_coefficient ( + :WMA: + https://reference.wolfram.com/language/ref/Correlation.html)
'Correlation[$a$, $b$]' @@ -48,7 +53,7 @@ class Correlation(Builtin): } summary_text = "Pearson's correlation of a pair of datasets" - def apply(self, a, b, evaluation): + def eval(self, a, b, evaluation: Evaluation): "Correlation[a_List, b_List]" if len(a.elements) != len(b.elements): @@ -65,7 +70,11 @@ def apply(self, a, b, evaluation): class Covariance(Builtin): """ - :Covariance: https://en.wikipedia.org/wiki/Covariance (:WMA: https://reference.wolfram.com/language/ref/Covariance.html) + + :Covariance: + https://en.wikipedia.org/wiki/Covariance ( + :WMA: + https://reference.wolfram.com/language/ref/Covariance.html)
'Covariance[$a$, $b$]'
computes the covariance between the equal-sized vectors $a$ and $b$. @@ -81,7 +90,7 @@ class Covariance(Builtin): } summary_text = "covariance matrix for a pair of datasets" - def apply(self, a, b, evaluation): + def eval(self, a, b, evaluation: Evaluation): "Covariance[a_List, b_List]" if len(a.elements) != len(b.elements): @@ -102,10 +111,15 @@ def apply(self, a, b, evaluation): class StandardDeviation(_Rectangular): """ - :Standard deviation: https://en.wikipedia.org/wiki/Standard_deviation (:WMA: https://reference.wolfram.com/language/ref/StandardDeviation.html) + + :Standard deviation: + https://en.wikipedia.org/wiki/Standard_deviation ( + :WMA: + https://reference.wolfram.com/language/ref/StandardDeviation.html)
'StandardDeviation[$list$]' -
computes the standard deviation of $list. $list$ may consist of numerical values or symbols. Numerical values may be real or complex. +
computes the standard deviation of $list. $list$ may consist of \ + numerical values or symbols. Numerical values may be real or complex. StandardDeviation[{{$a1$, $a2$, ...}, {$b1$, $b2$, ...}, ...}] will yield {StandardDeviation[{$a1$, $b1$, ...}, StandardDeviation[{$a2$, $b2$, ...}], ...}. @@ -130,7 +144,7 @@ class StandardDeviation(_Rectangular): } summary_text = "standard deviation of a dataset" - def apply(self, l, evaluation): + def eval(self, l, evaluation: Evaluation): "StandardDeviation[l_List]" if len(l.elements) <= 1: evaluation.message("StandardDeviation", "shlen", l) @@ -147,7 +161,11 @@ def apply(self, l, evaluation): class Variance(_Rectangular): """ - :Variance: https://en.wikipedia.org/wiki/Variance (:WMA: https://reference.wolfram.com/language/ref/Variance.html) + + :Variance: + https://en.wikipedia.org/wiki/Variance ( + :WMA: + https://reference.wolfram.com/language/ref/Variance.html)
'Variance[$list$]'
computes the variance of $list. $list$ may consist of numerical values or symbols. Numerical values may be real or complex. @@ -180,7 +198,7 @@ class Variance(_Rectangular): # for the general formulation of real and complex variance below, see for example # https://en.wikipedia.org/wiki/Variance#Generalizations - def apply(self, l, evaluation): + def eval(self, l, evaluation: Evaluation): "Variance[l_List]" if len(l.elements) <= 1: evaluation.message("Variance", "shlen", l) diff --git a/mathics/builtin/statistics/location.py b/mathics/builtin/statistics/location.py index 4225cbdab..0f0cd1e6f 100644 --- a/mathics/builtin/statistics/location.py +++ b/mathics/builtin/statistics/location.py @@ -6,13 +6,16 @@ from mathics.builtin.base import Builtin from mathics.builtin.lists import _NotRectangularException, _Rectangular from mathics.core.atoms import Integer2 +from mathics.core.evaluation import Evaluation from mathics.core.expression import Expression from mathics.core.symbols import Symbol, SymbolDivide, SymbolPlus class Mean(Builtin): """ - :WMA link:https://reference.wolfram.com/language/ref/Mean.html + + :WMA link: + https://reference.wolfram.com/language/ref/Mean.html
'Mean[$list$]' @@ -62,7 +65,7 @@ class Median(_Rectangular): messages = {"rectn": "Expected a rectangular array of numbers at position 1 in ``."} summary_text = "central value of a dataset" - def apply(self, data, evaluation): + def eval(self, data, evaluation: Evaluation): "Median[data_List]" if not data.elements: return diff --git a/mathics/builtin/statistics/orderstats.py b/mathics/builtin/statistics/orderstats.py index a176d2878..5a8f63f0c 100644 --- a/mathics/builtin/statistics/orderstats.py +++ b/mathics/builtin/statistics/orderstats.py @@ -1,11 +1,16 @@ """ Order Statistics -In statistics, an :order statistic: https://en.wikipedia.org/wiki/Order_statistic gives the $k$-th smmallest value. +In statistics, an :order statistic: +https://en.wikipedia.org/wiki/Order_statistic gives \ +the $k$-th smallest value. -Together with :rank statistics: https://en.wikipedia.org/wiki/Ranking these are fundamental tools in non-parametric statistics and inference. +Together with :rank statistics: +https://en.wikipedia.org/wiki/Ranking these are \ +fundamental tools in non-parametric statistics and inference. -Important special cases of order statistics are finding minimum and maximum value of a sample and sample quantiles. +Important special cases of order statistics are finding \ +minimum and maximum value of a sample and sample quantiles. """ from mpmath import ceil as mpceil, floor as mpfloor @@ -14,7 +19,7 @@ from mathics.builtin.base import Builtin from mathics.builtin.list.math import _RankedTakeLargest, _RankedTakeSmallest from mathics.core.atoms import Atom, Integer, Symbol, SymbolTrue -from mathics.core.expression import Expression +from mathics.core.expression import Evaluation, Expression from mathics.core.list import ListExpression from mathics.core.symbols import SymbolFloor, SymbolPlus, SymbolTimes from mathics.core.systemsymbols import SymbolSubtract @@ -27,8 +32,15 @@ class Quantile(Builtin): """ - :Quantile: https://en.wikipedia.org/wiki/Quantile (:WMA: https://reference.wolfram.com/language/ref/Quantile.html) - In statistics and probability, quantiles are cut points dividing the range of a probability distribution into continuous intervals with equal probabilities, or dividing the observations in a sample in the same way. + + :Quantile: + https://en.wikipedia.org/wiki/Quantile ( + :WMA: + https://reference.wolfram.com/language/ref/Quantile.html) + + In statistics and probability, quantiles are cut points dividing the \ + range of a probability distribution into continuous intervals with \ + equal probabilities, or dividing the observations in a sample in the same way. Quantile is also known as value at risk (VaR) or fractile.
@@ -42,7 +54,9 @@ class Quantile(Builtin): If $x$ is an integer, the result is '$s$[[$x$]]', where $s$='Sort[list,Less]'. - Otherwise, the result is 's[[Floor[x]]]+(s[[Ceiling[x]]]-s[[Floor[x]]])(c+dFractionalPart[x])', with the indices taken to be 1 or n if they are out of range. + Otherwise, the result is \ + 's[[Floor[x]]]+(s[[Ceiling[x]]]-s[[Floor[x]]])(c+dFractionalPart[x])', \ + with the indices taken to be 1 or n if they are out of range. The default choice of parameters is '{{0,0},{1,0}}'.
@@ -75,7 +89,7 @@ class Quantile(Builtin): } summary_text = "cut points dividing the range of a probability distribution into continuous intervals" - def apply(self, data, qs, a, b, c, d, evaluation): + def eval(self, data, qs, a, b, c, d, evaluation: Evaluation): """Quantile[data_List, qs_List, {{a_, b_}, {c_, d_}}]""" n = len(data.elements) @@ -141,7 +155,10 @@ def ranked(i): class Quartiles(Builtin): """ - :Quartile: https://en.wikipedia.org/wiki/Quartile (:WMA: https://reference.wolfram.com/language/ref/Quartiles.html) + :Quartile: + https://en.wikipedia.org/wiki/Quartile ( + :WMA: + https://reference.wolfram.com/language/ref/Quartiles.html)
'Quartiles[$list$]'
returns the 1/4, 1/2, and 3/4 quantiles of $list$. @@ -177,7 +194,7 @@ class RankedMax(Builtin): } summary_text = "the n-th largest item" - def apply(self, element, n: Integer, evaluation): + def eval(self, element, n: Integer, evaluation: Evaluation): "RankedMax[element_List, n_Integer]" py_n = n.value if py_n < 1: @@ -194,11 +211,14 @@ def apply(self, element, n: Integer, evaluation): class RankedMin(Builtin): """ - :WMA link:https://reference.wolfram.com/language/ref/RankedMin.html + :WMA link: + https://reference.wolfram.com/language/ref/RankedMin.html
'RankedMin[$list$, $n$]' -
returns the $n$th smallest element of $list$ (with $n$ = 1 yielding the smallest element, $n$ = 2 yielding the second smallest element, and so on). +
returns the $n$th smallest element of $list$ (with \ + $n$ = 1 yielding the smallest element, $n$ = 2 yielding \ + the second smallest element, and so on).
>> RankedMin[{482, 17, 181, -12}, 2] @@ -211,7 +231,7 @@ class RankedMin(Builtin): } summary_text = "the n-th smallest item" - def apply(self, element, n: Integer, evaluation): + def eval(self, element, n: Integer, evaluation: Evaluation): "RankedMin[element_List, n_Integer]" py_n = n.value if py_n < 1: @@ -230,7 +250,8 @@ class Sort(Builtin):
'Sort[$list$]' -
sorts $list$ (or the elements of any other expression) according to canonical ordering. +
sorts $list$ (or the elements of any other expression) according \ + to canonical ordering.
'Sort[$list$, $p$]'
sorts using $p$ to determine the order of two elements. @@ -258,7 +279,7 @@ class Sort(Builtin): summary_text = "sort lexicographically or with any comparison function" - def apply(self, list, evaluation): + def eval(self, list, evaluation: Evaluation): "Sort[list_]" if isinstance(list, Atom): @@ -267,7 +288,7 @@ def apply(self, list, evaluation): new_elements = sorted(list.elements) return list.restructure(list.head, new_elements, evaluation) - def apply_predicate(self, list, p, evaluation): + def eval_predicate(self, list, p, evaluation: Evaluation): "Sort[list_, p_]" if isinstance(list, Atom): @@ -292,7 +313,9 @@ def __gt__(self, other): class TakeLargest(_RankedTakeLargest): """ - :WMA link:https://reference.wolfram.com/language/ref/TakeLargest.html + + :WMA link: + https://reference.wolfram.com/language/ref/TakeLargest.html
'TakeLargest[$list$, $f$, $n$]' @@ -314,7 +337,7 @@ class TakeLargest(_RankedTakeLargest): summary_text = "sublist of n largest elements" - def apply(self, element, n, evaluation, options): + def eval(self, element, n, evaluation, options): "TakeLargest[element_List, n_, OptionsPattern[TakeLargest]]" return self._compute(element, n, evaluation, options) @@ -336,7 +359,7 @@ class TakeSmallest(_RankedTakeSmallest): summary_text = "sublist of n smallest elements" - def apply(self, element, n, evaluation, options): + def eval(self, element, n, evaluation, options): "TakeSmallest[element_List, n_, OptionsPattern[TakeSmallest]]" return self._compute(element, n, evaluation, options) diff --git a/mathics/builtin/string/characters.py b/mathics/builtin/string/characters.py index 778266b2c..eaa5dce98 100644 --- a/mathics/builtin/string/characters.py +++ b/mathics/builtin/string/characters.py @@ -8,12 +8,15 @@ from mathics.core.atoms import String from mathics.core.attributes import A_LISTABLE, A_PROTECTED, A_READ_PROTECTED from mathics.core.convert.expression import to_mathics_list +from mathics.core.evaluation import Evaluation from mathics.core.list import ListExpression class Characters(Builtin): """ - :WMA link:https://reference.wolfram.com/language/ref/Characters.html + + :WMA link: + https://reference.wolfram.com/language/ref/Characters.html
'Characters["$string$"]' @@ -39,7 +42,7 @@ class Characters(Builtin): attributes = A_LISTABLE | A_PROTECTED summary_text = "list the characters in a string" - def apply(self, string, evaluation): + def eval(self, string, evaluation: Evaluation): "Characters[string_String]" return to_mathics_list(*string.value, elements_conversion_fn=String) @@ -47,7 +50,9 @@ def apply(self, string, evaluation): class CharacterRange(Builtin): """ - :WMA link:https://reference.wolfram.com/language/ref/CharacterRange.html + + :WMA link: + https://reference.wolfram.com/language/ref/CharacterRange.html
'CharacterRange["$a$", "$b$"]' @@ -68,7 +73,7 @@ class CharacterRange(Builtin): summary_text = "range of characters with successive character codes" - def apply(self, start, stop, evaluation): + def eval(self, start, stop, evaluation: Evaluation): "CharacterRange[start_String, stop_String]" if len(start.value) != 1 or len(stop.value) != 1: @@ -81,11 +86,14 @@ def apply(self, start, stop, evaluation): class DigitQ(Builtin): """ - :WMA link:https://reference.wolfram.com/language/ref/DigitQ.html + + :WMA link: + https://reference.wolfram.com/language/ref/DigitQ.html
'DigitQ[$string$]' -
yields 'True' if all the characters in the $string$ are digits, and yields 'False' otherwise. +
yields 'True' if all the characters in the $string$ are \ + digits, and yields 'False' otherwise.
@@ -113,11 +121,14 @@ class DigitQ(Builtin): class LetterQ(Builtin): """ - :WMA link:https://reference.wolfram.com/language/ref/LetterQ.html + + :WMA link: + https://reference.wolfram.com/language/ref/LetterQ.html
'LetterQ[$string$]' -
yields 'True' if all the characters in the $string$ are letters, and yields 'False' otherwise. +
yields 'True' if all the characters in the $string$ are \ + letters, and yields 'False' otherwise.
>> LetterQ["m"] @@ -186,7 +197,7 @@ class ToLowerCase(Builtin): attributes = A_LISTABLE | A_PROTECTED summary_text = "turn all the letters into lower case" - def apply(self, s, evaluation): + def eval(self, s, evaluation: Evaluation): "ToLowerCase[s_String]" return String(s.get_string_value().lower()) @@ -207,7 +218,7 @@ class ToUpperCase(Builtin): attributes = A_LISTABLE | A_PROTECTED summary_text = "turn all the letters into upper case" - def apply(self, s, evaluation): + def eval(self, s, evaluation: Evaluation): "ToUpperCase[s_String]" return String(s.get_string_value().upper()) From 501b2c6f52e0491365513c9a61f31fb3f3f0d325 Mon Sep 17 00:00:00 2001 From: rocky Date: Sat, 7 Jan 2023 14:30:53 -0500 Subject: [PATCH 034/209] Optional software name: scikit-image -> skimage scikit-image is not a valid module name. We use this in reporting optional software --- mathics/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mathics/__init__.py b/mathics/__init__.py index 8c45fe456..ff26e6b2e 100644 --- a/mathics/__init__.py +++ b/mathics/__init__.py @@ -32,7 +32,7 @@ "networkx", "nltk", "psutil", - "scikit-image", + "skimage", "scipy", "wordcloud", ) From 3a2e66eb3182bfb9ba85678f8b0f40ed1a3aa938 Mon Sep 17 00:00:00 2001 From: Davide Cavalca Date: Sat, 7 Jan 2023 16:05:11 -0800 Subject: [PATCH 035/209] ExampleData: fix spurious executable permissions --- mathics/data/ExampleData/InventionNo1.xml | 0 mathics/data/ExampleData/numberdata.csv | 0 2 files changed, 0 insertions(+), 0 deletions(-) mode change 100755 => 100644 mathics/data/ExampleData/InventionNo1.xml mode change 100755 => 100644 mathics/data/ExampleData/numberdata.csv diff --git a/mathics/data/ExampleData/InventionNo1.xml b/mathics/data/ExampleData/InventionNo1.xml old mode 100755 new mode 100644 diff --git a/mathics/data/ExampleData/numberdata.csv b/mathics/data/ExampleData/numberdata.csv old mode 100755 new mode 100644 From 46e8a073b066dd273c8afc5ec67b6a88ebcf9ced Mon Sep 17 00:00:00 2001 From: Tiago Cavalcante Trindade Date: Sun, 8 Jan 2023 08:35:31 -0300 Subject: [PATCH 036/209] Replace Lena image with Hedy Lamarr image --- mathics/builtin/colors/color_operations.py | 2 +- mathics/builtin/files_io/importexport.py | 2 +- mathics/builtin/image/basic.py | 36 ++++++++++----------- mathics/builtin/image/colors.py | 6 ++-- mathics/builtin/image/composition.py | 6 ++-- mathics/builtin/image/filters.py | 18 +++++------ mathics/builtin/image/misc.py | 10 +++--- mathics/builtin/image/pixel.py | 18 +++++------ mathics/builtin/image/properties.py | 10 +++--- mathics/builtin/image/test.py | 2 +- mathics/data/ExampleData/copyright.csv | 2 +- mathics/data/ExampleData/hedy.tif | Bin 0 -> 1551537 bytes mathics/data/ExampleData/lena.tif | Bin 786572 -> 0 bytes test/builtin/drawing/test_image.py | 6 ++-- 14 files changed, 59 insertions(+), 59 deletions(-) create mode 100644 mathics/data/ExampleData/hedy.tif delete mode 100644 mathics/data/ExampleData/lena.tif diff --git a/mathics/builtin/colors/color_operations.py b/mathics/builtin/colors/color_operations.py index 4de7f4cc6..5e8b1d2aa 100644 --- a/mathics/builtin/colors/color_operations.py +++ b/mathics/builtin/colors/color_operations.py @@ -301,7 +301,7 @@ class DominantColors(Builtin): The option "MinColorDistance" specifies the distance (in LAB color space) up \ to which colors are merged and thus regarded as belonging to the same dominant color. - >> img = Import["ExampleData/lena.tif"] + >> img = Import["ExampleData/hedy.tif"] = -Image- >> DominantColors[img] diff --git a/mathics/builtin/files_io/importexport.py b/mathics/builtin/files_io/importexport.py index 2b0b3852d..82d6cdaf3 100644 --- a/mathics/builtin/files_io/importexport.py +++ b/mathics/builtin/files_io/importexport.py @@ -2134,7 +2134,7 @@ class FileFormat(Builtin): >> FileFormat["ExampleData/EinsteinSzilLetter.txt"] = Text - >> FileFormat["ExampleData/lena.tif"] + >> FileFormat["ExampleData/hedy.tif"] = TIFF ## ASCII text diff --git a/mathics/builtin/image/basic.py b/mathics/builtin/image/basic.py index 1549c5c33..2a3d9b311 100644 --- a/mathics/builtin/image/basic.py +++ b/mathics/builtin/image/basic.py @@ -33,10 +33,10 @@ class Blur(Builtin):
blurs $image$ with a kernel of size $r$.
- >> lena = Import["ExampleData/lena.tif"]; - >> Blur[lena] + >> hedy = Import["ExampleData/hedy.tif"]; + >> Blur[hedy] = -Image- - >> Blur[lena, 5] + >> Blur[hedy, 5] = -Image- """ @@ -67,8 +67,8 @@ class ImageAdjust(Builtin):
adjusts the contrast $c$, brightness $b$, and gamma $g$ in $image$.
- >> lena = Import["ExampleData/lena.tif"]; - >> ImageAdjust[lena] + >> hedy = Import["ExampleData/hedy.tif"]; + >> ImageAdjust[hedy] = -Image- """ @@ -130,25 +130,25 @@ class ImagePartition(Builtin):
Partitions an image into an array of $w$ x $h$ pixel subimages.
- >> lena = Import["ExampleData/lena.tif"]; - >> ImageDimensions[lena] + >> hedy = Import["ExampleData/hedy.tif"]; + >> ImageDimensions[hedy] = {512, 512} - >> ImagePartition[lena, 256] + >> ImagePartition[hedy, 256] = {{-Image-, -Image-}, {-Image-, -Image-}} - >> ImagePartition[lena, {512, 128}] + >> ImagePartition[hedy, {512, 128}] = {{-Image-}, {-Image-}, {-Image-}, {-Image-}} - #> ImagePartition[lena, 257] + #> ImagePartition[hedy, 257] = {{-Image-}} - #> ImagePartition[lena, 512] + #> ImagePartition[hedy, 512] = {{-Image-}} - #> ImagePartition[lena, 513] + #> ImagePartition[hedy, 513] = {} - #> ImagePartition[lena, {256, 300}] + #> ImagePartition[hedy, {256, 300}] = {{-Image-, -Image-}} - #> ImagePartition[lena, {0, 300}] + #> ImagePartition[hedy, {0, 300}] : {0, 300} is not a valid size specification for image partitions. = ImagePartition[-Image-, {0, 300}] """ @@ -192,10 +192,10 @@ class Sharpen(Builtin):
sharpens $image$ with a kernel of size $r$.
- >> lena = Import["ExampleData/lena.tif"]; - >> Sharpen[lena] + >> hedy = Import["ExampleData/hedy.tif"]; + >> Sharpen[hedy] = -Image- - >> Sharpen[lena, 5] + >> Sharpen[hedy, 5] = -Image- """ @@ -222,7 +222,7 @@ class Threshold(Builtin): The option "Method" may be "Cluster" (use Otsu's threshold), "Median", or "Mean". - >> img = Import["ExampleData/lena.tif"]; + >> img = Import["ExampleData/hedy.tif"]; >> Threshold[img] = 0.456739 X> Binarize[img, %] diff --git a/mathics/builtin/image/colors.py b/mathics/builtin/image/colors.py index ffbfa9449..2577decb1 100644 --- a/mathics/builtin/image/colors.py +++ b/mathics/builtin/image/colors.py @@ -75,7 +75,7 @@ class Binarize(Builtin):
map $t1$ < $x$ < $t2$ to 1, and all other values to 0.
- S> img = Import["ExampleData/lena.tif"]; + S> img = Import["ExampleData/hedy.tif"]; S> Binarize[img] = -Image- S> Binarize[img, 0.7] @@ -159,7 +159,7 @@ class ColorQuantize(Builtin):
gives a version of $image$ using only $n$ colors.
- >> img = Import["ExampleData/lena.tif"]; + >> img = Import["ExampleData/hedy.tif"]; >> ColorQuantize[img, 6] = -Image- @@ -201,7 +201,7 @@ class ColorSeparate(Builtin):
Gives each channel of $image$ as a separate grayscale image.
- >> img = Import["ExampleData/lena.tif"]; + >> img = Import["ExampleData/hedy.tif"]; >> ColorSeparate[img] = ... diff --git a/mathics/builtin/image/composition.py b/mathics/builtin/image/composition.py index cc6e347c9..b8cabcfc0 100644 --- a/mathics/builtin/image/composition.py +++ b/mathics/builtin/image/composition.py @@ -90,9 +90,9 @@ class ImageAdd(_ImageArithmetic): >> ImageAdd[noise, ein] = -Image- - >> lena = Import["ExampleData/lena.tif"]; - >> noise = RandomImage[{-0.2, 0.2}, ImageDimensions[lena], ColorSpace -> "RGB"]; - >> ImageAdd[noise, lena] + >> hedy = Import["ExampleData/hedy.tif"]; + >> noise = RandomImage[{-0.2, 0.2}, ImageDimensions[hedy], ColorSpace -> "RGB"]; + >> ImageAdd[noise, hedy] = -Image- """ diff --git a/mathics/builtin/image/filters.py b/mathics/builtin/image/filters.py index 6a28d2e5e..7711b2eb7 100644 --- a/mathics/builtin/image/filters.py +++ b/mathics/builtin/image/filters.py @@ -35,8 +35,8 @@ class GaussianFilter(Builtin):
blurs $image$ using a Gaussian blur filter of radius $r$.
- >> lena = Import["ExampleData/lena.tif"]; - >> GaussianFilter[lena, 2.5] + >> hedy = Import["ExampleData/hedy.tif"]; + >> GaussianFilter[hedy, 2.5] = -Image- """ @@ -63,7 +63,7 @@ class ImageConvolve(Builtin):
Computes the convolution of $image$ using $kernel$.
- >> img = Import["ExampleData/lena.tif"]; + >> img = Import["ExampleData/hedy.tif"]; >> ImageConvolve[img, DiamondMatrix[5] / 61] = -Image- >> ImageConvolve[img, DiskMatrix[5] / 97] @@ -98,8 +98,8 @@ class MaxFilter(_PillowImageFilter): picks the largest value in the filter's area.
- >> lena = Import["ExampleData/lena.tif"]; - >> MaxFilter[lena, 5] + >> hedy = Import["ExampleData/hedy.tif"]; + >> MaxFilter[hedy, 5] = -Image- """ @@ -122,8 +122,8 @@ class MedianFilter(_PillowImageFilter): picks the median value in the filter's area.
- >> lena = Import["ExampleData/lena.tif"]; - >> MedianFilter[lena, 5] + >> hedy = Import["ExampleData/hedy.tif"]; + >> MedianFilter[hedy, 5] = -Image- """ @@ -146,8 +146,8 @@ class MinFilter(_PillowImageFilter): picks the smallest value in the filter's area.
- >> lena = Import["ExampleData/lena.tif"]; - >> MinFilter[lena, 5] + >> hedy = Import["ExampleData/hedy.tif"]; + >> MinFilter[hedy, 5] = -Image- """ diff --git a/mathics/builtin/image/misc.py b/mathics/builtin/image/misc.py index f60a26ecc..8012abc3e 100644 --- a/mathics/builtin/image/misc.py +++ b/mathics/builtin/image/misc.py @@ -65,7 +65,7 @@ class ImageImport(Builtin): = -Image- >> Import["ExampleData/moon.tif"] = -Image- - >> Import["ExampleData/lena.tif"] + >> Import["ExampleData/hedy.tif"] = -Image- """ @@ -174,12 +174,12 @@ class EdgeDetect(_SkimageBuiltin):
returns an image showing the edges in $image$.
- >> lena = Import["ExampleData/lena.tif"]; - >> EdgeDetect[lena] + >> hedy = Import["ExampleData/hedy.tif"]; + >> EdgeDetect[hedy] = -Image- - >> EdgeDetect[lena, 5] + >> EdgeDetect[hedy, 5] = -Image- - >> EdgeDetect[lena, 4, 0.5] + >> EdgeDetect[hedy, 4, 0.5] = -Image- """ diff --git a/mathics/builtin/image/pixel.py b/mathics/builtin/image/pixel.py index 68d1aa517..2e553f0ea 100644 --- a/mathics/builtin/image/pixel.py +++ b/mathics/builtin/image/pixel.py @@ -22,23 +22,23 @@ class PixelValue(Builtin):
gives the value of the pixel at position {$x$, $y$} in $image$.
- >> lena = Import["ExampleData/lena.tif"]; - >> PixelValue[lena, {1, 1}] + >> hedy = Import["ExampleData/hedy.tif"]; + >> PixelValue[hedy, {1, 1}] = {0.321569, 0.0862745, 0.223529} #> {82 / 255, 22 / 255, 57 / 255} // N (* pixel byte values from bottom left corner *) = {0.321569, 0.0862745, 0.223529} - #> PixelValue[lena, {0, 1}]; + #> PixelValue[hedy, {0, 1}]; : Padding not implemented for PixelValue. - #> PixelValue[lena, {512, 1}] + #> PixelValue[hedy, {512, 1}] = {0.72549, 0.290196, 0.317647} - #> PixelValue[lena, {513, 1}]; + #> PixelValue[hedy, {513, 1}]; : Padding not implemented for PixelValue. - #> PixelValue[lena, {1, 0}]; + #> PixelValue[hedy, {1, 0}]; : Padding not implemented for PixelValue. - #> PixelValue[lena, {1, 512}] + #> PixelValue[hedy, {1, 512}] = {0.886275, 0.537255, 0.490196} - #> PixelValue[lena, {1, 513}]; + #> PixelValue[hedy, {1, 513}]; : Padding not implemented for PixelValue. """ @@ -76,7 +76,7 @@ class PixelValuePositions(Builtin): >> PixelValuePositions[Image[{{0.2, 0.4}, {0.9, 0.6}, {0.3, 0.8}}], 0.5, 0.15] = {{2, 2}, {2, 3}} - >> img = Import["ExampleData/lena.tif"]; + >> img = Import["ExampleData/hedy.tif"]; >> PixelValuePositions[img, 3 / 255, 0.5 / 255] = {{180, 192, 2}, {181, 192, 2}, {181, 193, 2}, {188, 204, 2}, {265, 314, 2}, {364, 77, 2}, {365, 72, 2}, {365, 73, 2}, {365, 77, 2}, {366, 70, 2}, {367, 65, 2}} >> PixelValue[img, {180, 192}] diff --git a/mathics/builtin/image/properties.py b/mathics/builtin/image/properties.py index e14c0a27f..afb8d391b 100644 --- a/mathics/builtin/image/properties.py +++ b/mathics/builtin/image/properties.py @@ -29,7 +29,7 @@ class ImageAspectRatio(Builtin):
gives the aspect ratio of $image$.
- >> img = Import["ExampleData/lena.tif"]; + >> img = Import["ExampleData/hedy.tif"]; >> ImageAspectRatio[img] = 1 @@ -58,7 +58,7 @@ class ImageChannels(Builtin): >> ImageChannels[Image[{{0, 1}, {1, 0}}]] = 1 - >> img = Import["ExampleData/lena.tif"]; + >> img = Import["ExampleData/hedy.tif"]; >> ImageChannels[img] = 3 """ @@ -132,8 +132,8 @@ class ImageDimensions(Builtin):
Returns the dimensions {$width$, $height$} of $image$ in pixels.
- >> lena = Import["ExampleData/lena.tif"]; - >> ImageDimensions[lena] + >> hedy = Import["ExampleData/hedy.tif"]; + >> ImageDimensions[hedy] = {512, 512} >> ImageDimensions[RandomImage[1, {50, 70}]] @@ -157,7 +157,7 @@ class ImageType(Builtin):
gives the interval storage type of $image$, e.g. "Real", "Bit32", or "Bit".
- >> img = Import["ExampleData/lena.tif"]; + >> img = Import["ExampleData/hedy.tif"]; >> ImageType[img] = Byte diff --git a/mathics/builtin/image/test.py b/mathics/builtin/image/test.py index 5d45cb9f0..1230da73d 100644 --- a/mathics/builtin/image/test.py +++ b/mathics/builtin/image/test.py @@ -26,7 +26,7 @@ class BinaryImageQ(_ImageTest):
returns True if the pixels of $image are binary bit values, and False otherwise.
- S> img = Import["ExampleData/lena.tif"]; + S> img = Import["ExampleData/hedy.tif"]; S> BinaryImageQ[img] = False diff --git a/mathics/data/ExampleData/copyright.csv b/mathics/data/ExampleData/copyright.csv index 4f1a59c5e..4ba4882a3 100644 --- a/mathics/data/ExampleData/copyright.csv +++ b/mathics/data/ExampleData/copyright.csv @@ -5,7 +5,6 @@ EinsteinSzilLetter.txt Public Domain http://en.wikipedia.org/wiki/File:Einstein- sunflowers.jpg Public Domain United States Department of Agriculture - Agricultural Research Service Taken from http://en.wikipedia.org/wiki/File:Sunflowers.jpg as of 2012/09/13 MadTeaParty.gif Public Domain http://www.gutenberg.org/files/114/114-h/114-h.htm Illustration by Sir John Tenniel for 'Alice in Wonderland'. Taken from Project Guttenberg as of 2012/09/25 BloodToilTearsSweat.txt Public Domain http://www.fiftiesweb.com/usa/winston-churchill-blood-toil.htm May 13, 1940 Winston Churchill "Blood, Toil, Tears and Sweat". Taken as of 2012/09/25 -lena.tif non-free : overlooked http://sipi.usc.edu/database/ Famous 'lena' or 'lenna' test image moon.tif Public Domain http://photojournal.jpl.nasa.gov/target/moon Taken from Nasa JPL 'PhotoJournal' as of 2012/09/25 and resized using ImageMagik-6.7.9 ExampleData.txt GNU Free Documentation License 1.2 Own Work Created By Angus Griffith with a simple Python script numberdata.csv GNU Free Documentation License 1.2 Own Work Created By Angus Griffith with a simple Python script @@ -15,3 +14,4 @@ InventionNo1.xml GNU Free Documentation License http://openmusicscore.org/index. Namespaces.xml CC BY-NC-SA License http://edutechwiki.unige.ch/en/XML_namespace "A larger example of namespace scoping" with comments removed Middlemarch.txt The Project Gutenberg License https://archive.org/details/middlemarch00145gut Chapter 75 of George Eliot's novel Middlemarch in ISO Latin 1 (8859-1) encoding PrimeMeridian.html CC-BY-SA and GFDL https://en.wikipedia.org/wiki/Prime_meridian HTML of the English Wikipedia entry for "Prime Meridian" as of 2016/11/02; also see https://en.wikipedia.org/wiki/Wikipedia:Reusing_Wikipedia_content +hedy.tif Public Domain https://es.wikipedia.org/wiki/Hedy_Lamarr#/media/Archivo:Hedy_Lamarr_in_The_Heavenly_Body_1944.jpg Image obtained in Wikipedia in B&W, colorized in https://deepai.org/machine-learning-model/colorizer and exported to .tif (from .jpeg) by GIMP diff --git a/mathics/data/ExampleData/hedy.tif b/mathics/data/ExampleData/hedy.tif new file mode 100644 index 0000000000000000000000000000000000000000..1254f3464a572d48c7b19e2994bc1d1d0f4d46d7 GIT binary patch literal 1551537 zcmZtP>2@QzvZm?C%osIG)I^b*Cu$BU<{WnJbEc>E7<%R%(&i-rm~T-K;R8c7JzwcQhIildqO= zaImi;Nrm)_x3;#nx3`HA-rU?=Sy>UwSzlizKN@Y4VN5G)YscGK6zC+Qh<*u|dt*AP zO4?mpTcd~B8rs-cBcq7@>4JD|ZDn!@N3F+q<=zj^aUmk$mO*dN1~B*)#`+haD9)`)3Qb84wh zPc^)}{Ncj~#))I6m=ZFvFnX4kS3i8vqb+vs?Cj9?{{4Gu{iD`DIocW@OqW)cSJqb7 zHdeQH%Qkw_L}XUiSJpS{wz#GA?Cp<6+v}U74Pj$zJzb84T4!2nX>@I4UGTZ&rir!4 zwxy*Nff!3v(RqE*aWVbtn;XlkD*}@Q3FfV?*ZrrHVQ%T}zAwS3KJ@(^O_15%-4QlN zTRXm$W*nt5y|va6M{?s6lv7GogCEHmfAP(-fC|C;kqqr`o6KWy!!6L zd$s7PJ3888g9Ld&;$S*aT9^H;o=&Iq?~L~kPNqAPz5T=S_;9L?oymB2dLYQ$KJZsj z*6tsW8?$^%7k0LV(cZ2I3>fPb&;%Ih#cy%eBT%8@?UYy=u9?#A%9&XR?Z_e&!S5NoSXZLrfclXD4Hz)VA zpihnuTU_jlhu-FFvB-EgnDKP47yHKC+6t zrI&Yi*AEqF6V7jL&aQ8L&3x$RKEBKI)9Xtb1o=vjE-p^4E=qWIb9#Aoc6EJzJv+L- znw(z>$CsC9*Qb|vr(gfy>u>+h@fyXSfirRZg+qLtXY z_e*czEgO>+X|V?O<<-}3-s#$hrD~UE`GUmUjFm#++jk${yscsU?Rz>tFk5d`XOD`i zyQ`z^T~=Wwf!|)gO@594@0aLxBUD#~*~I7}L#?0!R+Iq}>zk!>d5M68OM%QUzm{;_ zWTt*tW;6Me%FzlV*VaeXwf>kiq}2VAv$J~u($WS~nOeby?VUZJI7@sqmDn7qs8mM^ zDBC0YrB#oTy7e3DKBM$nMe@2pn*?E!hYL_aV5!_rs;=}6N+ofe)Ags#rN}1$x zb#rTFV{>_ZL;P-;%<9Uai|Zq^(*3>3(c0F|*4}}6 z@CKgx13Wm~9#6%iNrkP0>E^+>!fpkU>)U%9JNv?r80}Amjh*rO_WtJXfyDC0b_-9o z_9n>@Z;ub7c6)lXb9}mca<+GRc5rbiOfIhuuWycS?v8Jb*v84H9`Qb3zkI&@@g9#N<@59H=PzWgKYhCX^5x>?<>>ZydU17fIWrthFE0+x&-7@0Z@f94 zFkZjdv$22RQmm(2lY`N8BIw{~pPdJ5qg_3c&^7706mRWpZ11^I={SM(I(H+nB6rNa z(yzVaQ-j|4^!(uLGGTIYb8vYxzPLJ^-Rj`i*#JPSN!GZvX0Le0_T`yE~lSyPRCz3euC= zqs(!K$<6)2^~3n8GONYA=PJE^n#`(+3U&FQmJW(l+%NriN7q$ldh;Ymbgc(5Rc;Qk z>FtBoOY)`?dzZ7_^BZ+pwR>?bCL^;HUfuj0VyB9S*B>k74zzhJ(Hw=7tJ%rz{n_2e z)7$3?_io_B(fxz_tX-XQ$J|3V>g?mE!`qj6MW2YfcmL9s*G+TJN#=5T^X$IW=jetn zI_`$#{t!OBt)_j-2Qw3u>e}@3c5>h6&g=n>=`oZs%BT}&>o=~sPne&x$HIh$3uxH-DIIlZ|*@ljsfj!&+H>3P|3 za6TKK-H>TypFRBj^z67C#!@|yZy1hRU#s^3H<3s-I z`o_-2=C0UKyuPt*6j@s4MkcXtV3cFr>!Hv1xnV4Nzq0;e$@sapvALtlyZ6SibqT_9 zGG57{P|lmTORwL2h&)M&Xj7{7;qv{5)s`{%8(=G)n6R-o<9T@?+xzTMB=mq>W~7Ry zQ%ezI8s{S>tzDKFgz0g~R7JnNeoxibXip9!$%q9?2vfemghXMkb5=@Q5BLo0dsW>O ze*NwJ`wvx-0Od@Q7Cx*3fnmSW^i=9>>IhH(jElxXqw`(>Butiit=)U_?fkf%^^ z4~4$@t3gZ?WKAvlRVSkfRipvJXO!lY#$ZKcw5Yiuute#vZ$JFc-0YwwMj@WL&K(%NxsUqu<^x(^=hIgX)8~AJ)`W zk+u(Oo39jaj10L(W0$|V^FGAYEn=!jP(tM05^ucJ8mN;~0`JQnfq+ZGn)v0l$;#** zYnLr^>}u=PZ|~_`8|^KvZ@t#X6;Aa|dPJ3q!fT(!`e;?Yd$_jsZe`=`^152=K|1$P zEtzCu5*Z3tw{{8q@^IALRaw6S-%zB^spnUE>5oyp2*EN94N`}Ah-;=YE^;Hd}0)5ovpAHQBae>*W4BGJQ_ zpG)%LQ*!q2p2l}iYK?E7Rje?(-@~=r=e^m}5ae%PKI~jQj%QD9;KBXJ z{o5A4yx+Te*txjbxwzXtzZJXOzkU?vlCyvG$l1Mk*!E#vK9tRxxO&*VyeC{bZ$1vS z*rVzFtCE-5O_Y8i@@YkS=lp)}vf8S;S9n)Sm?2--I=R_AxsG9@vm3Sg?%l;&If6Us z_R9AK0CAKr(BC}nUf%9q-7$c0eP;@_AIH}p4`$EZHS?BF5_+LUrn=$N+fSp5`z`lD zLw)yDBohm#clyZGhgi#aX#(|$bl<0UFDiDviN~|H>Z2!?+kX8~=5+RX|LR#7Up@J7 z>ziQTw0gY?L8xpj2Ab$qSkRZI1=J7Iio(sl3qCdbsv z--64X@|X|JnqgDqy6=*vBAx7TGQ8Fd*0mITVB~* zTHSuXZ1CK8^WM_pwnaYi&JMVbl^X7hnKf>&jaJu2fb!-ok8Jb95){I5#fZN(+9zN5 zUS0D22tHEkf15O^UPGZwb-$fzo6LzqzPXc_{I8};hfcLsS0GXI2@B#Z?#7ggUE zs(yR7N!ku?2kSCN06>U*9ZA_*O`3R6fbH5)Kk>x^2zdeY2Eq z7P|r6!oX;ZP;Ztt#7pZtSoYidHJ1z)sOp~5sV^g!GB-y1s!Pn3=#F_&ch=pL5J0dn zy17HG;r-WlCF4>i;Nmiv*5z8^6*^-83J`ej+hy)#F1kLV=a;ujBzd4>mjkJjW-T1Q z{;)1Ee&`4gM?;ZilZ$syo!Z)Yx3TwndGujpw`kkM+@72U#G`|gt;q?{%!#v$R@0@? z!SeP*_^>rz*(n&U?jBao*7W`Q`0Y9(A1sZgAGQbp*5S$yTAi%!9!o55A4;t4p9<^a zvyFrEt?4BwL$iUU$CkV8lgIJpvr#bvqk(I3^ZD@Z>&fG{)2HvJPrpk~?!F(~ejDF@ zp4@*ufB1T#=<%yz(D;A+_~rEO%l^ro@rUxw=^6T)285VJ4%N|_v?G&Kvd2gn=LH?6Ke*5Bi=e(M8xqI;}>|MSHrT^md&gJLbZfNi3 z)9&nL`|9K9yaIbh$36mdc-*`E$cE9yqaaZVFJIK!y~dH!xqbGe3TqjlNLuWY3}Jm? z($4ks&UM*St#?B@q7{KmX}c(G2eU6K%1K3a^%SkN8_Ts-ww>N5)V;cVu6ua?xP3<3 zouEkCU7g?R%a6K1lFaVK)7IIO`^k8k%lPij_9e)cj95MyAvaut*}1)CYTv+E8}ry4 z%R5oMaQ~Ajt)jHfGO0Rp{%BH>*+p{5C>7}J@FaiZ^ls;DJ_(6fWpGz@`xqm6Nu$$E|{LAjqS&h0Cx}zw!T18E} zf$0UcF@r$qv~)e%1@W@sL;LLAcN&N(GlNpmy~-{1;YPXYLhb`gsER;(ol?u%iqcIv z5;!h^HE^4Oyn6jkoJ5LDjhG~`M-DiyZ|#Yt6~SwWtO{#ou5A`x2{0@?Md}3dxie}- zKtiU@s!o5ZxNl13%V8Lu1jNX@vbn8F#D0^%F_Htv0{hd2vg-XZ#};tWmQ{>rNo=6m zltWyObFUJZ^=X|<%y{LKUD_z*Akuv9fY9!-woEjG)L=wM~%0Jy~;On|rcd5dEHwK$h4j86QNzpOS63w`&uo$wVYV%u5p%6o<5&`{3M(`f927DuOJ~DKR%y6y_`S3 z^x~e))>_Er1;FtdpZDN+!+QI;9Dh9$>kda)NRMhB(mt<5JmRbsB&~>~B6AosnRK%q z<0i-5EBC6Gc`K7s#yKrl ztDM$!lP?x0j(5fplR3FB*O>n+lyG}+7^|`aW$lSe z@5@C!yDhi<^j3(oDN`6--U!=Q<}3w9f~Pp`L5uQpFE z#iKJ$^lWZ?JImE0U2d0OzKW{&2r9or^!UD&wksa@4U-t7R$0~ewtRdG4sGhZI}4i! z<0ay~Rv(#tdgC*-j-gR=GwyBjH7ZAGt&{X(LVZ%@|JGJQdPl}(%*(2Xd^#xsS?STq zypMCwx^P^+b5%c{CG2AH$qk)+WPeb5$F~Cbj&=X++Pcm5(e?I`wQDZ({kQ-2-~Rm1 z|NQ;O-=9AI`1tYr&Ex0G*~8V}%U;@VQ=(w6U;QscRC8&d7QB_;`=VJK!b9pKfL@p7Hc>Agsjc2q3|XIr!R zTTQD)a|60`DixH<&u*iH99U63CfPrw)>gF~MZf;`#`dUon`?_b)-nT+Y712$qiJGv zs+EdqRDLcakkUvtp^C!n(KKyJYd?C)WT4>X4#WVL?CidnT~ts-b-W8+GlgIw4XSr( z^;DYhTyrO+X)X}=WI%#|)=BoAtd(%V=NPj!9fexgg%-BRUt7j$t8e2>FNFi=M+Q&-Y=wBdP9Nktv4{*H!{cXfUIBUDvhF4BRETT&wY7)HAJP`>%G4 zS1|NL_GIM;?hFcr>H&F>E`56*qR<~ADsw0Ct2*hu0i8sws(0oxw*w<8-lj*?CaTCgWB3f zy??PcDt1|$q`eP#{`_JS`TY6$4JO-Ka!(t^aownFFD=?s@u zNhZl+%9RD%BF?-npd4Sa%4HGx_%e)knJ$Qv7Go|MvGjoQd5@auHCehw!0LN$poA7} zi0G8Qm_^h_aH$tF>8N6!Op-3s5&BKKe6kd3h$@pwV)D~O?cle7A|GEi-!l`dsoLU8 z65Aq^n?R>s4{`JtPkWa~t*%)41kC;B`y(fpuq(%YaW-!DPOf*4ul7$JHLQJ{{nOd* z@oal~y=Q6q?Ec$dKfVj!e}De?_2Kd5_VMZF_Wr`Du(RXIG<(N&_$p@|K}0YD8+mH* zDbKXhiH%Op#{y;XrOs+usjf3xk<8&G{ApIN)ghuj<`kwF?S&pl%fpp^`__UW^>q*n zI11u@_NlnGJVygD?C6t9U=$5?99NDLL8uW`5^_pUpU7$=7vI$tqTeN9N2FW|5)=yr zVpF-9lnK(oD`+}Tg^x8?*dMzj zfZg;9A+jRX@!Cuv`6wLaW%h<`ar+2mkM5MstE+DvK5U&eVR*la$d&>y-5K}yYinYq zS^vjt0!3|`EP&#a*U*dV;P^oP z=42|dx~IQ2!HBhxE#&xCZUXFLbWdPLSgbEr5_HGi$bIM=aFD%y z>*Pe(K07nJ*uUyd)l6gNgi-(vl+Gpc6Db2l%n&_`IQ){ zh3#{W=jHa4sk_t>!J*B6LNej_eYVo%A~W)(dk7_d8xv%1UU&qmn8%^&SZnm>dX06R7IOK zC7MWcW`IJ@kGYL*px%LUbh2DGL&I9|k8wL4tL2n*ADCzn7hXZQF* zTB6PwUKE{oj?QHsoL>L<>(B4M|M>R(ua6&pzrAzN`cXK)n4O-V9ZU|bRM!&-`<}d* z8jg%1&W<9Z0Xgh2iVD1*4CWc8GCYRGj!3_^mbh>g38PXDR|kAlWq21C7p$_{%j@wO z6M;ya1He^RyL~2EW(hYF#WL|X5P6G(sL^$CL35byGRLZ&N`AuuENGVRtgd04Ol)9h zDwci}c=z_#*S}Fq7;!kQXvL(kUd6ymoHTwx4S}d7DlLaLnx)y<+N$*`ZTr;~K=9Qs zXkboKY}Fj|1d`OsF?(^}@Q6af#N3cHUEDNRSzbW|wWASH`EUK608yn#1vI?yk-Hjyb;7tSEhcfgI1CJ^T8nxKjY6K?I-m3yJ*1n>!7s&&9mZ-%fN8Os^ zOK+B!Uz;{;ZF=gU8U2AgN0^U{xgOA38g0FEfZVNgpstUNiF@t3*31O}a(?W+1ABY> zE4zE*pQ&T ztQGT-Yh{}fN3HBkIrlX_w7|Q0e71FR&IK?e9^Ro+p~{$64uuo2_n)~H{AK5dq51sf z3r0gj$#A9b?x(k^+z6h#Il6a9=6ZB|?AbinEq}btSlZrgfDV%i4(~QoK{?bON*l*| zTHS)Q)YdGhd#s-vr7qD5?%ASj@AC`>uv!a*)WjRI(&_^Jb4 z&0+#Y3L`%NL2$1LS5dM6S9HWtj%F>s<+_ zxq8i6TQ2DrYCXJJCMS18MQz11l{4^e-rV)w;E<+MKgZgNzbuwkM1$@~=Y~sg)n&R& zPS%Gb;3H5)esnU-Ei%t>2Q(_5k!;KDo!=$19bR)ChpV-Harz}u*u8aju5NN!a&=eV z0r_ZqQ&Xn-+-X(=3(Jt0%Gvg?Np=N@~Rz0EEc*msF!08Kvm)GA7vfHW7_QR-S) zD6jd_6qmCs-aF%5pF43~ygn~j3r<}B@$dis<@bNTeE#?I)1P-YpRcc<&aWPh&u*r8 zJvp&`?3A@9S#}Q&9YeBr)2FO!zgWoHo$)9;n>-*nVq>fWQI727h?LP%jscS-=fzM2 z>(Vj}n{qf%#?o?U-XM3aZ%36PmttauR`T+NC=@3x{#k}FJ<+TvI?W;gq9+e^R+%;g z5r~Pq(b`H@#JnM>qEx$LWWgPAY7vh8O{FrPGbm=fIJOml3i{AlJJ;z#N?RawE>js9 z{SwrYlo$d5A=~Q`Da9{AT9Cqe20U|u9M|Di!bh;U2Rhe8iA zweo@XZK>@EIb@WQuec7L0bF^k4sK-|7fH*REl2)?18mTy$O$e%B5TN2Yr(F_Ytz{Z zKyQ)57FRKc!6ba&xRx?0x7lsCHzB~Kp@`ON*95r6+Onnl_O0ipH#EfY6nrK{XIs*5 zYFRrg&)KSubLzOY<>K1XU0#cYs~fcnYTK6>d8Ec@Y^9`{eplPUIj`8q$$G=uuD7qT z2M`==_F4CdYf9`O|N6!ux7FGsuFNeYeZRSZ$f5AtWrxHp%+`UiUYngi;L|(Wby|!P zi_bRGSM3pV7~88YDs4L2w2QeCHd5g=+o_df%Xr(_;|fY6V2#?UwG(189f(@mtk~(P zY#)nJc>SObU1t${V{&Q;+U%p(1{uq7R{5;-0TTkwS#OM*S;-wAKiWGg=NdjHflq?+AZC5D|+*{)`ZV* zUDmR&&EMX9tZmKSX2l&uP|><^c1xKjG{WYls+AVewziM^z_VjQ+c`!)-)WtL$qp&a z8^>3I7K_N|x1F#JI^PL(S#4eRspdZ2ou)~a&F9W0l|94|Ev_hFDYe~FVa?+< z16BrqkOpXq8$8 z+}?XdNy=T)54hobsa>hVT4`4iJ&0VwZCMO|@b0y&_iJ6vE~rbmlRHGgov@!gX7!zOA&u(^SJ+62|bNV>AV>k)&uA3Oy% zA_lUa-s1emx3!3EC)8{Nk?n^fa>Li=>DZBSLBav-^^vuy{gsWe#K!jU#M3lX1=bun zCh&e`=iS<_%Q~FAdk9H&Hhb(ObF;4j9dPGxGRX+fPj2_gF62^Ij&shNlZza^b|@te zZqzneZI60{@lT6&^{gdlq}S!@-1wxdDq{BY zS>_2Q2@I3S);9Q7j&o>zI89Nykm*NdZaAi1Pd~X!j(E9&*)b;&H0Nk~JtH=*$DlUG zXIqmC-5DL$5gMnyoqg4*Iycq+au4Hmn8(@I9<*yiHsiC)c*-Gi`d*k`JYiHEgkS{k z15q{pUq9Aauh~cAwh;T@V!?6Kl$ktjobL9L(9iapXH zvdbJO!r3UPxDP4e1q~%xk4=?3nfZV@gIaU_7tFZ9R+QN|yXv!8*Qg5CW(bJf4z&g0 z+Ak&ATfbIZs>PTv z6i-pr^GZ3)Og{~E8+%sMACu|LKSWlV`i+gSpoK~ViCde#!IoPw$4+V;OZr<(2s+h7r%ibPGok(KEE3uJkisP#Bz9 zg0{4)6`INWO7uM`@7|4)mXJ>%Uk^DTi=iPhCHzy+?6X+)8W0IZ@-r(aE;}UlPOVy( z7WmFu@%3>3nPD&3;xiffDtb_w7hE!Hn;yEyR?tUJlTWiV`WcMK?Iv&1rV84EFYL0U zT=IVAD+Fh%BGu&+E64xM5^s96dpNQX-ERo-rnXwUu4k(~`#j21REUhu(x8mO5Q8-m zK!d^`Rvnd}@2)!dB=Dv~EAF9yN;!Kh#%M&w++O&#>0IZTE$2cNSCP*cPuVj^m_FcJ zkt$Vdw-6R0Z%xj&4=+4E?BI&|e0h|8rl<~g-MpY}ALtT$>xCC$lt=8?j}xbP`q&FM zY&zG@niDKGLys@&%=1A#Qti;VRqHG=qivl15E+Z*J5p{R+)aSpOjO*BOi}dFLu81Y zsf&b#i0*iK&7d5DX9YfIt*g<=39r8%>;enyFb4MeVegXHDX*G2^jRH!3`7D5>7Inl zNj+zG`&^-Oo$2b=Yp5u}n-h3&#_b-==e{9r4VR*`V3e-WxS!aqoIavVK7LjlC}}2@ za65+KR0t&<2Th~W1SCi*jSKt_j(Y`ls1u23t`!{)(My-Q}ANR{e-x8=)L0-VtHuhkN0 z6O*Ue%?H-zfPVhN;O-fDqEH8MD`|x7t=n|Kk$d|dSZROJoFR}Ua-~aLX z`yXGv{{H9he}DP(-Qg~0t&dMGty=FL9PjKOTC(=4C1IejVbhSC(YrBSCwOhUI<#Y~ z?oql(7p54%p&^+{b7_z_2%!0#r;W8QC^Z=Z_lI=4pzG zTz!g3m2RkjE})Or>C`Bbl8D+^$c9`>4C!pDMtSmo{q=Pn(ke`~VT+Ap3Ry)`LAoGr zlgiswR}t4%tuk=V<>lVdu6gZQS%~S4+7So!?M5;6M;th98w z@a^o=Qzq5%>Dr8Tpqf3ZH*+1^u2WlEyWGq=WW{9`*r|z}=F&ZH{&)l((ZDzI$^Q7mrhnIJI{?B#^oviSn#8hq@n#_W1M0$j-0# zSqW?2apyf(d$r$cXL)&hRPhMD^U|vMfn>|t*<9`;QgtfZTCv?#%f;~`#oz^nd3i`} zANLWj98R{+>!6pk_jlFFDDm0(?!{%!L^*W>wcg_81xMb~B{)#+(#wwI8;H=Y-uQHR zO@8P6V(;w2*%hibCWq^ji49^e(Q=e)&6_;Owe#y}mK|YeE-3e5X)-1rd0yLe1(XFc zwO_oo55Xoa7!Aa@jM_Da>B))e-S@HnrWbIG&J_-hjHR`p8c(_B7&YYf5uF;7%SWy; zKf!>UkR3+k9pEb`0fG}OsN%(($i0#f1Ozv8Mxc^)UAxH()`W>~W=9Vn{?kw#Vj*loXI5uCVF3sdKNgKK#)8p+co}i!1=cv_% zhA$)Y6u($bjQ1yC)|b!G_bPxk1MC%SFX1_NRD(PaZy%nSuR7(0$X+h@$KU_@`uiWC z{Nu+TpFe-S^8uv; zG;uv9jDs~q_W`GZL;IV?UK)ZhV>o$C2$2IUIFO%_->9F8#(!hJxG1wYF(qAu$`Pr4 zC1#<|zkVSkoxtQ|mmpD1ES}sMR7n&I-o4dmlrtuAwrOjt=cs**3R0OQrC`MK**k`^JtZj@V5y=!|0wS%byNWS{T3TzqBAZ<&!`(^EK zbz(^M>gM}uk+$4nnbG4Cw5(>odi_QqAjCq6>gVDzO^7vT#>Gytz7vL2UM*LeypH&w z2!Y+l%}~dCM)J++?qPVU!=l z3X4m%Wn3|v+PBSNv#e3%y9%-b4UUJQZO|;uJa$qDj{IeC_r%lss8*^az!z!-`Pz+u zqSz@@4k-6SQvG%^lLRlx^f;1=4u$vg(N144d#U*5x>MGs5Q=gr%bv0WV8YTyo%@1j z2gB-|wpU@>XZPwb&yx2+YlpiW@d9Ny11xL`i&u8Gh1K0UjGchRePS7#ast^2?IJ83 zJ4yAysW310#POZI1ZTPwNsBie^FBIqD7w&jc({8~N0c2@2G)Vd{VXl8sp{ZvHG5%Ik~rBiMx|xe z>T%wgh9HX*R@8=N1aK#p~^V2)jFw%i0e6G z=cY=-{A^N`m%)8viWs#tL}97wKukVpvR@*-PA1#rh$C4I^-4u@6eR?^N~5GEPHl5p z7)+m^?_FQ-&t_X^^&$FF`A+&C=8$vUnLd#fd3W1qA=7<`&Otw7l1Yyww9YWb_$Jf= z@7|t{Nr;Ty^{Mp{wR8kS0k3>(XjJSV-<-(i30AH7r+M>9KMzGGCB#^TxnKu> z)}IBiEGXs(x#lxs{6j}^F4*o1)| zN1$O5N#A(lczM|aN(9mtoj{)$UWJ;>{Q6t;sBR`8GnbaZNm^)s-@d#e$mUbixw5q- zAaeX`d=WI1rnOsDyvC$n8&a`L@ALGOE-;bAuL?~oJPML<`TbTMx?bS8o<}afxF3=# z{d{omyY7dVG54*vZSOj{T`ZOeyrhfKavZqg8XtPqm2*%>o_;c_Y#w`P=p4TU{)mCd zgDM9%_4sE!Gvdjhe$#TjAGqHlvVT?2776Vj8#ar`G23Ek;XN31Ox2og!F7)QH&8UcZTJ} z8K1>24b;dY1kFz5W{@||3(|E!_vX<7;Lz3}UkJFKlUHU4j(1R7*zFU)n~gk|b4K){ zF%$-o@KFTmmuxuCT-q9E>dqn3k17w=N`zd*qM?pP&tJ{aoXtZ0Pjn7~HNj2J4N0S= zs*Nl__jAgnvk{#9>fPB4E5oMPkeFCOt>G)DR5e@E$DbwT2=h)YJaM-=@?ydS81^%i zD}R1E&S|uNl&8^ZH?y5Kpp@rDojr?)F*FRJYAq%hu`u>zG8RD3a~7S77*#^n6Cyxo zzDN>sXs~cy>)4v(|H6IV@nYjxzT46>E)bXCaT5rU0lLmwpPuiZoIij4UHJIv_s^gH z`2Ov$`-fV!zV_1fv&-?}i3PXqy?V8E?YNcCyXnUT`n?}D${C3ahH*faycy~3d^OnU zYFI{O!Kg^aB?lG5YUu7oV{r!ITDEO3)xbMYL(x3I7RPh3@f!RUP}=JxpQY5oa8sme z0ar~9`p9%Y!Gy(ePDv3M?3EWw2dr2fT6IakAdjR)yJcPk$Zl&O&#)z?!q*tjOBD!`K24XLDKX{hYRp zo4@5#4|rOT$N{jeIE;{l#ezibAUkZ_8@2O%3%va%jRN%IrCyeK3u-*;MzfR2brgzI z*n zteLNP*UE97fYqIiBYu{((+YX0mdhg;u8q2IAU4L<2;950ddh*yx^&@t0 zM#Wg3CZcE1RxS2TP^!AF4J*}Fzm>Wa+(YSHO3P82BAMx637CvcYx%m|XHP4iUA%n# z@$t)#r^IVEgxN9{{Lm31<1!)}e~f#Agdm64 zZ1@c~Gsx!^&|n>KKxL|gP`%_@%eI1Hx$rc1c?y@Mr@cb4>aYvz#%%*?$Ra(j+rF4f zO3<(z_Ohy&QVXh$Aql0C0TG$>xGcm}yK|>C`HBcD0&~XGSu$C_=5H==Oqd3NwbFG7 zQjKq1P7WnQ2*`3-xNKsQPg~@5Id?C8q*-Q+AzWe&aS1_=B6mPr(X6g6yYofHuA2q- z)-dm{nF|(^()(y2siHWIiqlpuyRCUQ)2_AzrCI@29~t)HV1EsK1?tIPWW-86rPf!% zbWV__v0CwW@R<53)K4rjj=O;5vLnN-mUvcEV%-Is*3l#QYEX#7R*U42f7?)i?x}1V6Kq#0O-2h-19ut&=;3F zQkE|sN#-Ey0u~Ev)5E3x@j5S~R;}&g`T2=LbAq8YL$qNwW?&~1?i7;ZX7*aE z0SN+>R%qBoG91?;fwP1QPBu!FJ!!k~=B9c(md$?Nk;_LFY zBdisYb!Qg7xgu3$rh{oqrpu&LQI5Jzu{uHqvh<4qj@e}BRE1d0OkTOqOs(4`k)T#A ziDt8co|4s*Xkln$v>%l2XQpJPzpdxPufJ4_LZQ4LB4!K&gs>PuK@jyyVLw+@K51SC z;tX~>$aObVe!C3!I8GHAwF;n)czvihcQM1kDiHLfHt!X1#R020!k{csjxB_F33fld z)o89cKxj^Q;IhmhxE{aq11S9%RBFk`arwEFz-2OyEeUar{m2EGTzY}F&>-ICBj*4Z zU)~Et;uu=Fov-N1^c(?%A<@DG#;FC7%U>28;u_9zVKHG(^W7r4)Ur4U`@0f zj#`}_uOC`!_C~MXVm|iTt8#mdNP^+Z80ZA4#WzIuUN3uR1hy}%a-S8EkI(!p9Vq)L zbbH6#VId3A_4W@x65VeS8$9Cjd_CNR$hziLZ+)gKJrbjKuiMv~GlzLacrC8}E?nbG zEueXE(7K?!F*z3UMoo{4t{W5gFTaKczLDd^uqy;b9>+utKq@*@ zox=YT)GcBz?vjp^CoCo@PLcdr75OMp>a**qm){c2MEUJ|y}87U+GeEqo`Qe!?+18&^d zA~H{{(QGgmW%6NI19(}%N_1aRV2s=RPm9+<+P#{QxwH*R60-e&So?d zAXczj_@N;SwTk4&Fv2dGCy|OVK)Uf%Zk-$gk&!tVCK3G-u_xG)se0O#uQXMXpVl*N zNGs79F{N2y$W2Qe8yFmI!KJ#H05D8G8L_lP@}rg*&Ge*tRLLY9<*CkLBoN`kS^2PY zUzk|(*_?%9Mf6}OOJowDEeaL!h&={X9%vD{wqk(~1PRLw@?=)JJ=uZC=q4ZadNNRe zF7oy&F&z8)6k1lz^%jsunRJo-daK4U zkwMvez+|Fua4g0nES6}u7o@D*&KIZ=+441K*>=`1X zT%7^SnJ&M!>}N8JGcZj9N?NtHK&?f+z}9k>dmq_+fWetUFv%fm9cO&{mHe({2e~?B za*~c)uU7iA7(JTEvs86{dwgW{3yb@7tM`O>!*;Pa&qHO{%C?+9>29z;n%IZrQ$tO}b4Nr{-vw&;mTA+l1T zHd*>{vk+OkF6#;L25Y_~h2UP?Xy)c9SFa~Dqsb`E)S?!Yj%u?w%?(QGB|HvvHI&8W zO;_3}uX@t3ex3a2qyFWdw+g(h}h;Vq&hL+Xx>gdf;!I--38U*(I=&CmcvYYM862@_UCg6c8t;Jjw<) zC8?_+)j_Zv$5Q z4M_wBv9#h+DH-NT)Mj*Vp~_L0{Giii5Gf{E!rdIn*b~k2X-=%1%z*gRq9>A3PME?N zV+JKbAd;PSL&`id5C+- z$ks*{oPjt*7L%!O*MgOD2+N_N(q00_9q#32K$O$YaVZp{jWB8pp>0vV-&sA>;w%T~ zaLIKolJ?6)U=$nXB7}jR^?wIslG$j7=Cf2X_-WXvQ)N z+5`w=rDI*g4r~G1<^F-KbjrDQpntTEl@bOoE)~og1WqKVAV%z8; zvN%M}TQob)o4d*d%gAr6)`i4LNE?mCLOD&ArWYPxE`vPzE|E8(oMLO&jqDQ0(ceDC zOsz|#7JCr5@7VnKF-ez5F#uOva>5h_gdGwgol9U1ltb9qIm88>{!k*XBa9rnBas%P zFp`6E2{};}Gbo8dndSh4fJ`>Hfw_m4^oLrkN?mQ0@eSFqDNZ7sHPPk|L~Bt#Ju<6D zmap629B@W+nb86y`GV#9riqOpNTc93-Na0HHWY8R|uDl@D}d^WrMu2y+GNJGTNgp$EMqweieRB!If`s6ZGqnZc z)+T|}@vozKNK>97`Q-@rW-cs(ugltK?)QVGmP{czh0ca@`MD+%CI*fTF5dqMwF8JF zPbMxl$>Oqu7Ja@8yUWA12=76{{_*Q3Z!KlZjQb4DS+?aet5xY{8CnUAr|rBGBeV*b zLN}gcT{d$O8M#Q7`?+|vrpt0L`zTaxyw)k@F)mkFto_1hkZJ&_p(YEG_1w^9AE>V1 z1;_|lXIkoq1}>Zz#bpWJbdGJ$H8{LIIr46hxXE?I%NsT8w=mfGznz^fA}@X&Ly>fP zoj&&Nc`eu5aW=K^QtSM9<b9c@ZfnSUtl{K^ryu6eS+`%mg*KkWO~xxHT+VQ(HCd@25*7kQbEWQW;ALgst+kf{nA4lM~nRkr!Mr zyc^X)M=e1Db0t(!Boxj2hY=$Qz7k;*g&|9zfOJ(oU}}`R6ru-l6b*i#Mh87fG=1i- zB1wn|q{_VJ4gon~Q_?OY!;+Z9)EGb@k}f3@=yA!;g)dnTJhM=LF_#%|rn@=~tr%D) zbqK@>4BStG!fXgIK$$$eN0ZHvFQ?wxA;u;x+#<#@^q*SNNol_Ihh9j>ke(hT5F)aUavw#&^4e%-)_X|LF9zwQ_&EEFtiiVYof`A?B}7OZnq=sfHfT#Hz;581%Z&5TEYty7fL=VE#0v)K za+W1Hr^9o>*7lnkX+<3BiPM&t8DSi6RET8g8Q#Ut0hca^5U~`6jO=$AxJPXoQtI+& zv*!&Q*| zj#4Dyo6}n!b=I-P&Jfv6ZVP?2`tq=TjJv;SwYlsiUHzV};%_o@xGPZZ7unTh1Cja2 z_K`pT`0LxBe}DP@_owGSU!H&DEt;NwvX6|#)5Ft)$+4eEHmLHBo$P{F;6PrG6+6u} z_l0c;wmXcu#&$z={p3?4^=Bd%bOPT-Ay~K^U{Ne+9K#bmDh8&dbFrr!z7($)`^cIr zX0=mXs;otKI(6fCCQU{YF@S$3oy(9#JS4QDNGlYET*wA!AeFX47V;8ggkUc6=~qlu zMS`^?r3s|bc=U28spdLpajv#h4a&S@=y5oijLSYpJu08tvsd*q z!L^SpghVI?&B3vl=L<;!7t*4%S4qQDR;>pdOZ3WcJ+y1dI;+-kjmv9ZtXkK?wbFVF zs`kH(W(H5rrpJYxUWTf#Xww# zyJ|8}ulNXy@wcZR+gYdwW%nn+gd`viqtkcnR#93!*N}C4N36$3j$Uip4!DJPyX4%H za&78eNj+39Tq@&vI1)e%abP5l8zrGALw$|my&4Pw$rzIG2Nk1UPQ-KnJntB$FzUmkujk!iP)tkW6Mel8OY9DgHT~%jgvUoRA(& zO%dhEOnx%O)%1d-`Tm57^K>&;ni!svhcF@Ta3rH40s(Y6woPOLauNv0EFycoiRaoD zpNky%H0zoW{j8N4o%vimM4TKGPB^a9jK?QM+ruNL^x=5!5l?)V3b=XYJ7F^AN>6KB z**f-mTxJjN_cu-K1a&*YwS6qnhpSKOo%8)tS!+0(2d8V^^nO6+k$vQ^fBfsmzy9O* zKmPsw%fCF2{POAh-QyQO%V;YZl&xA%rYBx%jm5ZZJi*@&-ZbcEaq5)Ue6Tf88`Ayo zqEZ1#T^b%8c{P|Bjagvc_Zyomg(M{!CrGV0Qq5X#6&pd8nT zVXi<%x{PmuR97W;L#cdfSzaJpIJUp_KlTe8WRs2PA)LDO)Fh|x=U_aUq{&b?SnE=e z5Uh7%z7E`ws+H%MF%a3jC0Iv8cT8#br5xD8Q11&vs(_&``*W}92VpW8-K>1e9hO-i zXiiGELmd{YSlT{#G^t*D9_$ih5}H#8lqf9pdUEaF);e&nZ$l?sT4atfMc&^3l^_rq zhpP!x(_q@ZZR~{d=mF(wx}Rx^hC*b$*SZ#{(bF?i-Ac7ffIYDxK5{(w(A+dYUHP>@ z-Hi5Q6G_nT9h+XZsktJ4Kd{VY##wY0@;+_2f$7>=?jNP%7!qi3_pY(`ebp*%y|7ED zUy^E;K@yBA${uliVQJ*eu`au=In7lo)j#bZ*C8k_aG$RpwvxG-0rASgWOcuuP&Oig z8phRIugAwmUE`1U1QvyR*O=E_Kcjr^a7$5Gu!&s9o8x6Ke(#vg-a;nyyFTWJ#&xH9 z(ZC&uY#E`p&U>LCj1GtcWj7=g4w1v+c-ihldCEPP(0Z-6d)~?c@BM>bORQDX_*@x* z#X{ILa4HGowve%1f}31UaX*%8Y%kpOk+#7R8z^9B`RL(AzGtJ*8IC=Y>=MMqY6TEM z-T*m(Is=#xgz@fwfR&C6O4J$x{Rx%R4ry41M?Sj&nm-dc`Q-mkE)P|P zwp1iJw36=3TaTaHOV;uusbYo2zH^MxFI9AE=;P4SNT!1+71L0bH1f(4>3*Rl4GH~G z)sEGXK zk3W9={r8XG|Ml(jA3whR`SR)8&Hbl5{gka_K63VvJ(6s6;mQtC2}b_ghwey|ckWI3r7 z{XgSXU6}>Sc8XoPMWvxLqhD!4s*7PRMvC18GXec7&gw!NlO=A)nW&{u>q3;&>Opf> z&Y(&nGK2+Yl;-x((}bI^Ax!ka74>ROcs@;v!IaZ5Fj~9SBG0{d1VT(Xcq-(};JcBP z2g2DzMk`+fnoWcjT`oqamNW$MUu zYb!V3YyoNu*50()tJz9P`ZY#B?5LIEdwxN(7qI~sad6o~$C}9AbZPFTY>(@550wVc z0EAFrl-<(cI7Ega0nxH{-3Ptu$B~D1X+*qM-(@w7tx%G(J7AEiZmqrTz4=p-60$q_q^10 zU?jr?IVmMJ&*^Pt`4x`p^{0Rfj`cmvX7s`b4-<=ko(O15C=oQ2&;m7&8raI)P19zN zz9I35o4@D8yaHX?ytJ3BYrhzLwW~_k>NzL(xh5y&af5YDTw7JmNNbn509~5vwd%EN z49ekh;4W>wnl?nvKJxRAKfnC-x2K=JeHQ+BekmfKU)|Y9Mr1y+Ut>h%z5V&Ct-TSE zzvFpio~bbwVrr~wLJfzjF+yq3S?(Uc*m)rQbVJ8LzehfjA)r+<=I*7mWy%HJa)L)S-4z6$662Ff=?$6E#(6u!^OFQ367sR83db``JTS2$W-Ip{=1TkrQsY4{6BoE|`J5{#6?lbk+^bbVZc}j3Y1Y z{{L*Jv`j@TPe)v8j^*f9-e}*k^w-U)<&72Z{w^cQgTB{?xHI{@7^b0h55x9MhUbfA zAd8{qW3;J4VJ~#oPlqsuW-V$f9Z|8T1a)kTd=b_<`P>p`&-mp4#x-d1QP`N zF(bc~z!%OMHR5=Y*YNWbFvLl;a4p|6P(c`+S?>*+`IwyLqSE5kRau=b?DoN}xR4;_ zGDOajwJL~Q$ErI-m@mmGuu_+Yp$td8o7RUy9h^R_CF>fg97;Lytnr0+U-$catr>Dg zF5$R#jd=$h3^F#3q2H=CC^I|HJ;lv$DAx+Sy>$VC^-+kYtk(mea}(qzr-v2q-W!N7EYQ9yLE&&B<1Ihr@WkN`#NFq)#77sX%{~Jkk zjxSt^t2?ju@;owU*%MDV6&?jrX$YrW5-!G_{<9hkKyI=#MYTrS*kUlIP!jy9B^^{n zp*T8!&IA$5sx*XmWayD*Nou9az|eW!K3nB3#bAjN=y#8}OVv<=wNTOw1xGo|qm2gX z+}^ zs^2%v39fFJWI9r+;=D8dur$cQ$`!A3KRm5x{SK!P-0RXMSv+m0m|@G41McwfUGj6K zD(1X2t9(rLNJ7m{>y(0}Y454_<*(z@{WkTQruJjVVt#Qpk*n0F@2vH>7P0H{_~hmH zKfnF;*N@--{_*v1Pd`0Af1N#ia<~hQudY1yg7n2hcrrwT0-HnebS_(pMmBb)Cj(Ws(*% zOi0BLx$jRsTO=X)?98%4cC0LaxgB%Xsx{ZsFCZmJl^pr$du$fV%xx#&QWxl_&82*O z3BilV^QWTfAvNy#;G}CeKBi27b~H->-;fRpA$54783eh^?YdSz*a>8GaL^M1sxBx( z^MDmDnFIIWNRJ{*;^NxLUF;_3wP4WzqhWVk-Pl7_;7-Q&Hv#&k>Es>fWOYN_+Ia06 zBQ>8_jKUi2r-{9utBza0{(!}WV=x-+PeI52I6U!`aT#|ucE*00QNDd-AcoOiyRNNR z0fXZ3N^pdMSX|__MBIL&e82)JV6wBEK#3)5^yJKDjaLlH)~*q`{DMAcZGaL$xwgIf z@EMo%&@Ar6b7IS0K4fq+}7CF?wrEC04N1YXE+sEqGOL9D+@3lFeK3;^uQ!anmed8mKPq5w} zqZjFX{j-Q{ANluh|B1*CAHUr`eYw7`ePrjmPET(R4m|yIw7WMQZSOm4?I#09qn)kI zU0ca~8N+yvco~EZ;GirPAVzFGuHpvk0I9$zjL3j*#14`a39yJkg0zubOan#;GD&Jh zjuumqd=a@hPN7U`!M-+k&l{Yq{mt!Z2bM|T9O%d|<$?Rcj1Wg$M!vB=K6kN;ki8{6 znC%jCNlIuJAH^}A=5RlR%01C8<6|%Z3Cty5-LanEr@Sbc_o8u`8>JQfop-stPWdrg zf}U8bE*Zi?jFf;*jj&KC$~WBOoMNBFVKLW|<+$7ot>ai~Q57Y&03?KHkgp+WRl?|I zE0?*ZAHEXu3yU3OvQ3Vd1`aaFn#fUNkAl<9vnI)aTBEjK?4{OyMhn4Fucr-lE(`1g zHpM+Jte4kW`D9?73^WJ6^q3JS1xlG!y&t54NRBX+M;Lbf%959^{`$Ut*n+}#b!%^W zZF}2qFuh)?9D!F$6^Lt26NS`%Z3srINSoh&QeA#t2&SQc8=bW{KQ_Esi_c+k`-9~e z#x+J{Xoi@0i(+oFcVl+NauvPF3U>nHKnHh%Gnx7Eh&nRe&oSYVb=n-6F39%Fy8w$= zFkQ~$!L*9})x9G0h<;X1IWQ$2pXzMV(;_yTJ97&s;!A{Sx% z$dJrpO@4H#SFp3i4A%0E`3P(6T2N(>qWAI6vcjo0Po> zSBroudMC~;jd@AOeqW)++2W@R7eB{G@29<;`^tunEuKDutyE@aq_B&v{+fLGeepu!x@^A~f+gx~Lwm|D_cJ%h z50N9d-+ub*FHrve{og;n{>Rr(e?C5by?^?8`|yIuFJ)0>7B9jU8C*Y z?d{#ojU5L-jpRn!5VI0ZG;l$mP%og#C2D|-*sKEeSo5QZ1>zXr|(S4}rp5mNhD|vB2 zkde#9*2)afyE+X*k=laDRxN~LXe}ChvwAjg`^O!O|I3@3e(#BlpGq8p-+O{-d(%!I z`C+E_UJ^Dc7S|KUy_<{_<(KvI%hV!oztCeH!TG<~4a&7KU5^i2YToHu^}9}Q)>hwb ztiN-@&B-pR<_EW&+Nup=E3_Qpb_0vWQI{skr z3c)~J80w#Yk_e;!7hQKAt68?*^}V~R$Exa@Pn}a|K6R?9tLLeDs;;@K$J=)_Hlqp1 zV4FZJqAM9}5a1+;*dz>Az-A0Ke>jSXLJY}Ogk%!_h!lxL5fB0-vZ8<*snnkf1!LbB~W0$1Oak}W0YN^f;R8sN>7>N~C$7LU9_jSgyBpLS2 zs+i=Gq6I&l7$n;SQR zyj-PZ8p8j_H{L+;O)Epug zg5lkgm}MERsf@BzAfOq=b)?P*Moz=QA+qX;)=EzOQ%R@5R5l4j8OfdUqdZV5h^yAx zRVAuMU8$-pkpsk$%~z!e42Y-Bj;ZPpS#DzHj;4Fi3|(^Lo?*c!ZR;r^xwSDz_wLqk zdH5cq{hSJ45m|qrl{sdgl(BFgbfPB#Hg1>>-+2z;h^^u;a&G@&WYuV!r(2cUy5Fe% zQwSnrsGgD@n;L76B84&Vb-d1Sb7lczYqQ7)*bVq9$vMK0zXxrrIA zc(W2Bru^&pSMk->RnZ(}B?81$Fl-WjwNhJERe6CTh%ASM56a!hBEpPKiz&oSH8+t< zd1Xo7MTOaI(ihM36ZeUD5*Lci|GJ3s)kEbR&X}*^1|2~>9`ry zO$7JSd^|?c9Jvy(r$g#I$+8&E2$-d0hlbT;MwzqqA<}WEniZ{Q!wBpajhL)&uz(k& zK4n7+J08k2FBtw(0`m`TqarSdE09W+Xzct)j}2j3X`3F-mc*v7GF^_jGNfwNS^hMF zjfsz*J!4zp6YJ-*XE8btKpmA5N%_>7LH6l08yl5shqm@f%(lf1>98+dbapphJNNj> z3?e_G*EicKlG+5S)iC!A93MM(b}8D~=lyB5$ng z&v;6nhTe|8N)!lI96Gh;SL@RomBKo$i2j$2~e}}wY0cU2=XIWa|`T7 ze@n|c$T*atOH{iha@v0__L6ADkU-7&uq^UpJ*)VGvzT&;<`z&%(Hu+BfSyzPC4uI@x6Gl>6tSYGea;WTwT+UHxGXwh28;IO-))BTK9D z0!3Su?viRWp(jvoHmd<&WMP4X(3G--Y?CwMJQdkQ<>*^&YWUDQ)|+Dkzq@5x+1cKs|u???^n(Z$5VoQkBG|SNb&_Be5|yK zl_2YvU|bH7aZTrI@V%7;SK5z)d5$T*T=J6|IQ)&AqRfJCZUIxg&LUbXD3So4>`i8cjG)Qdc2Uv`Xie zUM@H1WhNP-CFd%7`XuQ{Ah=Z37^85c*8v;^hl6|8&dMHME{%UXI)Rvktt_$v{d8lp z%16{7a#oqDl)bTDY-~l?bU4{;?;PZ#m;o1Y47lXe*xcsvhWl88R~lw2=oGz|S11F@ z(Jb|9Jevy~SJAWzcd3{jDLB1B`PA_@Rgv9OLp;8kYuB%v0L9jt*81%?ZoKx|^_O0K zd*&m*I4gHCx6T6BwtrfqE@Lxk5IN@7nf*k%afIU#d4Ovuy}QpG*& z6NtqtxpCkFWr7~WX;uR};hX?Vm>9MN7EV6+f@tbi z*kQtoQ<2Ii)#^w!D{~bn-Na0u?MRH3*A$qZ0*}lej8H5JoE*Y9g5E+-d|)H0R-n%+ zw>eHeTzqD8T6Ju6p9I;YN-(b`x^#2Jw@Ye;IG+eDLjjk>lq=5OomH0&F_<>Mxs8~ly! zZrb^(OkLGh8^r8t75pKiz^YHj(`iSNtnfj_T2VSj1Fyv15w6c(xWGBZVp1N@nXOHJ z3_=_^fC!H};^Ab-UvS8W&{}q=Lt))xdJCs5_Yn(ZDsFV+z$H5BxXkV;rctKA1<>$u zwjS0RXl;nb+L`cZJdTnKvS+%}SR+@~7G5t88V(^I!|ZpW*b$d59%TYaQ8SL>s2)G6}xbbI^?B8+`?o|P_&U%WrJpOVM#%TZbP z7q9A|eU%z_wTGiJT@6g>c?cu>FP?+V8P~i1SfCs+e>s~5wn{N%jP`XoMvS>7Q7K#; z*N?UV^cZf{2)S1Qx&&{8(mByaXf1XFxN#AXYeKwSb3-)(tXb>0}Yiofqw(#~S7LMFmu8ouN`O%78;BFq<;UgE|MS0alb2SnD_eZwr|oA0ux zp~h6HBt^_pwbF5rz0~MdJMA=j?@7`lh!E(Ck}z>}ydv|6*&JL2i)JoWhhk-gGA`jK z!iSrWKMwZjGfd3XX`U*XTT1lLgMJ`ui6l5gE&&}&NteJ}Y5`~|XO09vwMdDgg@7Zp z@(ew*pP+$PL{?(bkC3YZocPInIm5SO#}abQYUPnRzqFhr&8J5p?#NYf_={1QpFVR= z1o;Tz@iUFfK!b7HhD(@Co+io0p(p*YXzI+JJbMmj)ymUAZL3?Ls-uosOX-1;f~_wuBeE(9?69U9iodP} zK(X^10*9yPokH!}u94Ol4C79)zOf~%a~F0{L!l@D#A~}@xBkYukJt8yW1W@CjGUf( z92s1Fc`>6Pcx23^90gp5cnf zpuCFd1?cUx)8ZMb1~*TbSyyElCgo#sP5rn*!5CRAD4~+wJ+QKMf51Kg|CF-SXSHP>GE@@_cJ-DF<0z%nj$dN>el;_Sj7p~2COXz{RMJC=NzF; z4Os$XR)951TA&nIo<7Jggc_A;mSHR?W$xB`k4a9*jea;1cWTms>?|`9z663MvP}e$ zY3~=AbnkrmUg^MFO1lc}0|b17!n`MlKO?ZD%R+f>ErYqhZ94`fN~MM} zOtu4Mzeqs2WzJm`#UdwX~cGs8#0HH@(KTGmhW%s7=bHg^3`2l&hvB=&!b4Do#E|qe2&= zmhru`Gc0GwcI@6~DaaQz8s~7F+9^H}1WA{r0Tc_15#x zzhTP>_Fd1v@M?Evym)9D)E>q4x^b(S{iMw|piEdMMwwoeohD{!YtTYWP$`mbOq)mS40Yq*Qd)9|L02u6;RY-f{d|QI~|kD`O{|4RkUmbmR2edDyD8 z5*b!=N;rxHdM*nzX^LIau4-Lf;@5Py^&WAOEIAth*(iZPx4He)>^M+D<(R=o_}i)r zG9q$D0OWW&$8#%znmR=Q=TeEkkni_ zMwvF;cjQ_+kD3gKlQtEbo0^}SU3Zu`kJPWvMmpUdohuJB&$C(reYWXw6}38My85Ti zZpNTJ*5+Zc2v9!4aztkDgG)1ad%0=ybi>5-{?LJVqj((spsI9YBW+{az)`Tb{*I%) zjHp$PXxQtovO4X&Effc%+H>@D8hLg+{5a_{Ga6Aln=YbD<$n+ccuOUF9uFa0I=Gv{T#YV}*!@bclxd&;~$G zOYr!&_gG0C^&62x$-ERNwoG6XMZZG+G)GbgOb-MTvc4{-mW4Ots zkFiyGyfc{4Gt+NdJ%Z<`i*u(uNegxzx=nG7mi$HVD@0e2K2q=(v*$6aQa#SYakG9( znJDz+4)t{^Z}aX3dPEPpMOjT-Wyrj=<>P{kvy?|NoCPxldcE^vk7nDc_a_?W9rw6+ z`I}HQ9)UsdQmNiJ9-|yMafCE}Gh~SoL0DGPdZYoNRnXD$)12Sdj`{AyXQ2Vd+*{Z0 zUVr<&ciz7B%Ij~lwYHF^bwX?cWv^snvgI`Q_Ai-|ymo#o>vyfKgED8~h#_)zeKMeI zk`a?;OoTjy1zd2jKqb?JfxmLv0QTySbw#w@0tFsq`ZQ=u2f~wX}3kj(rR}eO}=ltfD2-?Qe zCeh5AlTkUIJ4Ym(W_AsBrR6V-+8RSuofof?3m}qf9MMV>sw_m~2czmag=l6);0T7` z>-F|^`4Q}ReXnhFvs6iJcYGrJjzvn zx9Oqj!1NPV7Pzx~_8i;}H_+)&vSuVh$(3sL+xaynPDA7ejJrIIGzH7Y=xI3Z<7z2k z_j=j~?%25t0rcp-`y?AjXI^;yX-`5x0>zF;M9DCfw;sss>olqo4~G-(_J^&0^tg^G zjOUyl9Xl@8T>5p0?8N}<3fFpQ`~oSfxgy)k#^XI{cs)9JJnGYq&FBR3xY{r}MyN3k zJ`MGf2;mwcASnsar6M?}nsMY(7=ODTK?9wxthNx@G9bj~Vyi?>Rx|F5$hO3iiE-p| znV>3WRo3O5nw&9sYA`o4a+KH>KpTNE@U29QWdpm#7;Xgor7ByAa+7x4!r)3mnKv49 zte7s3Nj53+b2k!nfVQpqM|JiW8Sr6;x=MCMO!lqX{a&9KU+(fnm1!_a>aERKSr*52A#3<)jG0$uVh zwdIj~m4n(!+wfHcr;W3E_d1j;JQbc!V~Ly|H7-|)og%j0xqZ_FC_7EO^~Sxo-njGH z8#i8h{hgOyd*kZ!uU)?SvZX>8cX4#r=k5J{ev6oVer?kPC|o{u@*EJ8n6&w1F5(-A zm}+FayAqm^>sKq(j}Imi6hYDI1+SmDLfQjs)EH|#GI+bg?mW^g5{l~ zOq>em=OK(!r#s5iDGUW_6RyPai;T>iDtLW7hSSYWKDZ`wX;_p;jvl#K95GuTnY0>W zHZpy$+&qw;im6;jK&Mq;ug+ft3&;SS*fu2^w~2f zP9-p>Cr+WfWBIGdnP*JNocZHPcv{IDXU?x0&b5nYF^)XU|p z@CwL{P;EBmHeutt#0A95e45q7k!L3DDpXBiRH0O|cvqz~50DjwOJ)^w;TLEYl<)_# zPLq(PceaZ%A-5W48PdR~h~-itBIgqHZ)Q}wuKXQ*rwBC>-ay9|lgZNbk38j@QYzCZVgTUOMej7V%UaO}W%nxhfY+7^U=#Ca)q30b)1~n#V7i zQr^8At@S(a+`azh{kPw`{pLHjuDx~Rm1}PildnAc3L;;;{KCPdXLk>-Y%=6t-!)0n zQXvc|5&7KNjjlh;^xDXB{Xxdj$jf!5Ck}EU+a&5c$&ayn3sd9 zgIbZf>b;xL5rZ6yb=czM)^IrHsM9%h!#h`1L(XNcI>@*jS1)KY%vuRowgu(DF`}qE zg~(hqt_8J3$dftti3Z0q1Xg}d1jFvGN-J9Ry{^i~Rj2Hr#6V2uQX`YvTkr%A2@6fl6KN675--!&H?Sw==b#6^ejaZYQEsUb-L?98buWxOy8Ac>?t!+?2 zN5^>nJO`|#ydZVBjH=UqE-Y;byktWxCJu{vfh7!-PaBIw=XT5}iFm7>r_P0Uyzs&>Ei3D6{Z3>5eOBh?!GiO}%Jt9DKvy z@p!5pi!KT}Be>)7^Xptu>#5e$XXS{z9+Aw2bHT@WR?%9nn2Vi@}#$fcW45 zj!g=-n&pzn>4!_j@x(pQKat_oAu@Q0%+n{f2#IDgMCK$ck=-wkDuu$cELaC{kyrn! z_oC*ha|{MHvVv9yCenE;l)Xq!Ii~_kXKx)Gm&kpML0JTtCNdM8BQ*!X3x~OI%)zns zz*m4CtVhMIR;sjml79V#o0lYQ?_!=!_$VC1k&)~wY*sXeQ3zPzbu`i?EFu@j zE9?p{b5{g!DyMQ#7S|%+7&ptQ^bHt$*Ff4rTQju>_*_-Dc(ya2w-qbG=2A?#D#J!W zy+u^a+@DI{A_G?W+sI_(S!^oVt}+SK3g4wH43ykp7w;mTH@<2&AMphm6y^fH0CZ8+ zGIW)s2?y~Pt4x+e(L?#@ZCX&OO46UTII8~jA-g0Tyuz~i)s$7>QuwzsFaSV%L+FosYUFV| zmBb~@QP?`g^%I+qWjg}z`VPpNXpGBZa*1ia|5Ds;CJhw%)cRiBVnKl2ckkZ4e&^1O z8~1O$`@xNO?!0^B?i+94eEr(nmeVYe53jtqck$V+-NVhDOKTf@XV#*-#$u8(H>-FB z#~3~9his4p0gJqx8Kx#IFAc4bafVu>NxF#WgpgDG5g=|3vb8zO8qYwm4 zoMTTTozgj;7+OypYF;&|EZ_K(Br}M)p=9vN1F6**)8Uq(;tPKe#6mdn=N@B8)f|+_ z=FKUY7g8&JIwEOxyfW02k+UO4i;sZJnJNotj+~C@8g+4DDmlTH)7sZTGc^Uy;_nE& z_#5mJV>x0kCnRocmPmH4N}C7>mDX~dhvmFuJiEInBbqjiXbh8GStOCtLg zcG689b*?)yAF#6XR4?*!VdU6BLfVBN?};Sg=aLmX@`McR_9 z&#Hk1v2a&c{z6cRD&sl0+4fc3c%PMr*6%$}X&#P{3~$-2Z8+P`kG5jv6fq^HN7TFS zQ|f67N|z>aRHK4$(+889JOBLk+f{f$Uvg;OYe8noNpF9=AZKL_KL2`fVW> zc8;%m4FD^W=18EOGaIBX0>`pz0p+pm5_8K(BCrqUcRwjeII6HT@+#Ye8aGeg72RMC$%!g`6 z%bVXmyk^8}oNvUez_G|$^f^aq+&INz8yq1b@cWt;-GHHOpy?B%iJER|PM6wm;o>J@ zKG?w^;*pjE*e43~W}Bk)v_SP_kBNnyHHx>_X(5x8A#bN-8C^8k+=6Q?H*j+uw&Hu9g>nUWwMj$$-|coD$z*I=Pt}bB5RlhpoC>a zu1pHPh+K!W#+|EAwnY?yIx_XBmqlPCRtQSS4}5Y9!3UtY<|^>5P^ch8cD0urQL9&z zFsZ12vv{)l=s$=MUO(-ao&z_O4`D?RGku9!<^ovLV>j6+TU@1s;V4=PIvq)NB1BNF ztU4fGTe9^+$(XTMhD-xoR?0kD9<8^)wBh>mk%ePvT%HE3o12Vv;ZGw2%|eP}f~_QL z3;<|l&z=txmku;#ZdhT>>T`aJu^&$0WoHL zsV?kZ90c#nioe=yo<`Qt1rU=&$h?Oc!ov}?>Q(R9H1fM3Sj{jp_7W!c1s2Eq>04OM z0o=O$Orc!L)HaefDF|MzLDw~72i(Hb*v^i7J`=eqG=0?h1j-t5wy#|Ef#8~KH!oe; zWMo48Kew4l`r_~I3*5H7;QqypgMC+hKECUABs@mXXN}%3-&BZ9HT;#%@PD59LW5@h^lEgxjUrJk zy6YJl@EF~~5IHSgzx_52J(g4IrZ^$8a@3fJDQCx3WHBet#9Zx30mLd+muk;gu$v<1 zl2wO^0@tFYvD4F zb!Fc27c0S+tJwQXgx{ILgi~S`;ytdCpV_Pa7LjX(6(zI5<#Yos1}H;hqopxqBFPSG z2%a&4rgp|190WM^EasFYkiWbeVKX8y+bu`#NsYs15Z`DL_Lh07h#t?bKHHdEvkD8l zSC<;iX+v62OPNkf*6!eo_yMvq96?z1vOufH74pX93^!*7tC?D*8bTyr@DU=lCm!aq zP4Ls_^`1sXplH$mRDJYIk7A0}qiBhfQ)%&fPA9%N!kbUNn&Nw@lv7q2o!3uQN4}0M zyo}%zp76|>LS#6uT;MI$+FZMNgVy@pTkqe#@!?WNzJ2YD>o33d*2}NG!^&%^yMFG{ zGcWAee0k&G{Du8l={ie|2&7fkG*|FwcMCN*sj^5Zh*tN%Y%F$_;aacLJ z+`tY=8H`zk1T;}we3u%zspxEJ$YqPCtNfkv6O9XHnM8c1(Pcul5Sg=dlFxt0n9)`3 z23J)uXs(<%9JY?V(_%WU>9Liv9hFOHC8Ek-a=hjUv!ixCv5-bbTy39UiIrZR!l*{3 zP}cr9J#}`2GZ1jjvf<2WM*lqci*i`2rD4}}1L(;!>sTx+dSecY@ewBYjc=Z}cZovv zJiWR)OWS)1)DUTuEVedw!liKIBZX47_74GTM*Uaj0A@a`UXI2_xo~CM6Ar6j@2weHMI2Pio%y$t( z#4*XxCz-kS`oK7g;WvnLwh@?BHX)F$jdY<<&7`8$FDA4rIgP;20KZo0(V5qL+vayY46g?5TAl z#btD5=Lo+e|4LXYA^8CC{mRh=8mjeBlx z#5)$(u|JxB>mJWLgGa~(%AkXB{2XvV^9r(vT-T5a!ez9O3@$I#&ediw@IAZqN{F_D z<1t>c_Hx!wj>zmt(b`G1j>F9i&Z1k`H~MO|3j3DRbz!K0=9y|o(=G(C+(Mz2a)3mF*z(At?~}d_T-!?OOvXn70LAhB8RGmoXtyO3oTVDmU2UL3ume7 z&@;+#aO77*{yx&7zePDH3KpAN$*|a+uE=t@R>G=zquI`C(nDdgdG;nAp*Ya2Yz7DKwxglGgft%?^Qf#VNJXBK}I*Dm$55-7qd2k!~jw2qT%F`(ufStPN# ztS!>UWTj<^=1t>#q+UERb2{b9q+g$-tG-H3Bc@Zm(9w|{QsL15?e}iKdHdFl+aKJ$ z{i!L*)YtFac>lFGuD^Qi9dnaQWJcF;Y>P%j-rO;ud})Ug+rG)V>zau5?Q?6^*rcys zr_iqM8kaGYate9~q%({gj0Uf?OzbB|lT7NY^eV6bjTJYORLd-!JZCzUxjd3Uv-l)& z#Fq&!%fAH)ET+Rs_GV->D;-(tbL^MMnD~2c<3g7=sR=QCZ{<@^9!6)xDty%DXgW@3 z)OE0%(*bmlt%if+%?)M)Vj9{3~-2HVh@ij5#B@k#^TM z*EjbB@)ybxb+@8PhE&Al$44j>lL*YY1fv{c!bC84znn$YI<8)Pkl! zab&oF_}1?3;g#)!OCtqCyyS_7u;L*8*8Zja%g;7dFF_lcC~^17RYz~2W{oUq`x5N) zj?woLFeO*6x6x~<8H5k`D>sdGZXI5^aBvBr<>r!T67qX#eI_y#*~`fz3Fp+e>C^L} zIfY;`UFGp;g~;U z?2Mj~XGi9}ptV17HoFQY@{-FQROksnM)uFI(OM&NyHdJ0WewSIq`55p(agzulWHL~ z7sv8cD6+T|MfY%UMZ=@#5kI>oMX!E9U7uSnkuzLHMH!7*x(a#nRPmnDbeuE-g)C1R ziu2om#jnt@Gz))+Vl3-o6xW@hB$Ra4ajMZ60GS zA(e<5;rPk($4+GV7x&)v#&P!O(~Iq#5LSE%(>Fd&%@w70@X8$J5ZayiE-3-l!! z!8y@*0(~;_Yy~xsBF5gi%^|WEjPu02McR4tsdp)3AG^`4aZxKAq=pC;89|qyU3ggbE90H2|?M5f#I=JTniA%cl%M;Rzk$P(>Cnb zjRcC1OQAJ@u9FbmP?cMC9)w^b$g271hiL#Zvb+*<6(oO7s$uRzYaQrA_64XlyK2Ye zDHEm;R{RxbMVNvpr43bIz);-@h#Z(kOa^*ZRiP~ds?3;@J z_vSly2*~WNITMo^UDIGYvhv#5e`agG>_)y-GWfMnM<1)_Mq26XoEFA$h z=1(Cb+%VG}(`BAb5-t*L?`@G8{R(E2X)AV(s%)Rzji!1b_8tVs&M#cdXjtHnZvo;098R+1Agq^{S4V9=izz*7O=R{KSAuR4mjS%e9q^ zEUl36db$Lvp)5}C%hPjT9-xjB$1fyvhcl>cF4a^x&vT(yM}K`V`7E1)g-X23r?frk zosP~tf^*otoMBznO1lTq(wG~5)@|}6PPEx);sL?1bwC-Rb=GIok6mb`W=_*`EI2|j zG#9TUGN0ksV=Gl1H#vSTi(HWz`RJaHN`3ce6)&`mV6NPk0 z)S4dWFI`?cykxr5xl860L;oQKHH76or&*<>J+yfB3&LF;t!(+Y5F}-VVpi({GN=ug z7t@h4mdXvvGtL`1(U5M?6BP0zojnvNy5Y4TlL;4E4Yu?X6zV%Fi$g{cwyZC`pzz4H z$y|~#mkO!HSNTZCGil4?l2AS>)1$~Rs#kDgbN1Apdb;ZK)R7)uZ}F?@Q;cVZh9MV( znJ+(|tq*XDNIg+FlpmF~qLr0f9&oor-?-L8eRKl?HLv%8wK==whvuB3Etj&UWk`#$ z1g=0-)&H-pSL3YG_EnLyvRqo_kfLYJoK;9-s=y2c`*uq0s-T^6-n~}R=c%=fOg%k^ zMN364u6Ap4KRUgEvTye7yLWEB_n!I4Z@+o}_RWuO-TjEXY*^WRD9)I&MK#%7b0lR} zUi*j78CK?IEicP?#Ri+}{!orpXqT;(WUFN6?{*b<3Xyn?yd83L&2(XUe+kCX`!r?e>`@j>6Xl&!@ z?Y#>Z4}dZlT{O1)K#6D<_7nw-oJd6Bg2aC(%$9ETL)y@i;;N;)>u*GPOLpk=i#;UTj1HcbMu^Ay2(=4%JLGf+~?0r9;{LU?j% zoZ@J+J$6zgvbYh|n=#)&S(SXzFzR0XzU|n!Ww*ITjyOD`ZpL~l|2hTDx~QJcTqtKjlLOPbL35@d zdk$_~TB3A$-AnQ*c^6~K3mfcU8p;A%2R)(oY$e1K8NQhhD(zOVYBhntD(B9tebYK`= zh`?UsG4MFbdSS`Rkj}?A{o&xr*WE5h#N?djQiSC$xIH>^x~Z`MiNG7D)3Q*VNumgu zC#(6PAH;DB74CQM3!ro?E{;E^_G)56zO^(RA~&~H&a3?8z@Ot%O}%){M$1&&LLshd zXP_C83BNKd(-&3hOypXYQUYYf>}aiT+`D(@gCO|E_4n`I`RLBw_pjf)ckA~3n|D5h zX)-e1HD}-C)eL2lG9okd;znd);AA`&s$rEWBL`5nG!p&J4eYJo^tStvv^9_ z#7anoOCj`Bl-^X|1!z#awz&+M`BrP2MV_yir#fB*`J(ZW$O(J_;ta?Jm+RZ2fuO4# zu*UFdLKcYBt5GYW{qhn}IxWywIq*dIjdk&Y&I{t31;(~b&YJznq3o7JN{N+JX7%!5 zu4*{tqITZgQxHcL43~l9#YbP~jUXKRD+9iVfV+R?isRm;tGkv^ z+q-;W_mXJ*a4GHHrDt|73JjfPLX7IsRjH_&AvM%K2+9*U%4hM_PzaA^9D=7%D()zg z)k+}vLX{&oa`9#G^}c!2R^dswATm!D%koaHLXvhQ;(i*AuC^!Xr6uV!H^lKyj>I~0 z^a#cMG`#;}il$bMoE-Sm|9mj35iM7cN(7CAZ0GYS(V47o4Z8sU-r zsP~u<#uY>A87>K?6)mm&!LhqqC}m{5%#iADQSNvG?T6<9vgOl_86xLL%%zxZ`&rXD zTo`UeQ{7Bla+_{YaXc#NQY7W!?-1ET*gSbQMt~I8Gw{8Tj>*MC=RlD2J-U(BKXS1< zqI1pzS%?g^fkWhVnkWxyN#rmWi<^%KJfZwNb{&|dI2=2%D!MadFn)2E z)zQy*KJ9z-NB4SoR&7PwDry)}lI~^T7)`9xnABc82vTRu`xTM#m!FIbru^KB)X`uc zUV_~mDY~IHt!_-1)-PubE)*^|(Kd?li?O&K#w~_rBdA6qjxbm*7miRHNigA3#%^$+{P=tX4pS&ng(vx^2~ zk~i8aVLcMoBcTtl-=Oc2&`~05mz=J`=et{27^ZYB*vyma_*(qzuG4MUxqkZ|8Tq{r zzVPvfU%UU_$G7hoN4|^5ciyAHzJtZr-nvCtHlSS7>k7;JhcDEDGCFr|6dW`9y0Cp{ zlGOV8-p0m02h-#BE*LPqu)6~864OgwukA<@w-Ft$$hc;vl^M{5BMuh0K2jc+biWlO z8pf#rkyFQjI-Lja3PgTahv z4;lFiw|n?3HwiBjoaGi__P{ZG=NUT37>oybT^(w(m)=Ha>H{Db zq-x(Z;FyK8;AJ3KIMS7a1(_odL?E5_(EDa^#2#ep%x0`@OV1f8cww65tKsJadP>@S zTHmu9u_E@~MxGsYRuH_zsP8L{>U=dVf4gz!sCr=4uiM-s0{j>z4Gijv$?ExJslQNKvhW&Gu#|# zqCCh7DXATYdIy>HY(L$5BGovMpEI(KbvqpfWiw=T+DIfhD zann2UtVSr#n8Jv_fvh5w*q_V*y*_|~@*E}=95c*zn&+IzBeV`EH65Ye09xeIb9LnD zrPAM$J5jk$TM>>wFyO0|NdHz2OXXXydYzWJ8H}a?kJ00UEmGRL5gZ!7#{WsRbi!-s zqMd}}sIM10L+!nF`>v&}@4f%YCm(&w`}aS&_rb?E?|s1Zn(i8lxp!_vr;W%4lu626 zW^+~!dFj$Kuh3(&__}!cxvnCD$Q73B!Dthv_zPAx}A&gdX*GhK^VacSst7v7sE7UgR*;U610`A%;nbG*M(4Y3w0Ix>r_mmjmS8w z0wQRWo3@M=O+jOVHC9hE{Wh1Poz7y&^R9+#mBqZbSODL}W!}Tiv&-P4q0$%#CDry~ z)4<7LVH4%5Mqc|rA4McVc?PWWO=()IW#tj*&G%OOaQGj@?sQGF<_0IGOLFrej1^Nf znGGrZmFTC`!4R&jbOSUUlc!&ehW zPfKL%n=#+T7RC#CR$pSIelv(OKuoc0GR53x@2d~f^aMARr#E+P{*rJ`oRvo^SMgn7 zXFnk_=PulWUr^~RvAr{D<*0fiEN837yk;94x-s*%L~`NU4EA->yc<1n3<5@rsQtIT zM9?|IzNKw(JhJdJo0knVUuK?EB{SriyTl0@$5QbHGBO-9?piyHCS1%wiuD~Eyo*^k z5-vv&9-D`-Y)q9bw>6?4?xa3T+pU4)!tP5xB3GClZbm$ml{}wbCr;9egKR9pM#v43 zQ_zUF0+(9rkWscXbttm15ohtSnCNOIRAp+YU2z#eC0B%yNXKJ=7U6pKZA91+y0fq| zH-o}ik_(jOSvck+9lr=29WIp1G7rC~1ykXY@Jv@BH}1Jb1P;x^-}E8p0s5s-xIdf- z>abw(axPK|)wR~gSPI}gPRr=N1FH}oSy9UA%1#rJ7DhYZ(}=!kH8Ub(Lou`A+U}{( zB#cNaxld14g>M@rubh^!PUO^oSiHKrcqd0?4b56hR$i(n!?*9;d*|L=!^do`@7($1 z{g1wU=lw4*^m_Z<`v#G*nELwq&HL2XY`w<4h0Dg2>8?$TV(x{-mcM@Hxp?*uqsIni ztlYcE2JDarRn1}sP^9Ao!s6Om<~8Fltu?c4E_0kWwuL|iH&_(ED)EpmZeWUla^qJ- z{mr>Y;T&{UODuxZ;Bv|ZS70{#Kt{(eyoio~s9Cb94q=CER zFc;IK-(F#QB;reQi_w?Pe`XLzE*`dqxlW~BaaoAF$c=d6V^J2{Z2ri?I(U=Zs4=ZI zx!AFGP^)*+>j#34VL{%;yvANLZ>*yi@04lp=h!%%r_<0*dK%tpR|lQhFNvXV)U#PN zF#=9U2JJ7Ly$)wJi6S!UU-QS$Es~5sJ zv~tjCQBWV0aMj~-3p12FERObjs=9o0^eED_#=3@Eyq05NuOTgziOKww)wBHah{lx6 z2T?%-F|Jjx#n#Qs&#-5JVB&N2r~)~djvZJ0S9!|xGYpo-xVl(bj3#GW;fTy2QqA*l zHVWjd0okkspAx!_dTOe-OR{b?YNpkm2FMbS9ZP(-HgRIt z-4HpfC@e#Pb^PE6nuVjEz-dQyd4jo4I-U{g%Gv_`hRmlOFK(n%2R~!de1InIcBA)SqG9wlP-Q1o7z|x zm`2{Psf}wZe~k!Sd=pZ1b+EPlNi@$(yJlI2tm@ouA%f8Mr=8Sj6K&Sl$$BC{#=!R! zup%$(kE+|3BT`We?1)8$2u0n%#liecIWi*qRM&S(N z(gs6w)K(*^CW{&&nLG$8&-O5p1i;^ zuKq~w26^XMJ^A!POT55whlA;*M`fLa<2-ziZgKn5Y014GJ1)d?)1T>8r*6s)o}SW> zH(Z_>ky*V*OnQbnX3C_H%F7F&Tlo6KS?`s>CJG1K)Al_oR?R0smmeSEkOl3H^$rVzkl!jFWtZUwc9tp z0L1Uy{NU!Dk8j@og5$mSKfQhLLyKJ_^0jwvzjE#7E3aSYD6z@Qj)djsUwS<|DPMgN zj)}}1RW?0#RoRHl!8Es`C)%!EV73%XFr?;+Y%zCtuh3xc?p@kDyn?euEeZGF;uVvv z?0Et70-+g>4=yK;t4FqAn=zKydJZdL3VhG+ zZ6h-BW{s&?o4Qa=h#9pz+rTY8>V@n&hp`x3OsId@8ic#G!8*8aHQQGX?lQo zk|vYVlIAm@nGFjhR1l$zRX?H0X@y+vIZ`-s0qC(4PPs)3-@U45=@=rIVKz&n z%g}Do)^p>!GO7?c96JfS+1RU)#Za>b0`6fAskWCKt?VkHV`FB|u~|_z+osqeE#X;2 zook%c`s%YXdg3ZtwcYF}X)~Yqu_vGQC>X9karX4lb7zm6wLdGLn{iNhO5- z2}Rveg5f?3{vw9$?P+g3G6DFdR9U_Qh?4#?o4Is^Q?6Is10TO z9P{v@7EBjcM-lCLRu9mg3_useo>esbSztD6?3m}+DUg!uBk2h!-4B7t680zK5t#Xs zXV$~tSvEvHTaAnnWMj>YdV4<++1KQa)jT>1_h!yG`=Z@8fM{iv+R_kPoYK46DiL|Z z(8EiB%S;P@XNWe_1mM^pGA?rwqO+^AI2TVJgbu^;E7gaCvaR>xj7n!<`jDToB1{Ln zRMWGMQqX2v!Cpi^tmH53Rz!~Ayqk@iiJy^7hgJYu&O)0cgLTqp%NXTFytLWyK))SBunDsYYnS{q$m=QbxjEJ) z=W(qh{x-waQMs~BZAbb1Ad%CKjh?L(cFK8kbZ$ipPbZ{-m2+1_UQMA=?ZS87x{M|D z-E%CFQ%`d7h%ktpTP80X*IV0i*Q{>RQAA`a>kmJ8?}IPC|K3+AuBoqY-TQ(gsrlZ$ zPjBA*@Wzb~Zr%Fi`t|#!D!=~b?Q7RENjc-o@7#U$)praozw-Kx7oL0LnP;H+E#u1= zefhap4lX?p!O+Z8tL%%HZCa59IS&t?zkK<{gM()y4)0yz;24@+3Xu=4gtp`Gw-MwZ zK3HG87y(?Mqa-{i54$CP=`V0Rmm`wTsuzKp(bBONqwWS`4or!A+x_z{39m#9 z#D%G=Bw2EndD&U;#O_6#aT$`Ut?xz_#AfV7sKG%mCtMOtDpMz>7jIO)BMn8V`zXeh zn`h1#J=FL!iz54Iz&Q~#v*3s+nq_S@ewCZKG=KmREqtZCUO@pvO9trfQ{mIYjew>8bC#I95pTqB|x;00n z^N{&Xx)(pE^P>plbSgYLY&H0+xJsZx&~UgJiMWjRdvPA)JnH<)DzG5<*l|5^Gz2Hn zmzDYek369RcIL=YONeBHr?NG_yQSSv(Z%}(r*k#cIPHx(Ymu(5ND#qU^`@I)k&yFd zWK?a1)5kOp~F*7OlSDo<4s*y3Bp4+){W-~ins0@iaNJ{buvrMf<+6Bj~b`llzVn^dh zyMv_91>x{_Dd8?5JD?;lZ)U2p8C67Vj^f%<*i5x?cEQczuM7#@#~6EW2glL+#^|fk zckH-G(-jg+L-ntAx<{wQWx5JWX<7(Mt|lM(IfN9K!t3XO&Zcz~rwV6*3l)dyKKS@6 z?|<@@+xI@cdp|NV5MRIk!JRvwzWw$+N^I8GZ@+!Vk-68KZ{B+4m1wYEeB~WPe)ic{ zUwGkKwb_-F9RWJF+0VR;r=ZS6)GUiq4*`BdUIY%LWTxgt3z8)JoCxU9;W`nq^UPa)N8i$K?1@U6z6 z1M#tr#x)KH>%q{9v^*T-VP*42d3%3;Sn=6r&viu1zauymmQynp^rRq6g@T6_=tct<9Yn}@hFo= zGc0gmYMIl8jnh)Pj3`?2f~l)wDz2$`dO9A_o+_X<@0?2#%69z6O3z0g57p`vQ7-cc zw~xu^qU-DjDnk)KusnrD5%?QY)Cy^;dO&lw5nC#ypUO_4Vm_Ed@mj*7us=Aqs~Kt8 z9-zXr6X;{v>r7U43YksPQaJk4Y(MhYQRumM>*k;NL;vP~`4fNiM}PnKzxdqNLr*;P zIIwPPKAD}ePoG>nee^8B(?d?z!g4yEydQ`^_ciOZhs(3-yY+U2I~5-d(HR^;HvAnN zlZE?WMRQ3fiVT}eqh7F9o;i#{h_ROI@mu?iDn!eKO#SGw(?^b;I`ZU+N1r_X*zt2u zoH+mRld3`2L3csuHjt4uxX@PSwlGr-*j1LUf;o|=&t?ogn06x(nbXr4e~iaUWW~v$ zg@(xZUfFpjWK~S|=6m5Qw)i@9M>ULbLu5E>bKO(=WFW@YbqfV&RkShC+K)t>r9Wm$ zRIb|f$$T8f)t9Y@Ni}_G;|jYk3T<&Li+xBC24Bfz6`2i!gZm&grgzaZ(_JUpUJaPD zsMid_W=<2RMUc#T&e^FjJ%O>&l4@ME(@XwlDo}8YkCuBK5ty3V)fp5v&>XRPN#upK zc5uItVJU}W&OJq&V--s?NjkE;&>IhtC+94q1my* z%L>f`MeDemtMfX=%By~-A}ol!wk|EaBCjHbzj+D8T;g~kfDg^Lvo!rIFz8f1qTMiv z{P9N&x;}jWTRwdMD<6H~YoC1iTkn7PB~Uh|eE04b2*})9Z{3YT`^J0FeC@43neLj5 z?1;Ho{L)KrzWCxBFTb2=%fw`8CO-2x#a~dqYM}Y@b9;NwAhJ{9Gx$O$A-Xaz|G4P4 zT{2#5Fj~kAKp&dsEE-q+_U^%Rr85=_tluS$ZT2vFq4B06kEpw}xF-41QG;?NWt6On zIJh+XX|&C#w*YZg0^b}<=D;p1Xjv3)FY8>Dh62r^`rPS|8=F`xMjg{u(a@iC+!lkS z4InDT(jpLvgCb~BsB??aXn@B^+bPbDEJDjyMqG&w&UQv+sU z(ot{9kX~H_s4;|TEneC>>x|mr^!$0vxYjj#Li0&yzE5n7Po1K^CR39~mU3tyD4JHC zAWXxY_=D+39)Ai?k38`t#t|wxNlH&iK(qegV-&@WA9^l$XW;d?J*J6`#9o}m(6E>o z`xIPe2vW`^va5AL{Boo1?uLnHVh-XHImImnSesmT`|Ktud=m!|XCKdzUY{h=aR94^630Ub3K1Yjyx>z$YYN@lHIu)-gfzwwQK_;>&6fAo_-{KAVn4?X&bcjN4~g>ekj zvOPOX{*4Mfs^F7;IFF8lJk;hePIpVTMyMY@>eqSFk(!;ZnBEw6adv*wm^yn62-J#( zZ!;G0m%6(SNf}}-q~_zac%&#|jP!sQO`#gg zu9#raONY*6=cKZt9ecpH$W81|r}7_#>k6M<0a9AAJ0!kG}XV zPARSpF2Dc&m+#*FA~BiiHH&NR%{TA7_QtJo(On}lF&UcQeCx)muf+@-g5lT@b04a1)3}#U0dAT)PCy83V%Hxo#;3{_TxAR?z%KT0;jsR%eI4rpRo8xU6` zdsvf%~cmEhnmq!x3zoKmV+%z0u{hWxH6?Qx9zvjNOAnyQ+27#HlAq1fgg| zVR{DsV)&|tj>FL7nq{R=vmD`tgp1T_OU?yQdQ`*&R_(JkoQMR7(}0KO5TGUJ&<&@+ zM$8DXqoKuFr{#6SA3E~*BS)SxF{)NB8Y=% z{QgCIJW^-zt%d@*<{-~xJMyVxXgE8F1*}iF!BnP^g+qDc_v*s0pb>IWxFN-{!sAho zDMFI!s2_Vw>_?9r!Q~(tmxVa`OEsp>EfFv6gJzqR?nZi&w%^8Rr;q*EpZvj}|Jy(P zfBi3i?H~R9pZV;wfAE+8;*VZAIC13hhmLNfG0}(AbsRDph^Ma(h;bQk@tOybS%lfG zl%lv!A?g?_vc*=USsBlZu-MyWU;N~YAAj(rPd@y%uYU1sUwHq+_paZ1`-SV* zuDtc?}QY;f)iMlg_ydZKdrG*fR zt8l(>(Vk5iVrK4ThcXBT-wq%1Se=zaWFZZQVBo<0#wjLBBBcjs*r6I(sWMA#R7X7v zT+bp-qlgwkKH>}tGaYzT$1#G6rh4|FfKEt_06QkxVd$7c%NA!jr=zA`tg|try^)l= zZNyyt+%5}w!?mfNm@3@SVd3cvES3d}#I0_Mwpy1Q{v|~IOJpoYQFU?qOI34zmod5% z&hNNl?kcjZ#Nqs2jgzO!Pth@}`K^+`TzdkAa(i47rZNkqac9P5+m{uQdGy)f(%itp z*O5a~mw=e#0p(gw3QyN=MB2%AA@(+;z@1}~V07O)o&|`fCYkYce!JtySxnxDXEwyS zh{!iT{NU~fwAP^f)%zcQ`rb!hqQtJ&x+Y#mkj;mJV>0sVZ&=9dRtA*cx`W6}uQ>~e z*uC+^SKc5mciJ*fO}s8$wM)fIm^KJzi+!e1h4CE^u};n-&zO|qr?Z9*|) ztWMDim||zO8Q?~S%_5nRg6C=shI`c|pSE4H` zSXeb34-WRU`G|(X#jy;zDa8^KvNGyAlU^6vyojjS8i6-Mv4EHnLvdhHAO$a6Mo^l; zO~(;TGBBsDeae>q2M^xKAdlBf(#(R49u)@gFOsipU;|MSd|Ke&kWEIOgFE@-i$N zg|oDi8;Lk#yCh=Pxl>n@{Kz9594;F*k}|Y78o0%sq9Ix|-i# z1Nke4yGjD}yVICpt{)V0b+iiN4C69pe%e?@*0VM2P7sFU5czm^DV6Z>@bJo&E3d!) z#+^HN?%#Xwmwo9=U-{&dZ~4*}KD}?}^=t3nx&G;gcfa%7f5rFymS6V+-~X@vp6~n4 zAO4}Q|B-+9dwtLeMIUlgWJcU(a^pU=`oHu0%0r8BK=Ms|$n&U(lp-RQ3A7~@>p&AQE1 zER%V;thqWXtD`f>8cpsrDB&S;BMg*-^@|q~IqK`>&fQ3g_;m|0+0u5y>mnOpa3{Qo zL9!jUv#}SO?O1%-hG65Mf+79zFeoG4S)rP;dNa#(2$YaR$+6JRpfKS#0&J|jq6UA! zMLS*b*$8rE;n-KNRMzPsNM+ViCN9lGtC}}ZUZ}fgp3xXk$+kdrsp9iWv+btb5w=R0 zTYEraeGtcm@8Sk$m1zn6A_Z|{u8s{{uyw@e<&9fL>~ni9$g3P0G*52*iRH7rv@rHV z*g@n1n&QK;$$$bm2riT%b>*6*5%Oxy;vpzpC@*u9Vb#=&A!aeTi54P%?qz7}@ z0mn4eL}RAc)nJ#%HN!Sx`I+Zlr@Q7^&5(j)gUFY!JWq*TLAbQ-_EJl^IP;Oq<;c0S z42Y0gSal$ne{+}3RrI=~T}0Ml*6Rk)5rMaQ2~3B`KId#C(W{L>qKr^^A&TP31gXQ* zlA0$;tT0UHHajo^Uui3qOO8U8B#ru42p|fP#AzMi=Cm6zFJ@w9i)XAPREj)24JEOx zr{Wid6tQDyPjP1fL;b38$Lr45U9$p?fLtHWkF@LSo5EACm-JXb>H^O{;l8sTYlH~f6s6K-rw|x zfB*0Jsh|8~-}v)?`p^CNkAD3({Q7_6xBZTP|BwIa7hb&j@WT(O-j%DDUwHB5FMjFc zJ9lqv?;2jod~NU8^UuF{>(1>9TUm_MSChWSEFr?r6GqQ^VmuU96_6>cG?LU`WA2!F zuRzQga#p#C?QWeGyAwqNkD|50yWBsLTk(>=c6BV-> zwoGOexW@>s6@LF;P!6W6&{k-Z$Oq%F^%(W+bN~WV3WpJddkYxHHQN$7SRD8UdCRJb z(?F~&(^r?0=L7MDdn{bT>o0sATU<&^=E1Jq96gE#y5HRLl zb#>RZIkecwn|JPBzyBV~>ihS;{NCM9dG5adrT0GkN@gfCx6bURkIhOZ9b3rD@r`#f zj*Q4~%)R>RyRW=rGE^jGTn6HoUcQFWhLxXt&ZbeXu83SiFGqvO7Z09gZe86qz6ab`lrOe~k@?Bth1Ifz>39#+KdGkxQ5>Fk)Nw4xEzUfq|4aGXg44dH&K#$P)kS# z(d=snr>)a~oT7DG$*L}KPAh-aA4-~*d(4>WV(uyragw}QCTeLFG{DtfM*WxwMj$n^ zEPjt4Lu3??PxD8&Iyg?06NFiVvm;s_c|;BnFHgzqL!_pl7S2d7Sw&1HLBNAJXO{G||g<9RI!xkpbbP%prn8DQJ5A$yU>DbXVm$Bw83 zWOI(5e9AIgfjH~8-R+$>Uwi$Rf9=b^`8WQ?uYU2<7oK~5&7O=#5FUDH^ZeO2Uw)Qc z{IxHB{MC;?__nWp;g^5QCttk(?sxy{Z~6Lf_*cI0!M$g$Tzc!Zm%rmzee1vXLqG7J z{P>^v>p%UMe*W+Nz0dy7&;Ht9{X2j9M}FeNJ0CrHw}^@>WW9bn(D0Ue`1lv<0~_h~a@(W>b-$0Q2I zkuEVsGdNQfVti$MHeO(T9f}K+N)F zW^d@U?phq><|?0s z^gY-ukws|2Vz*_vqukWiR>sZsB5bx|TqDcvW|TP63Qa-EY9YecHxJEJGTMvCjwD|WOuI%_hHGa{FvpJS z!fO@UEI_I*_NnIkoym_rYM2v34;D=|+v)X9SJ4*4?pONBe-eS(wq`Aj~Uclh@!zIi<)RCV-8fRB1kdXQ%!n?LC2cN zfN8|on9CAbw5_HN$vE6^%bz4bIyq>Dc_6PyQXj#U1o_1eKS-lYeWvt+Nw`cDCtm`Z z2%3U(L_c=N0DVU6q8BvkxfNNF-1VN;24z036#0Y z^fX9C>Xn;b!Q{3eW0Q-POosA3E^-6NM~}E0t~cwdFERnq!s_wWBwr44Nh(kk5WAM+o!rpm|If5iewx)e#uy{=l|AU|An9XyMN^`{in}g*=J8@2bH|-UKp7g*YFy8U)Xk?JZTGYznvm% z47tV>irqC0Nq+s9lu@lD6-&L-V79>=i>=wi4|(Ir*r$vX-@kMFYhU`}7e09J?z`_^ zd*$Wzv*(UIb=;9D$@hHMumAHu@n?SQPyO(BeaEl5fBT&qZ@qr=`WrW|zkcVPm%r`f zJHO_m5AVG3&Q(U6YueWH2j|ay?cTj_{MeuU>=*vUFa96@{9pXDfAP=%>1V(2zy6c2 zf7f@J^YG|VmVr;)xpV95-}9Tl|F?e6Z~d^R;D$XS2)v`dd#@+SWQE7pgfaC zV^clqXguZ0(8|SK^&MdgkHC7M?Rz9fHUI?DcIEglSmfCV#-C!Xrf*$I%)4dtNxey#FIPhH(d7;D}7H3J2Qq|QJkuka=Fo5zSa;Ed2IS0WN znZ+!r9VO>bm~{Lgk=q|=9UNO+BRic3m4w^_m`?8kg%`HgR<|B=Yvaf_-XH9~`@xNO zBM85J`{Orneu%tpy?g)K+oAB__%8cuET*#N%t5BLe(AM$ufAa5_)T1X_Qf}^JooyQ z=U*izv+Np+>(@;{zI5p&Q=iOT;uu<+Q=DnYGZUF5NUgKrc*c%nR-IicvN^@)lZj^A zodb>O;d=a!S1XSL?P_+q|5TD^57bhx?09Xn#Y#fB-VEfB+@&Kr#lgnx-+hS}b#ku-GXXa3eVfA)X-*`NDI|Ky+j;{WtB|Kr`;uaLf@ zt2z1fsKKd7o_f@)#IRcb5L%B}y5#9cj?f|G-7{<)kvVH;ouUz1-`Lz{VRB((cYo*d z<-=zW51%=_w6}L~?X@?)_VK4*{pjPjuf6fyrK^`rMO@!_=jE6F_3!?UKk>sq_#gh6 zANiwy@b~>YzxQ|l%5VGXb5{-zc6KjaJbdMqm%jbi{PKVMcYp8q{pMfy^&6xPaZjYjJ7l8S2ffSP>u$d`B0Z<4Ouw=)x&_7(C1I8f_Vgz1%i8z4;Oz|NZH>8w9ojkEO1 z)qk~zbkd_uQ;=ZtQe0iHxhg0k+D(tA9C&BtFI$)0u&xx{reANhY$?Z-Fgq`((_7L+=O#=mp+}k_if*$ z7evOV3nJUxv8^oDHBFt{vYM%FN1G8ATeR-7MFcZ7D}vE&ZLbgfvX~K8{nz6W9Twg? zn4=Ygncfv^Gb}b6vKp4fybO!^pOm>sG}riQ=@32b5-U3yh3Yq)-(p49@=mNO2$o zt*)RUonhG^LPUaSVxI9I(ovi7MMiJ$TrD*llm!Z^{8~LO2aU+0e<7ioGDWl=Ph0fR zFlv3Xn&BNX#OX7^I!~PhdoF2LADJxk@;=O5{2ucm{%QL06r zw)ivSL(PImb(K#y{F|DyDoSQfLjA+rhBs_fH#DGm=Z;|`uI;gD<$~&}w4%KHlH!WW z@`{>jCqFs$`Ntn^jMbr`4}YvwPR|=Oti!ZMkiQ>JQ&BAB4{O`M-=GoKTovfsxWN@Z zG{O9DXfOt#h*qtl2>kESzD=t;MqM{;@?$SQ^W+0}-O2y+J=%BR&^5kG2lW|r$H-fT z4;uXF__1@}objJ0Ch|4kzD-*{KR-IkUmcw%j&9z+Z;$a~ZhiKVabJBj`;#}{oN&YN znUCE6+lL=bxapROca9x-4Yk~q8K3KvIypIIMFqt_fBE72ufMVJ*B=*uGV9e>pO2tJ zVUcT>|5ja97PDddReieg3YjbC3t84ji$z`bC1djtnd27in3V{)T(S&Me63NCS=WH0 z2#fpJhRzI(05`IIC(jX_su}~te*)$>)Lu4(mt{=?Wr8_$F|926vIgWWBH&h)mQfn> zHGvecVghK~DB!At%dw%N5a~wB2n(|`03$uc+dDU^I3pL_SZJzhpbJFfl;BmN$%lmC zOtoEsGH4)OW~D{{B|u(-FL4jJnJm_$BA_!s^aL#{$kSC$6sHoyv8P2XPKu}V|6ZNM zb7>HcBS1ayx)GYDc3zPr+dlI|Rwq{pN@Nn{S=8(-`$-DTr8a9<;y_uOqfUw#;w=It z6`Eo(mVIf|Sz2{oIc3I_V#BDJqlv>r!=mAmQY@m!Hg5ikr&MuHI?~a z0+YP_&&bLMAZQ4NzhIOpFvTw0F3CDuCdG^bYKs#eQ3hdBAhH{gZHK+P3WH|UI&Qt2 zI0;-7C9)F7l|+C_0FZ{}n9&%1L6tfViBqvk3bUX#%%TQJtva&T>q%{@4C6XTN)yHo z24uqo6*62iW;2E}Qd1S_BpPv$m!V#vNgr$&rv@pd>=~^RzCG-g<}AY10&fhvG?iQ6J@BMtQG->YEqZiSw+U;-ct@OwggRmz zupl5a1=IUnr1MTBXu78e1Xor{DQZx2x0OYVKp%Jn0&!0f6_eUjfGcsbcxaR_YCxE` z2*Rvp6Oj7VGS8zSz{A=D5|LZesWCyw`X<$^RVlXbgnD&6OOENh8LNrVTdv5X{MN1K z!&U!;#BLAJnNTK+e_oF-aO_WQtucNEun|XN-(Z%IMnr@J`})@R_x0)2rp2*cf7UqV zPH}ZrRZT^4Wp#y9Q&aQ#!a40avUaIS&#s;NcJ2J=Ll3<3=FD+p?!>Vkj|UF=y8Dh> zPsi*%e`5cO|9PB0D~!)5%ON2l_rt*J6-P^9Y z>Z2L2tX=d~=Go&|s^6RXT1dl2H(opF+ClvfuiH?Oky%<;}7m@d9zLa&667 zwbVnz`oontrUpH-K@#;=1Yo^=RJf9)SX_ZC)aC)Lh*6uXfJr|~ME%#t#AGd>4VZuR zTvs|wwcN7k&n(H5;?^F-APD=&;%XdpaZI97m8)S?QgjCfmf8`wKrUMzk%Fpg`#d0n zTLRyBl!CBm@y1{K%(JRo5L=dA>5rvzMT|uL2nlpp9Ig374QAIzpf86|P=D{igSzzX z!x0kfia7}K4jMXe$TdVb_^EIIAwByI?9q2XuYp6jq7)<6z0W|@VRfSJW$x2P0QJ>O8N+p)<}^&=xHiuPfzmFpC`V2vzSRe3`H$hj7dP z@5t~!nGl(;FI{(IFolUk03w(G1PpPEpB8~B(1g*If9L`v5=cQuwc*-;;&m97RWlOQ z#;e0Gw;oHZJIGUm@<@hs8J6oeW)hMV0!3)raEv@XA-Dw@z(pa_XhsB4tZ_l}SarGa+MTLd&&4;Vk-FM!SmmTXkC7*x25ZyL1 zGMp{4IA)}OpWZhPzv1dZLwa}X+%_a=Sl`|+Kk>vP_l~=N^jN$b16nkF=$4zGd*Fd- zk3IS7Q_nm;{+_{odg0Q+%J~+J8tFc3EO%!w&!!~NM}LlQYSv_M&%XbC3S!7Y@Z9-|v*A#a}q|-~$uFgPXqk?0sLo{m8d-|GWOD zC6n*DW79W_i%M&X%Bx?THsy*sq9*hIvblwWW>#hqnES?d%?d^S?_<52EY-(kEgK-q zq0%^A%N_zcJTe|KS&Z$PIbYdGlkMek2bF_&Td}<`CTNc?%sxWwcrUwbi8nPQg~CL{ zG|hCgD$599yS9_jaKi@5)P_BrEeqhj?Q;u}O;e_RW`qgI$SNl_I2*5xLDq!v4hE43 zYoL!&j1({@iAp`ghscbYW7kQM*J2%FvLqjaf3rp%{^^ zT`^JTz0J`&4GAJOSocVAyNv*GyCoOwnk4DgF;bed!UcyM_4}eMS&CHAf9V6Av_Rb2 z6)1xoou0$OkG<3+Y>jn3hF*tJqBZg%ruq2CJ zZN>O3i-VXjB0vEM!X&T7J#)l5af`F4Qdsx`Dfr(|wNU|(5rHd-qUAMi#PCaCSY`ZF zI(all7brw5E`0HdG4QGy=vkV|uuPy@0v)pfnWhOy8m&b6MIAS%EUyLF3R1tYSmz@7 zk5PkyE@kMs1f6fS8Bdd;O9avd3+lM#7NKTpppLgy65W?z@6aBKhvnVsZz10~Bw~CpBGUm8q0#bvD5M0LbE2-k$)Mi+37Aii*veR;&{8?4J~oAE@3HK7d-lEV6a4 zFuj;0_%0R_^}i+;PigrRXjGS_#$>TVkApy3g@yXJXv~>rfqwO`zN%M2+*!29%Hr~> z((1DEnqw!9{=Izu)JMi%)vx#_oBuAy}PGeK2z-! zPkru*=%~=^hY!IQYe?VT-8gsKH=t{qsH+F}pZE6bj#IXI#UCHO{`&jVr!V~At*y%! zy*FhFJ9@MY2pH6>oqJTR(PY1)a;-k<)>{MYj`&mP&iYU#HN z6Jz&mS~+LpO}*ZK>hZnbe70iFTL+Gv%PB27ynhQ@dWW$oSW8(v*r<7cPQEwiGh^_T zeMVe6^p0C^yk!)7{9cKv&8JB-@sy5=s>f=-uz&Wlvr|#T8p(<$RZ*d*1#Vdg%<^8K z3^Z+~SX{iki;gjOE6Qai8Wq@N=SN57XA{rN$n%1cqN45^phdY7Wihd`x!s zQ*_dnKw0BPG$?QA2Vn*>L6R=51xzF&MleWO1eOt8Tnc2>{w(}8%d-+0{u+W^o!9K% zh*@!NEe!G&N32Frw2)1ebb6qqSepUx=Nj-Qv?~F zg*Xv{iIGmP>}n5dS9`-`5r|uatJPo)StV8v>AVPgYT_i4ix|DI_i2gNx_h;HYF{Zx zpiN3i&-EL_h%8O(vsiI^3gQ6K`d}$;x`|2U-me|H1002deCP0E(YuB$hVroolsE6g z(j?D6BoUxyB<+QJehd3$Rr94Dq=m>lx%*KkD~{!#W!ayL{4uEO7pipqdW~g$QxkR( z5%n3#Cagjxzk$qd188mmG23g&L@?WkHmT45BYw>T8Pu@uMg+F#6xFP6pH^*K`LA6x zzZ%W#j6_A5EKd=g6zOcfR4u?tgsqY5Ao%r??DW7v_~unlQ0_RK#_- zXZDDgF!uWRUMbnN=fLl1pFf8M(h% zZV`8EeNOD2q%#LADl;!8Y`=G8-*&!@9vwM!^OBDb>|Ymu>F9+sN1mAYm|v4-xPG;c zYRf|D{(btg6zk#f_uYQ;P1j$49hZk5xM#-n|2#HnLa&}(uE61fX|7fgO<2Ro{1;o< z%NQ;j8>*%wN*N=e>o+SJYb$n;mH-^#Y%ARf1VD2Omj%aq;3=>+4I2HLL?lfyM5op) zVKm3CVK8R}7QwS0pss8}{Y04+c_p&2Rk4c>PH}DxWb%2ScoKHk@~skzc{Nspon1wS zsx(LwxTBKNUuxr!GsKWwiFCUGP0zNfy3#@CQ-_50y7I#~BZ;6n|)#@Z}O0M;v zTWU4|t`fn0S`5EpZ3b$<)Ra?x8aI(FD^8u(A0$cPEm0d^EcE9e8E-w%8Khcmrn(Y0 z5F3=a6^&SB5a8DMYh3oEi$j9!&dOB}6!WOt{LNUfzaI`rB^NRFu@Qd;l_yRqHhXjf ze|Q9`N1eT?f#Up#Sgmc(F3`*^hzIoDd&Arw0JnSh0a&5ickk7{N8i>Ry1`$}(Or7< z?$oU(!DfU3F$lIvVa(K=p=UgSO z@4>y=PaygHb3ajhe5?qynSfPpuTko>&kTJ0JR@3D#M7nLuknI~xbz}-+sb-#} zS&OE~@I;95L}qzbn94MP)$eJ7TYaif66E^r&nG5a|4lTm3?9%DFLA^Rf zu^+4Nr*FPenv_lOKH;Osv@VX z(m5J)c*c~6-hJue8PAQswtv)ZgWG;JXU4c&M)BA~uDtT4=cdekyqTy6IIov1$md=c;T70Eqx;z)w^>@_fOw`^zx}KS?P%< zPo5rk?|mVGzP-A2yS`-1Dsg%h<9sGd^!#hM4BeS9zCbHWGONXEsY!xD7+*Trow3c~cQFu9C z92+k)%X)Sa{@A*Ghit!T`*;Mk?!cTfrGPb>vN(Hd6VN=cwH(3-k!jb64547I@I}>6 zV-~mnm&lCU76fPN+e{~^%ENcvF#~wlnkvA^udp4v>pOwf`t!n+)!^P=KLv74KCEkgkUy93CR|IR9 zva~{$yfjsfc|S&EZb^i9rvJJsFh4QC<<>M`XiGrR2Ei7$E4MJ(6k$uzTfwmgB6`G_ z?xkrwHD#Ip8qbYMGfMdHNOiy?&$g7MF|~B5%Vuby9=fB7oLS z5gTt2aED)^sY=o}i-(5-3P6uH2YFkuhCf?Yhz;bx_1g0Y`d)JWY^dZQ0;V zqNQ^ygSS>IDUALuzf{Xp+ISRy*a4@katd0t+)`X0+_PPzGzt?%{SrD*MCirO=z8}3B=`3 zv3?UeU`nyQBI#Je2JGJqM-Z}tQb|1~NZGhU{-HZF+uNK2usBnrK3j4%Y|*4)cu336 zts}4R)9;>66t;4Upx=ZIC^&1CWbfQH$|MH84@67yq&Rfeqdw0dRv-hlAcyi~8qRVHT^8BLo)Ze~XaCH4v zr@G9kD5}iMNl!R+eB>I=;IgK%Rv9TRXH`}nM!_X_cE|@o?An{a1 zPU4$hyVXht~ z*0N^PTca&_C74|rJ=(yEyg^w=r^}GJHEoyLK)k4^-ue+RXERqFCSrjsk*5h&?NJh8 z5OI41D!0HbM5YpX?XtdD6;+QdSC{Dio5=K>N@#+b<&7EUv^LUVG}UtDi%SrxHfoD- zH5TjFmu&O_osGPrDSKBR8>5B7n#fhi&iWles%$kw5tD)4L}b5owXskG!c=QaN7Ajz zOw*pO26KL&z6xyG+C!=(%QrB*Hj(-E;LELJ_s(tFw}ZLtY1ytlaWO}?Zik0soA7qg z5$!raUiOJ*r)W7NNls0I!r^#9+g6h@9gOt=cX7X#W`9QWMK4ApwlzUy!CVLnuF!np z8q>rWsJUgZLVX~MU{hu!+91X)qZ3zxn(kz&j^RK?LLL1WxR588@z$m|VK=un29o09 z!!yX+w4iFKR*8*`#0dyOinCuPu9Ws~t!$67HyBMEImu(G-dUkz5A0bfo) zP-V?Z;qXQGNM}fQD>ngdEzz1IZs`IGuSwR;GD+I?^jTGW-h?tscwxm&o|+MpwYBgKy+|nP4 zlW(e>e61F|(c>|K8;BAN=RR6`#FxZ0nkm#B(*J z`59^FRxSJVKaY2 zF``$S4p(>Wci-?^ZXb5T&DY$>7GC$>dG-3gzOSh%s4Bet)|7`2Z~WaUOIiKnya{*T z6x6WZllR`~WF@Wq=G(!YB7XSnjcWQ|ku~?t*U$}ycInb3v_%UapNQsl7A=@vQ-cRv z<(v=R2+_>9( z>egw_zPJ%`WB?;7Ai(d7an*)aQ+&`|Oqpdy7z&_xqFNF_Fe4#HrQ;CG@-q&1VE<~d zFymPr8Ld-?L3pSKMTM}N0tc|OK$^cRIp!lUG&H(htB!bl$qH71cvzTCK|&UR3+RDg zOsWb-J!-FESCm2eV6a9@l}$CpF-+D6;g?%WbCh#5bpH^pE)zkjI8Xsrkgca43u>9D zRZJV*;H+n1)V~)Oqj<8HrY&5e4}^c3)15Y1)?}4)H5MDti5qk2JVCP5^6Y{bXxeNq z`mC97ja*#$U5r-zB33PR(p%E`rMU7c_z0m+a>YZt7K>dn60x{dWw>-xME|ve?Q~KY zdXfTs5#yIaw8-WP5Np3A(xVJkpM{^{PUe(x(b1>29~(uDTIxi>gSm zI2F2;Tg?V6w}^FvTb{xm#0t7sll-5Ds{Iu5LUfH7ZCNRbAYlC`)6;~0w@54c2S6e} zhZUg)tB~UIVkx7HmUp7xFmh!FOLSaTpVhnK{_$h)8#hK$>NT!cw=v#U{G!kkq#BX= zHBnpz<-AheWs8@m-!o!rK!!kWz4|N%YXp}mE{Sz8*7()0%XtieK$&eY8#VP~U&@}n zyIp(L;KBX-UNxvcr>@;T>gHBat=XnhG-BTXZHw*LL>Xt}N^zy&M3DL{BMRu!p*?GR z^DdwM;_bKCwdb}W*D~Y{>o)j{IiLOU#kU{NeE!JJUutqr`}1=Wax%}x>|48S<&WEz|FnPQZ?QYK z#%|ksV(XTaV@EFS+m&|mVCI=4S+OyBNhk8sP8DXHE6a#0&b(Asn2SfZICWP!)s;2X zl~vW%)oDoyhc>P{ykYs7ZGXpX`un@N^Im@B@h@I`W6687r``Wh_mI}zqe42g3%O^^ zb$Kc0ovQp}+n3%nIJ7MNP+rPm6k#j~!>;UBoS9hdR4iRE=kvE-*uP^Xw(FGGxTzB- z?f&EEcV2j?V`M_WWVg4qhZGs*H+3vI51($e2l-00_jn3wJE8a(bg~ zn=RJx7cfF?#eJk3Ih2(@#G*b;=`e&3NI3 zXPz20d~ir0d(Zl?JqRpr!udX-VZa^4Lvw;@zP8?0z70g}RmUyG8M%N=cw{=VLfPF= z0^WgmOz5x@Slgyv!Y>UZnjM>4x(M_=rfhF60+OZYN{BO1 zR@|U$amlg|0Kt&guuLV&O&-CZtP~c@GwBK@0jT>E7{9n0k!evsTI9otpFn>vc|X!~ z?-aAu0~QIe)ih#5u;G;#Xjy7f7BT3_m2Uu`34DR9Wr=#LdO9hXpv|odVMq#*_0Ug` zBn8EdUw$U>tfo2Tc!=Uv;7cxAFk*&duBs7xCcbT%UT&Z8M0+;_d4xxi@Z3U>TDxpvIUSQOP19Bj0|*UtRn)EUH-~A>9rFI z3ca+o@tpCP(Nacb{f7WGh>X&<_VA9F1%y56I@lsCxYV`1ZllJ1h(LYF%a||2wb&}H z2_y{=WYHEC3LU7&tN&UP#tVav!Hx>0wSR*c0qeLS#_b-r7B_jz<-x62+9Quzhk*N{ ztTyY3OIV(Tw=Ed8pGH+|if}7etxKLoQ%EE(omXQ55lfevHMo_y5dd|8ThQ93ET%Qv_ ze9_bE`S7TXIMn3Yp@YVazT?Ib1NZ;E^!VQG9mCr6jcE7Li?5YjxLD(qRy(;hg>mQi z{<8b81qb&m+qeCfqq|of+_`q+(&an9|Ka%RAJ4A;_T+{ycCJ`(aP3dATYio^xbDKK z-HCAr;CpHEg@X7qStnwO6XQ#h67w#_S7ayWC!H_NOeo5TFSvXzKluz$t0_$`%e`2Z zbJ?jV!KoV@6P!wicyV!QV%+)o!+S35-4?rb`}tjak8j?=D&q@VwjE#b=QlIn8rHFA zXw&*_LR!|p!e`o)iB4szQikRd-<~qC zYumPw!OuQ2Y43(rsb}^b`g8FYv!?fM71fNNtbT)u4~#u=IwtAt@xPZX8GhAZzLLU& zLmn7&*Sl}d_~?VzCr`SsL#v3OpeUa@{!tO(tZ~L-F!#MT>-f}V1XicqU^r+*=D0?N zLD9c-*k@%^m>iytvvdUdvMpqe?9d*0)MQ`{BO=;&YvLb*wePy&S51BP(Wy^8F?!T3 z!v_w!e%Qd_gL;j{?t@sC zvPn2-0l*oQ0i4S+D@*-mIldV4HYG{_F?!K}^2n7YcN^{YIgJjDuLA*L+>-4dJm>?RlY*PccW$6=v zTRuqaZOE5N04+)lwTaB4xmN9>Ag?-Wb;LoMy|V~-IB?du*rmhKtl2{{Scr@YEE~y+ zj!Yc*GR&D4%+(^m*OX!ga4;mAtoc?kt|)UEHc25)#1u>hQ5pR_?300?k(SZYt}?`` zA}oMYJGPWXbyn-NfnKUo{fN;_iYY;;L5O3fP9-uHT2*ZXBG#Nc{*z!qIrhsy1+~A@G5)RAPqc|3hRGpa$z6x7HK) z)&-DM==}(xZ}iY^sh=V=!LP>Edg9hYL|(ObPfio#t=c0{P+qKknP^wt)+vY#k4y^X zE#0lwEiR8{rUoyvEz7RR+k3Fb(Kq3lL9hzltBG+-SE*A9)@qtK0@R5B!Mb5h*M2%9 zGDzj`pFd)!6=tC2Z;c9RfCn}l^Kxm$CYOmb z1zhKfhHL>1ixtNhh5{PYXQ3=S9Uk4L?e*7;c;mm*1`Y0~)_!K7>$7KiK#M?{MmOiY z2KKpvzx-{>muLNY_y}`0Dtk^{*{lD9W5?Wf-PHrTMJ;$|T4Bn?aii{Jw%19|b*joM zD+`^{l(NEv{X4(kvF7u*OjD>le;^i6>q9!}5q`^}9xdHgDi_*Qk*>=g+04 zu1KBhOXTw3E4?%TJmj!%6VLW4Qz zArOejK8+xTv(CdsO_n&SaqB2?ijI&OJwjMi6i{Z?II?s5Cc%MG-MT>My3LyQ=+|e` zqYpj*{FB2+UW@h|5Wok3?5@D1m7ELH)UQ#4#sjbHwsslEb)_AO+0Z;Vz=w0j14Dz_ zbYzm+%*cS)R6oIx&cJeIb`@Hgf^6JTB1`uSSlkkfXg0#z#>fbZJRAEfULmHX5CNm& znuYzD^O_Z)f@!Zux6#%R?1GqF3&;am7rqpZeqq#J2~xXNSDzz6By{2cxrbldDH%_Iho}jIip+MpbTs ztZ)`1cAze9QkB{E2GNhVmW`VGv7;9jY*c2K$P@?PI%UjGn;!2kBXoj!m=NN5Y4NU$sp<}!tlu~ z8X009w4v36ktafJ!Wi|IF-CBU7{#nzZXv#moL(Zk5mRjpn$nzCZ>4qVfTEUywF5FX z!q*<^JIGrK{tr4Qb2*X{;!LlyNvd6~1zv^d%b1Xx zHigLJ@4Nf0nKOvUPUel9qbc8b!^m}i|JkuaTc(xm!;kvGu~y#D`e}c4%+cd&NGYzE zSAqgtc4*&5zUh4M!t$dk=7IU&J@u7Y%0!4J8^JdKv2t$?K{nTf6nFD z^CyqSj2V41XCCpu4eQoHLFSwXv}2BZ*tvBZleEhg{lIS0)1P_bhxxO=|7P|ti#{w& zPK-T#(n)6pQ5D-}vMmV9mv*oHF>cQ<@q2!ak6E2|c1!w&EvZK~WbEIOeQ0m-*^?P@ zr?OJcmgHP2%(zgJal9h$R7w8H+~h-eYL#bamlWjJT3Jd; zVNz1T<)pm0gq(!SH3dcGNy)kA4i&`j+3?e+gL-rd4{lPNeb#Y`=Fj_YkM;p2g*i@n z(HHaIi4ODY9v1Y%;}Z(=5~`~*mVN#4BX?Z?;=|+KeCml&*9^%oD5bgQC*B|6b4AzI zZTN)xXx7YcwqR%$ zs>%vwH9PAhGTVbdWRH$4{%>NLiR!>UTC!OO=R5cZhOw=*Ux2Kf0>MlNGcSzeG&9=V zn(}MLYKC;c$9N?Z#Le^sUUil>OxI?pkyNqH1by#^AYlz_||Ox~@Kf;!X-bZW<~PD?c5+Hp76vRna)sFH4Y z)wWc@J#;#Q}A&qxnF!b(HylF4`^y;w9c_iA;z*V>g> zLE7fGlg?|W>4_?m;!DOaCGDEU!}}oIl1P^2@_LbkoBUZ4vHGPd_X|ghODXhN^_!BZ zVIQBjUw?JRE7OVi`i3-Z(vnsmf9zrGz_;Hvia!>NJp7K-W(|oCc3t`-4*%@W26NSM zu71;I{in4_nd#?$_-=mB9$o0q3olL|b<-`ZXk`g-d1=+3fBe-kqTR4wJr{lc z@x%Au->X~aCnt_u@zd8%O>xr2nECVGcx&dgfEF?h?cXA#flreulb!*`m6erS{`zyt z7a#3dvwY9`rN<7g*|}j^VM06;xK4FVbw*xZ>P4qGDPixA>leR!`mZmKt^Iocns3kS z_&xT(+Vi{CChgggyk}R|v3;3w$1^S+&rLs(mwvcB=XiO}(VUFKx#=-wY3Hi*^Q+6M zDsr=nQ&UT`bE??Q(y7FIDnC0hEB$IE@hr(DQLI+2!gEc5cQoXZ!AGIJ`6D%l*2 zK2+7v6~`&Bs>#c%Dk!YT%BsxbQ=x`s(QHVPmyn!uIjJfwwIU_CD&=f-UK)~P91cdybnHnonM(<0d<8`ppE2yVWB9wqLL#btQx-b4 zZqJga!Pnh5@rft;^zF_faoNt4vn0YJSo;|g9KoD2CvH z9=iF-XYOm{-=Yr3+=RDjre5DrM#-y32w{@NjxDSSmj%&kuNE~K&!2z0pQ+~PK^|Fd zfQHIDQALHDTDj?@;22{y3Nj2e?pp+sLTBOvTvx5OTZ8YvuLgQrq%Et5E8i7TgLcxi zKf|#x*ZjC#Z!Qw)q_SI}tj{9fMbOiNesAz}V#Fqwpy^`lMVqD`Ye+tv@fV$x{(N;U|K}yk@X#-BX{W1IW$rZE{uq5i}{7` zJv*9^xnq_r;W%yHT(*=+-K5#1PSyo`9Gle&ZG)=Wt{D;msHw(=V;gL_8nA#Vx%`jA zKxg1Uv&KwEI&8IJS-|QYY!L&#R+fh3O8`w=k&O%y3X&`GHmbW$K3?m$hx_VbYh$&0 zr9uW<>3^*e`yX&CfM|mLNKoP0*pl{TC82-xHpXeX+YKUy zY$D#lUlm53+O|>@BtRJpb}I$F6caHok>$;3mq_%;sG5#2w}v_E30G^8M7M}ljTcWEjhn>RaWB{ zUBQ&>w3lB&gKzB9Y(VFMCw3mGs;Ev&Nniihs-<6l_RYL^7Jcx_iY4=Y`t;3&-MfT< z$!VyW$2R`BYT>k)UuVW|`u@c43l9CU;Mm3`v3pje>|d9B=JOgpeG^ZdTc zXZBn=za=GZOLl5ZR?4A-i`$bEcIU<)Dow{qT!n*{Q&du!pI26xhqo4#wqyf;LT8CTeJ>&e!+u^z5XO z%ND&=lb20ffBms(=8LcI*}8Yam~p{Pnz1R_EhBIK^S5PZkL)T;k2`i`Yj6PWc@2X@ znUfF385Ihn8ne45!Jur)GI4S4iej0PxOidaWrm zZEQ88G&~igG6k$q7CNh*YqSNp7PzHatJ9Hn88P;Ahzx@5lTy|< zsrxjE3`DH|#kK|tp)fi!fmNIg>4GE$tBu~=3NCdDn8A|)--dmNj9rc^DGZV_uBzV@ zNChPf&VpC32NASI?4Pn;{!&CJZ|XA@YG5FiO0*|(bO|RmOK4($&l>o$&^D z-kAy!Gf8Pq$9X`&ux|!-5_wGOLHVLZf(vC4Bj9jpP*$p1Srxj8EkccGxAy|Y8?LG50B(80dWw}O7 zlec=Te&RG{W$nFLb9ghGm_3m_ou`PtVT83dF7n7SFJRNb`ZeWYuD)LR74*-^IzzQq z8@KY;qByQiWL}Z|71@i$w8NxrSXjvZ{d*sK`0<9=ryDfparndQ+__^~M#8PP--Kk{ zhE4Ful0Ru^-Lz>KpSZysz0^$iMZxq@4;(Y@Hfhv6Dyr3xq5XUI?1&|kgA3<>ws6&o z4Vf8bz^$;bGPlgRlvMWoQ!n?3?tFO5y3C8QFF*UxYtK$tvt<6#rQd!3-MsVXc4z0L zz5C7_z71Y}=D)|c9pyL%h*pwS#5Li>i66fBWbKci?^yNit|g!6$DMXkvw!+Do4xJkYvi)^?)~}%s2Ze>Q_b>6NR?(DU ze?rF4P&{G7aRrOOAt5Nd4NFJawKyOo+CRJQq4&4Nh#W{|7SrP3LWD>IH$kVi(?xQVbnku2sV zxCMz=Ah9;4#geS=fjY^uO1K(84a%khlOlmrvlYA8s0j#I5owDKdt9jnud3>bE0@j` zi$X1Bg94lS`%{oZ$&K9z=!CMLOfff?!$3_zhRD=L7U{Y%2(DtXLkQ`-D4Rs)vkLN> zqZc@~UzuCJ0Z8Z103zd?he1Q8Fd`!ul<=LFUA6*4(UGyha0_-Bc38*692vp9w#;6Q z)*uS0l9xDxl|flXEwvVsC^9H$I+!!WdGKlzd8)!7=^?CnMlp!0qpXlcY2peHu_2eM zCBi=7%YZL{QTSQh(2R^{WY$c>D=7@`k`BcbZ4BTvBy=EM(MFuIJcTt!TynLT^~&OI zHw-bz6QKiiiO$&Pht)&6a78O8LU9R7RZEnDrk*S5s00C#R2iM4)Xx(4qe82a2h@UA z)*ekBg_uInUb{VoJ)?Zm=zF$yME9g$`fUIrT}qlT1>HV)UXiCi9+;BIlk&W-n7pW3 z!O}e`|9K<1u&LGkWyh{LcjFIm*e$ zr+!p;+u{939N2S;$=0$`r<7A5AW@lv`dOKunw6CpcY5btSM|ECV>E{i_vzGZ%A{+5 z`+DvtbKjjj?xB*)MdCMAQj?cfSe{ek79U*sS<<%U`A0Tp9^R3Da(ltq&H1M`Uplfa^W>q@#KRT2agLK+ zl7AvKb_?#!d3mSf&TNIq#g~sd1*vS-QR5U>mgW>@C88HsmS$DUismAxG{eccSXGeX zROJ-`<^0P|VMcMr<$~;t%Dke=!u;IS%f;Cl6~zUZui-BsmYHb10%TFOxvi+GEGW)8 z7ngPJf|FgSry&=f-L*d9$ex(Z8@soSXi>K@GssK6{uJ9aX6n}_-TT6Qqq}odeFLBO zUVN^mx(pAl(f#@d)Vt!j2X2qqvHHE2Ug;m*v3p3%_7N?oO}zixcizlP&aN&j+P7s> zVRkMb2WjVzz4XKr&3qcP3U0A<+1E~G_T|`PZ~b>Nt3y}-6%pPBeS$NgS_TJkZU#t2 z>A)litcf!K0z}bU(R-uY2S#qj`H%&%h*D7=6CggW(``A4?lfOgd2K=uFw z-$CJFp>0A!n^LS*P;0Uo)E zA*fZHi6pe;*0?6|z;HRFK;5N;q28T0EJC^k&#fAwiAz1Yut*rKkToKUOAg*E{ z7){x*tM+Zt%7HQ|1a_+7ie}9^_keIYEfi-${_X-oLfLMMDPvh&%vOCAVXqQE&pz9_ zxEK|fp^P<6jO~VCc*=Na!>J{b!kB5Cl`&IQT^SrTBEq8Xc(hky$RKQ5j0~Y#+^y4w zUla34s-jJ89`Y)SiJMZ)Xl!OmuAUrKl&IO5rD*leDk?r~*arf}1+LORwe<2_G)iZ{ z1c{9HHsBi?NVkqzpG8=E#T6pUS}pHZ%mPX;?ghsLRsEz(+6OmRyCEI16zdXkB>&Za zWwE^_$<;t9n{qXx@y^{Int=3E-vg}>A<#psl~+L(`hGke z&}XSF^H2QWME2A`Vy&NmN@&R5k3|0c0YF3Y6KMA=*94@LS_ULbe<07}>z|f&jNg-& zLubjdZzsy4!gTK5EuvK<>6kWVzyI!^zpfC?uBv*+uAOqGSo229fBp8$FXv*l_HT(p zqaQyj2NXuP?bxMDx2vzdHaMu&gX149E+{{I_{_L_CrzLHVy`|u=|aP1_5Jz24hinn zqwlDzN3K}3H1^QBn7Ec*`R zB_7y!YR#h9t&0!+^>K0L(fo{~2Ujn;ynAK&$z5rOcjTXoadP6Tvy#)(FQuP32%yVy zvRDJStzQP!!N@|2ni z9Jvc?iZUv)Q=Os$r>vx=Qnu#6zFnGET3%Y=RN>c!3s?>uEH5k-!?i9_rsuV}j8cpa zUX+%Ra_C?|!nx|A^74WTPQ<{EEGM_{h5>^^S~MQkr$c(|Np$32zWwB$K|`J$eOtTG zmbhv43=XVGyu`N*J7$MBYkb4N?mx`s*o%rU-v5vdPg}NVe%sK&?>zbF-etew5Ptsf zW~T&;xmeL(f8~t`f4@OJJFr-J^)H|A{(I?r)1M0qYRP^@_^UPx@ye}-=}?AZKC zFzNzjX6V8r*h>>FwRMY-;1=Pbje~-)KPR7!si?}WafL z7f!7U4+(4)7Th+dB@~XtCzef zpcd?MH8D#u0gIC*^?1JrsF}97N)u`)2bY%1Ek&ruxjcnnGC+ z>^_d+m@AU74^SGBg@gJTLkd+9P>s35J8(>pj{&cvmuSASzE}c0ZP3)$v({KQqb9Dm z;_gL3YY|DQ#E9Z3_@1Va>CMBKpsoGYc?z)WcO8RjMLvr35bOgJklaQdX4$$ojxrqKCxk zu>0CAB3ZUGm1c2kMLfSk6VI|HPa?Vc?P0Z9BG=lt?t3F$Dz63Z|1UAA$55+9+&;MV z*N)iRa4RPwFF_3#yyx1I))V9rkhp&2Aj?0Q>t->O*E%5`(~lhfPOvabx=)?XUAqvN zUqIg1*LU{YZ%=*v=>uD~vGylBJM+nBpJGuIdrcfUw9VhI1q+Jtm*DrpF3tJBk&&Es z-|pILZp_Tc11ksiA4^TiEXv9GamnIN?W5Ya3K=@6-*x@3y0-tYC7*wFdhdZxKKS6H zS?|~6SDFH8b-lzEQs)UH!}MrSHcd{EhXtWr-*A zj{I40ctc9e*5b>tHI*6g^zwz{xktA+8As!f@7TU|^_D*t9slc__=B6$&g{-Sy}K}O zUrlmMQNp2$ycDM-yEredG%v0?=R#%HnbMrN;{247TztKf%Cb|-b8}?wxSUT+2tZ!0+>&ULTU@<>v)0Sc1N2pT%;>Clb|C8+bc+zQH2uXr+oKxBI;V-OuP0J%ga#fVG? z$l?Yl13tHD;i-bjpu^Py@@_-`%o9=!2(e zN_y2^DknppTJ>vdR63>~A?y-quf_U6Z5FA0rJyI*)>Y}das~e9DQfrDE$9l@j?^w_ zlBCd2dqz_15!_1T)fsv9L&Z$-@EFeGUO-tMU!Pk)HpHt?W>P{!LkA5R+@VuP>PDC; zo6O|Y`E%#YnEX^lXSmJ_wHE4z8)p zO>k<`L{;gflERDCMM>z$rFm(YiE;U<$t5|N)flKbsRHx6D#G}l z$<#0_unfeg$wV|urjc2jr50@7kSx=xE{Wa0vmhl+A4Blbcyh36I6Hhw7VV}H-e2vaIkJ0-nO;uqtrSASFq4%h)kVK9fM;OTX4)|qS~t=mta)AbH%o)L>4Hk7G_Jd7`GL;QUqbNP9ho) zr&=iHO%%^AS9P^{VOp#K zF~Bt_lSnRsN1)p=HSB!b1m-Lng;H77B#>4%($!e=4p zG=+pWY$~T8Vxw06GKtLDh%&9rtu1b1Bm}7*)m2qmMoWSRvZ_29kr~nrpcEl)!th7#7Ul(h=E68A9LFr*MNG0PQU0IDOiFvzQc8VF?2hErx1 zRv=niToJJGpNQ0;-vFS>XoUd7J)a6_PeKjpv^*xa?lXcytC=e@f=DF2O0kDiE~b^m z)I%AoP+F|z8E#pgt0|sZ74mKt5ndXvls?F#scD+4w62{**sb4EC?Xxx3hmLDQzr4B zO7vB@O;`<5N;}LiL&ctg-c~HjB>#C#`wZ}++>`6=4@KNSmNh34{b{(h-@@9p`sJ#9 zkWUWJtCinZ;_^>^6iQJE&%*BlOwo~t3?25@+CO{r>W+#;w^5EJO?tSjtSmn6+{5?Y zwQ2RrjNJ5cr#vD4+|4&$dvy2KzkXZJ0ye%un>CZwcKory`X&wiE*w4URF+j?$gM1^ zEGfuJznqbk8J7?{Y5b(=&%BUzAsKBiJs~wCGdVXu_Vlrhj&o_nkF&p;H97g@4*0r# z^Ivn`cxmOg3-+#FabVTDs`PBUmXGfJb?fh6oZPYPa!kBa>{R1gg=ZHVR1;xF7t$3~ z=beu&xOg!?ExRnWydbZpxZFuOac0Li?_?iY;nY-CmKEY|ePQz#8HfII3X`g9vJy_O z+q>@bxb>f(`0M?WltbvzX(zT7AKRFJYHw-mvC@Q7n8nMo;uDT;%#1%+oO2RWc45M< z?ARUIm-eQ|?afO#T$X;)Dahc^<;tR*;;hutoYb=H^wP|1=C#3Y8HRY~j%AY&&)l)8 z#sXaM%L*!;Qx-?B68yZXsw?snP92Ope8efLpa_aK|1Ry{J$1re?Sq>)uUn^GK;6RF z13$g~>L)M1^yKJqcMiU0@;!Ha^!oE@mtwwr@3nWIo4oSt1z*p8=f9I4ed+#(et!3} z&u7jXJ@C342K7C-Wlcp%ChvB`>cvaGd?WeP9$sJag>%>R?-%IXv`cWy3kP;MHKoV* z?P2nlZT8znw!yZ{#``#{+M(?nb`uzggI3VhgZsVq>PutBj=t*Zp&YV2Z18|lSNETA z%di(F-g5W#okkCccze?DC+-~8sdZb_YHZX@A4i5ow+d++9?~W>v<<70Ap(A4Z2lh} zfxB#LTH#i3BWFdi1*Pc7z{TKY8WTlWhefWCNQ|7qXtipJ`B&JaM;^!$tuPHbGi%IJ zI*YCi@u3xg2)E=?_8%3smYEt5yDnY^Wl?_BUJZpU&MlZ`ikVwiccwPfUTUUMuxqI0 z(YzlC(xT-eK(6Y-;1a)aF~4&){sL17Xu(a9XID*`Tn+N!0oh$)tAyrUF{8Z6qa(vX z@W;zE;BrfxU`=pEh5)+_*$Pb$77;cO6Cof#Fn=weY3zo-vX>_OwWUvfLEJWN5kN3@ zE7RTe%c5@cBbs%ZI=MA5(~y+EDF&E!#Omkqy;VVw(k%QTu3#&EWTudA@ zngL?ytj=AsJv9LxnemXppNP@Z9WZ6|Q{CByT+$H$RW`2YJE)g&K-M%3% z`QENdg-SHTy47j9QWd%0PYcAjmA9c^IG%>A584@fE^4p}xwT$-3M$!oW7eWIVfZsK z_q9;JG^*@F%&kzn?IX9|U|XU}bxF>_jZ6Oi=Hugk?@T&&sj{THyb#hcty*1?jq>YMmQ-b4 zNL%{B$Cr2QbxNF?EKXcf{UD;^| z%d<~ZWF5~>JV<+mNhh%{_Zp5ZaKMq<+_Cn zzk2(F52w%kWcq90y#FTqqHJFA^Y-7Du(2lxOveTx>~d*5NgOPPpyr z&)%P&mK0M_nwEO`M9kj5a7sUWa$jXZ_JN%nH~zWw*~iCx_5LeW#hFfN!PJKyVkb{o zKFqO7XvvYS&?9gjz;|of^OL7OJ?X(Qqu8pn|A3x1-7@L{{@r``xI0G7nfc_G?>+O* zGh>#%|HA&CK3e|4tlrVlb$y!qhDEcD19QaeK;AMSl(QN+mJz+OaRA;y0qpn17>l0U zf|DadMNP(Aj4N?a0bu>qsF;4+enjG~P(oD`r2k>N64;-nk< zkRcdA5FMKCSt(=O&lVFS}{s{<6xItQ-@s&i-7Cv<BSTf;8$q$sJyx10*KEqN#esKIdTRsxz0>r#V~6#g1d zfg=PoB3rfGf?#H=Ez54Tl#r1u5R9>!2#H)pm<31bI4x>&6JJc9LTAZs%u|NtDOW{hekrP5$Iw`Qy4OU9VMg}{T zXVkTkmIz{KC1&C_MVJ&rArb17BCwuO8wygh>g=AYN_rad&T-Qm{gE!&xUF;$x-sDE zq_BM<{KHePLPwW`BN}K+p2d6qh4e(#b2?0abavRQ3mf{iEgE&%WMr{+t!dh)OCsYn zBg;#mIU};xAZ${|(z>SxqqDaN#f^``DXGpwF-l2WN;g5C_Y1+gWR3oBo%T+=^}7|y z8}N40Q$#DYI9Zk}o&P^iO_t}i3m`pi&+?4gG3k}`SCwKfd_6^EW>}uheSxG)Da5=F zWsge@pqcL>Dd>F(X2iDNjuph*9yqxB;fdo#Qa-C1`ua7!f9$=UWj{f!QqAkmpp4@w^oCUjRpheYAF%TvEIPDi?wPe8 zT-dy@Jo#{O(ix{L+eyE0Zr|GD8<)lJT2`4EUxVtKaG)gnXi?tb>axqpNk_7i4iv;4 z$d5ld! z`I}ZOd-*?4?ppg>O%Y4BvHs^I9N%A<&Su)x`#1j0hG@P``~m}8azqp>q}sHJ9&ly< z+i$+wo>_`_CR6KZXB<1%H1$bJG}enhL8t8rOjjVT*O%a)t``q)X(k;CPHr!agFu}(9IEN4zN_r<*$ zEf^x(P6!NWd`vQmLOr0&6@=Mn%-}|x6a*M5Nn})X2WlB=8T~N&son4Y;p;sB<0`I( zZ38yOxLfXo-a`!~0YXh63E_o6NFYE65Fm629Yg5dm}VPr?^U*J*_P#|-g}o;t6p{` ztya?RYIoJ8{hu>ucP&W1-|ytUbLURGcf~w&&YU>|#UQLG01c^?O3Fd9Q3>hLO|z-0 zP{9{&0xa@(uNf$)#{p>TG(jYcaxEyMx9OF(7#zUOe>^{FT{4K2EB&Vk*P|gMlnHTA z5g0L<4r@*dQcB<<|BN|PP{JiiXltNgBsfD$wZ0-AqAq4Za<5 z%^Z9LV2!riytSDUgqFhP6NUalq_F82nS);dl=FZ3$D=A}3i2mscG8hQ+yU0Rfv?EL zd{p^clL&;JF=NKu`E$-Z`wY%Ey!P5_{`}`V@4N5bv(G-0c13VLX3Wm0&2KDtnOh3; zk5e>{J7(<0%>Jv++N({V3pEv#y)XaGh|l;F*sm_JokRu!Zj zZp=nt);C(akQve0cJ~CVR&RD(L0|Vsr>zwn=f#(J?3gl-0A=Aa`*&N1eNFD3 zPPezt-gr2%J|$zoH!{*0XtTP}X7~5IDihb2Brf&WA8gIq(Urf+dSG$t#y4}ey_pyF zZsnd&N_M>GDcf7?CEN)&rd8mxT>eUX0XrISd;B-&u_0!?e#m{ zZW}JIJF3z!!1grc_1Y>%x*CVN9Ya2kztib*w)J|9>rN1i+8LK1Mko$id7;S$${{q1 z-Ix3m^);DwClo%xYI8DLau3&}?)JCT8Da3d2`rG z1CHS@&=ii$o&$No^t5@1(DOum7NH5MiU^6+sd5ug2CTxbIkQDgEsLtMnnZ+M!9{8)P{;!L{~vA3&+Z6T}lq4`9!G4TN@2F z;;Q5{Hr}C#U>8c#NvY6G5{M8~p5>9|3=8jci9Ykzat#4Gh*TpfQwdF|x?3wWug~-& zxR;rTR-&&@St0~wtG>Q`0b`&g+lQx3!)LXU8puwVf-EfhZRvyAvrIuDvRMumEwnMf zmV(CI8d4(*BOr53411OVuI@)>#~kT2r#Ob)R8F;sv;>8+iohyXtE?UTbxhMp(_~}+ zGDPOekIwW-T&bVLCinR`ujcSFdW9VqTsC5|Y(oaVXszKgQZs;N>;riu>bR;bR_T%} zfebp}%hkxQjP1%V1+k2SjId%YV-(sUKnRW{MTS>`jJ8H!O`;YQBAYmm6kM>ELX6Uk z)fCr2DOyCI4427IoD9Mjg@Pi$M?Aq4oMuR;+funfLTC>4Zm_&+5@+gM%%KH-0 z>(O-6s5Y(F;KvCv+SCAYf=1DXSI3Q0`?v6yq&8knnlotTRzH!pLOh&)v~{C+kheAr zU~N1Lv6vM8EZNX>?)m57>xMbz`4^mX~-Fb9Ht`^43i&T^-FJrLL|bX6IUP{JWcf|Hys!G*?z&#ymWL(baH$V_ivp zrqfzJ>~594#%%QI;?TktykE99x_qs;ryMTKw&cad6&y)Cv?;1Qv4RESo~~h5p+#lu z!TIE{xY6(r_jLr^b-qCd^kD6Hge%LhbveyVxz!^$yRy{xSsO>1JFsqMdsLuPigQSl zJvX{3JJM5i#9fg%RF~3`zpJBgt2KIQ@%C>ld%sIt^QJ9+RdZ^jHEE|UKd~`2xwE-( zWRR8Vwu+3M9y?ZN-7SszT}@dwYihTFLqkBZ>~%w*_TpTF5!n0#>i`sJVGrbe>~ zoGw=74f8t!JXRckKcP}?KdY+ z8hi1Xr(W^%)8|Y+?(8|pFh4tK+G&`RJ^R-OUcB%2cOUyxZ)?#&NAZ(?x#YS_PkZIz zzph{OR(nN4puZ*|^6Ot;cKVpHoWnSK^3P^LUeL@z6^z(K1k-coKvKqMhH=mUbf7AO zHoI9F;RR>&4UrXXh)aSzC?n%GuojvlJQ`1o2v*45up5wtZLkgO1d*VS+GI*#h)gM! zG?ijNIgC-0Q;fC9g9wayHdi@|S#;E*E*_0nGar!3wUiW@Ctg66zbfR?gef90)i}ga zn2JanBC>XXE2RX)M!+OLIl;XIF-;e(HARHovxMf{f?Xk?+4Q9RS?&dY{~JZr+V*&HQ?aTk*%{L;*4rGRYHXF_Cl zKN7_saC~g1Y~sAhRz}#Grp-bs#j7#hGHU2Mk3&nz+kK6HW?I`TvZ)Sgh5q8 zNE?g>TZUx@+fWL50ILL~a-*r16hvtwSP`XK@-rrf=>Ul|CrvAD;e|pi*qmvR`~pM6 zeToPyLItUf`sr_o=TdnPB}9yVl|0%m5e+}N)x@JMh8mTA3XejIs`9R)unqTwhUtkm z$CV(RAB9&<BsdaQ@L%5f6egR2wP!HT1Wp8{7to zY<@WDYEVTGZ1;b+E=&0Q3$6(3NBGg_GJhM?FF&{Wv4S1b$(3lc*@MPGd}C)uOh0MP zYz`!2;>d9gbOx(C<^~sEeDMb#zP;eB*JJ@?^0X;aCM{U-;yw4=!PJLUm=nfN9zS+s zMpBNopzMqPd{~~AmlJp75&u-g~tbs-3kU{)>m)vU&<5tkpY(zp{DMr+;Q8W^&(xrhS{y#Z%$pv^zz zX9ahFvdvYsr6~skRq-A9dm1t}cV_K!WbX189`u#R4%cJ{8cGMNvimIw?&AGT8N2E; zcUQ(oHYUfmm84Z>$Bg(Z1MV7@R&mtjY$@$-%I@o^@N`x8bTqX$l(A&Y`Z5y>SF^=g zU+Sza^RzT@M#hLNZ~KP)F0ZSDV<|*Y0D_HWb&$X2R^#ETLYdbQS0Vo1mP(7QG!NY} z#$I--wWGYStDp~Q|A%XL zFI!x+f2Y5-uCcQC@Xqy{mVX==X$}NB)+}2#XWAULHgj0y$@3%5K7%oF7ROFu0Ka?P z>XYWoJbmu;bLU2!bJCm(PC0k>gow*eJ+CIOu&q4v^S2&OJhUDMXz_`WQznj`I(`iL z@Kfea`sB@j4h5P6{VjL>=_;nE6Xh8ClUTDB#K5)r^F&6TJ=?g65T?Kv;f~lK>GJVB zcnw2CR1%~@WKnb*`4=LCZ(s+V8S1$eIhqW{^jb)5#Aj}4F;s~`TQGxENV<6x6un^t zFjZJ6M}oHzl0oTdm@Y1}q(7zx>9z#3-p!#2qiUcM<)$K-wkX05CcOot@-;#|3`2@i zM#~+PptT{*Mm(IKnk5+Eq5vn(ml0MgEfXOEi3)LqVs2Hc zMHWU!4ONxPL`*iZ#1`3EeRdfNBSFiWvSGJm3vt;LfxiM@ej|d`OzTASR*7tQJ&&zV z>{aJ2m}||!0UFsjwR7eiwj^WFg=h?sbu%&`Rtd#8@)hZr5fUPkhjG&I`ltc6j?9dQ zN*UrlFo*X@sXr2Tjqqlp2Mt zqw!HPX0RSZK!LKM8&}HG6N182)3rj1XjMc=3D#iVP70z1HZQJ~XhC@$I2!5?rOcfy z*J?IN(IkU!$*JN0(SLz*s5WZ&NuW#gK{M#@7;J9T+l6b;-twAYk$=KuQ=t-BdN_*a zJfd=bWs~2$k@;N^t=V2Id$o=^j=xFv)X$nF=F=#rIc4CKQ%}bk7l%Zc2FBn(j%+wi zoH=XSo3Fq0>t9_#I)Bd-PME@(iH|>f_fpr*H2nO(;#- zRhJsql9k}diM8kMb(S6)Y|eC-AMP$qa9QH*#k*`}`+DrE>UsgX=Kpp1nX>xa@29WRAW(QQmeJdSzTZ+%c(Cb=xDBK zZ??AC8vQ*UekKvLS(V0jipS?^b2w{jI0X`YwY$Y7M(Gfl&)X{#o<47Xcc-Vv?`?0a z+_UP7`>y-NKX3eH>gE-xdm~HJIQBH*E$RpeD_j#(0aDFr_4Lfuy7e z6pZM{m=84swR7gcYc=2E3atcQ2)P(z&yk}F1i_kUAWkJ99?%EH>RBflVN-0$!dO>1 z7c44mm2L)bB5M=EFqI|dkgpO2C1vTMBGqIIirbnJbn&LeRkhh7DWmb2KAS+C zst}5`Gm>JuM2g~=2tm3>e*DIW?@jq*VCIIOUQt;aF&Wz}B{J@OF;!Ln)u^nAz-9Q$ zQPNMXk#35?!`L0S(8)9z6`T$PkE;4t$9DHVPN z9uX&yS@RRu44ST2X-I=1S~vsMDgiY`@|ZKdO|kR4UWw! zdH9RThn1ys*eWwI^!Da^>MNT^@&jqmKGQwvszElTSQOTmWswDo#AA=+uZ0atQ~9en z>#VcRJ@;JxRG8tggIF}<$DJU1R8F10aozG?Ty&wBfE{z<#0eZsJpO{yE^co_1w7Q( z)lr;=%8_lnt#3X5FGQ-U%;dK6!i<>cEo)Xr@7f(3wKsLwzJR|M`OapmX{;-kUBDvN z4&ukd?e258`>X{u`1b$}KtZlP%(SqS9>8f=PuCzeT|<6|%(22EK8xWNM$0UH3WC|_ zG}4DQ*Du3-uWM+idvM6csSQ+xbQvg5%c)IHprK)8K<`kG%V8-@u^imgd}w`B!lstA z9V4zHOUze&4RL6sTMFYFlVd9OZm=9!*HIqZRJc1o_Ipdh+LpXMwvxkLRfpOu_7AmJ zc)bp1SF@!g(bbR}=x=q^7xi}8(WJXDXN&C3?jPh^$qGB)7Ck?o*E7HpK(Et}sT(dw_?}`Z&m*Ql zu7L(Cu(mmBN~_ZkRK&-Y$L{gs7R=Y(*~I=bFBQG<lD-2_a~Sp%gAvcxQvh^r{pNr5j!hE~`T z8|POM)C}Deh|;30Q;S*{C=)k9SPXv^!K4#(a}#U@b~Mc+?6|0eTSG}%1ty|c@31Ee-0Ghh{EHHRef>o8w3vNLs>KFpSFQ^xv>%qmKgAL-b16>!f%YfVr1L0LgI zT5GCe^V1yM&0ulO5Jy8{5UblRZWVl*4v`hgAowRiMp(l&25O^n4j%Wwoq|RYz{m-d z88aDgB`5JPkxdPxgs3em&xk?@zZ}QRNJ|k4Dv`CU6gLp(R$Jk!9V1=25QLy1QIJ-w zKbk(!CCx_8qrq^KoHVDr5a@&^06{cBD^rA9;SQiMWZ@bH3ULvBM^!>ks5V4Ek>I3S z`e`_&t!NKBgK)+ocKub^iYceKq-{MoXZX zr8$AAnbL%6Ag3mZ%&T*Q&?CvO9g~IQV2ctlGa_a?ya+{(Rvvtv;1r1B(v47uwKmC* z=9wRc{Y}TBI>4-MJWIo%76e~**=5+!vcr^8d;=VF(bg3g{+wN-o7OM8^pXpX8FT#9 z$+&|$`RZT&=7KXX-X9$!8+eBMJ0MYG-QaLvMR{pLbQDMZ4tF`5%8J>lyl?ZSjD7o? zE!85ij`Y`9OR6gKd)@c5qYPoLy{gUG;DHnziX@(_*|p>w>cbVKpWVb_H7)e+ z!6*q?QT$w^n)bF2J1c#I9Ri$ybI5NOKnFSkJq>;lv2kqK+8*e~63o+S$?3{H;Hyas zbXH+=Ra<S5M)dpiak)-Fq?x3)0Q z?dY~u3wBXfbD)*I4mt;hJpQ%@j)3fNG+~`4KD&^E&4RKJ`Nu2{i_ahug}!-xv*gSt z^ooNoRLw&j9q_TIv7w_Pcc`sa&aD{s^tr2@b`Gejpxu$dZbwVGAE%%L7`h=_i{7B$ z*+*H-&ZT|!JJYn81&JgszmM?R)#hrfwANPS)#N5urDZts3IZE|?)g}M9 z>((dlyz{#SZ>;(Jvv1!2=;mKv@yqkieBk#tUc%8&GbY`7{WZ5=ec7EiUjF>!e}C%X z2mbk&yB9q1#P6@a`sZiO?(th4_M|`j=9CN1jd=H!e|9%!(u058{U`J?=bm#`#H6vm z{pFc;#e0^0wqU{u$K%@p5a5_%-YKUC!7A>KaU5X)H+zCFWIz$dFfIE&i^J4YqQYr>y_-lpvbtpoUx)n$b~1XRRD|!)ShJ z`Nho%P@=U~A769Cj~tp7=5HwV@DPIME;QB09X}B<8MzqkG&WtR_z1|tP#9jrXyKzV z^deCM!=^Hki1JaH$at&l;5jMeQ3^9!s(c#8E(IBBb?hY%PxXeR1s%|<=J77e(GD;l_l(Ifd4yCzWz9wYWt(p!}uO+3gQ zQ-gLutD?B}Q!9~ch(`)#8q&8Qr;<*J8$CAZ`c-*BEv}8~?1d{q`opZoEPQK6uwC7s0W)5FTlrLkZ3YsB!HG~!EHAH01CRdq#1a;&RHLS{58lZ%rAKT`KR_rMcS%s z8q3RTD$5z;dwP5s2ci@AZm%!N@!0CxYArQ68J!kuv!xMVkzTxQwlxp+`+9wy=}GZ5 z)mHp(y6j!Otn;cxR(KOGi>DA4A(t!25c6qqkBP|^IEKy*mX7vHHzHnt+aN?1uOMu9 z@*w@m%JN`~v$H(6yE@y`P%!K$3fQwMV!kepT^8^cjs%+e+Vg!?iLQdEx+7a1Ns(1Y z)&yMD_Oinz2`kI?EzR5dWzoh(6+4%7=I-vTNwlSJtB6_dEs7hc&vE7*Y|Gl+RdJZZ zj;%$>b;SvTj`Ch-ZMSg-(wKLkCT??kcC4?ixT~q8)6p{2>l+;GXRdZa1Gb#|`ue-OS+);sS^CX$cir*nGfz}!r?V{H zR$IO3?bkkk&lQx#_xV_@iZq zDf~s$Vxdr>%sR5Dpy!Bei$_gvb%+jwgYldUVzmXEWbu)G%7PWON&?wH1Y|&J%0eQT zMH6VSL9;TEaX!dXv)M{Xr?RIK7Lo!@I15-cnA_l@GwG&y@YWQR%trVXN7msCA)p84 zUqPoaVWLhNr8C+zV5ME2hEXf87TRb`{X8`@0W~j|M;f#SnNb)+IKGU0rCFR$A#yRW zBk=XaQfrn-#74<1gjLS+t+a@Iu_@ETuDU>^<}n1HMjni*gr1Y+C@4@1l(_|w6uo!DxDw!cv=dCiME$V=AUi!4{QB4-GN7(wt;a z6#kgVn)pAj^6ut4NLP*29IRQ}8dbl%h1tY(v>uZu*sD?BS-T{k;>SVSGGeuS(or>Q zBK4qj;6w2@z$D}RbI)t2sr7WY-&*hvGo^WRPd@F`vyMFm#fVJCI6{$m$mGcrZ@Kvf zJRZLK!V8!D{1@yQz3P`Y{qE*lzF+(~jBKha*%P^G`}(z+ak2KsN*~@ZFhatYMP?j3 zZmRN(xjidx$_$gXMR{K5V{pMQvx91WBOjz0mhxs`Ne zFlB`(?_R`GG%5+<4VrRRxr>nZ(YwhcA|>+W8}cL^M6#V-Q8 zIoOIrF2sC}{mETjW!4(Z%y6qx7I*N_>J@R3kws}~S@DMwWA<{8G%iz$vv$1x(A|H( z`Nmfs$D`Z-?cTbHw_|2uR%e@c;ewZo__Q}{#GHy&rUjxQ*I|upCPgj)>%dhX2gadjKcy`0gadg5hqa| zp=HI@rwCIrurtDoh-VCy$)J)NDNvsJ4f}*jN@Nt&1Rd~I9;Y7i5R`p}hKlUqvM*pY zToy7Cl)OM0_Ms%#L<3pTWQC0+e)2@oT8YfS<8>E;bM}e*& z4yV%!Fg2W=p&vm%4n!kS{Z2Do(SsEE0%TSelK~-=k02J&Xqb(*8Ppo*nL=~EiTS)z z54V6-p0ah#=%OLA#sRd(1=e_(4(@LfSvV*Tn@!4EDh%#WH|UR8VpA3nE8O`(0Wm)` zdFUQyU3@N?mEl8Ej`{og_hR@fCs2gp zs}dY3iePRvg$z2(f>8ob70M(k#Q>-V;2M|`$gpp_ElgJ};C1PHMHiff%8%Z%NLmm{7@Yqp{+NMZY zWY%sReXkIawK&(KkA4itaE5S1=pWJy1Ut-x!b}N*AJ!0=3Xj%lh)ib5ukUM~n%4|! zMZ)zGcLIDf?wW$*FBFu@VD>3`6xAMj|i(n{T)q>{T(eGO%=A< z(&0W9fcqV`x}^QPQ)0H3<;Ry~#pN7`?(Oo3n$&}}RiLW0y5H?^IXdli_STYWyibpK z13iubPEi!XdJzeYP;9iR;6t>~MlME)O-@AM=FB=zjZ-wSEFxn7#-WXM9(P%TEiY%J zk0TJQ)oz_@eUUbF2wPib&*X&)@!ubn_H`eZ7Wr_UGvUO$Q`o-1JYdey6)gReh5WB{f z9pkA^_0^;}EQx-9=g2^BZ+n%iwy>or#amO*Y036CR`xrahJE-3kvCz5+uy}ZLN*ii z_V^(3a6iXXp|%b#BL8IflZwNT49&JElkvUT)#)rP?rCipcD2+Lq*f;G=(1+H8;Ts3 zWPFv_n~I(FnLbxZkE`5PpW9fK)Zby{JN9{;9kp5RnsQHb6Kl}u&I2wFXGit5cJ|sm z0nENwzVBfjd6)yKSf&>l8ThIYZ5EyRU6=*Q(l^TWf&Pv*d%qXcaidP};~Z*#b9woj zPdxJMUB4^kPhzlX(AQL)nefqTul@Sc3okok*7xr&*t2%^LwDV==$%(pH^?T0`L1VI<1o0MPj+TJPPynzJl$FRJGQgT8MFwgT6~s`Cz~~7j z*#`_SN;Kk(w31?$R>^EC9*aOkJu)JjbRrt3QGvCwA0uaY zF#pjAuh>#4kE`jha4@7L#`IQO7u->QX;nYbPLnA0 zC~B`Y7;wZ ztwb0v80Jq!nqY2XCLuD@IF@xe{)528dfb;^eKR;T!U4o(^`5ssT=Lk1k4bIPUXbk5 zrcA%#y6X|$AG-Ii3tss5HyE^xa@!pMlwqH--C5nj0fkML>dNdqM@bb#z`ojT@9DJz z+`%D?a1n<&xe5NVWQvt_x5&j}gM@uGQh0a3Q)de}dxYS)^@89SJNW{G9j#S~F?j4k zTV4_Qr7I;WP@5L0$r!1~bLXbCr)=-7Nf>O+OWpNtdtpp%^74Xx%UY6m_2lesN!(DI zy3?Ar-Ig2Wt~lZ>JYYSrsx@&-PyT`C_$|#xHq`81R}j#!rIRg4!+tT!LW%9^wD~$5 z=UYZ!uYxdeupY$>a6cWoNi+E%@E8FF0%~JKST>wObQgEJYnD>0ejOhb0iGp@S5Tq z9>VmSFD%YH#h_h&sa^zgkg=?z;V|D;K@+)Z%xaU-10>OFw$$ z+jn35{gvmQdGgeMKXgk`%AtGjy?xAaV`fe|X703c_^mnbjM-OTdcoKeCXS!NQMo5$ z_r*vafl(IL)cD?l}Ey(*|X%F z<%oGRC_ZB<#bx<&7AGo-o|eoiEmE8cSqm1!A!EiYKoq`<5fLfku_Q!EL))MiERBa# zRDe~~nvKtDI4vvA=KMt2T??ZX(@@yR%OXb;)H;hqLv|6RwKgR(R|4==GcCoj;#;~m zbG8NLlKU3x6w=MRZEeF7Ex$Rg+_8@7!D5RK*P)ds8*p69`i}jZqq0r(*b`pb2X>1 z!-%(JlboaBV(JX0m^{HIR4ENE!T>dBFkmr>X3ij;G?mMGw0Uc}C8DyYiEHP%Y6dFQ zk4zq-ysv(L(!;&g3_O*3Ob1BO&o0?UeFtu}^Wm40{)b4a??StL6S?Y(b2S=!y&B#b zDcEq<5IG3ta6Obg8Wi_PzN0>)Hl%&ihO{irY7nHVE3;#i$U(z$UXb4%L&W*>PCtI! z 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

OO%6CqCLV!hACyVtLX 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

q31&$FsYnOi_j>1`Z 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≤8fF*ukwIr_ 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