diff --git a/apps/imgs/Triangle.obj b/apps/imgs/Triangle.obj deleted file mode 100644 index 34917b0..0000000 --- a/apps/imgs/Triangle.obj +++ /dev/null @@ -1,5 +0,0 @@ -v 100 150 -v 42.3 50 -v 157.7 50 - -f 1 2 3 \ No newline at end of file diff --git a/apps/test_triangle.py b/apps/test_triangle.py index dfc7eed..9a63b14 100644 --- a/apps/test_triangle.py +++ b/apps/test_triangle.py @@ -3,140 +3,146 @@ import torch import skimage import numpy as np -# Use GPU if available -pydiffvg.set_use_gpu(torch.cuda.is_available()) +def run(): -canvas_width, canvas_height = 256, 256 -num_control_points = torch.tensor([2, 2, 2]) -points = torch.tensor([[20.0, 30.0], # base - [50.0, 60.0], # control point - [ 90.0, 198.0], # control point - [ 60.0, 218.0], # base - [ 90.0, 180.0], # control point - [200.0, 85.0], # control point - [230.0, 90.0], # base - [220.0, 70.0], # control point - [130.0, 55.0]]) # control point -path = pydiffvg.Path(num_control_points = num_control_points, - points = points, - is_closed = True) -shapes = [path] -path_group = pydiffvg.ShapeGroup(shape_ids = torch.tensor([0]), - fill_color = torch.tensor([0.3, 0.6, 0.3, 1.0])) -shape_groups = [path_group] -scene_args = pydiffvg.RenderFunction.serialize_scene(\ - canvas_width, canvas_height, shapes, shape_groups) + # Use GPU if available + pydiffvg.set_use_gpu(torch.cuda.is_available()) -render = pydiffvg.RenderFunction.apply -img = render(256, # width - 256, # height - 2, # num_samples_x - 2, # num_samples_y - 0, # seed - None, - *scene_args) -# The output image is in linear RGB space. Do Gamma correction before saving the image. -pydiffvg.imwrite(img.cpu(), 'results/test_curve/target.png', gamma=2.2) -target = img.clone() + canvas_width, canvas_height = 256, 256 + num_control_points = torch.tensor([2, 2, 2]) + points = torch.tensor([[20.0, 30.0], # base + [50.0, 60.0], # control point + [ 90.0, 198.0], # control point + [ 60.0, 218.0], # base + [ 90.0, 180.0], # control point + [200.0, 85.0], # control point + [230.0, 90.0], # base + [220.0, 70.0], # control point + [130.0, 55.0]]) # control point + path = pydiffvg.Path(num_control_points = num_control_points, + points = points, + is_closed = True) + shapes = [path] + path_group = pydiffvg.ShapeGroup(shape_ids = torch.tensor([0]), + fill_color = torch.tensor([0.3, 0.6, 0.3, 1.0])) + shape_groups = [path_group] + scene_args = pydiffvg.RenderFunction.serialize_scene(\ + canvas_width, canvas_height, shapes, shape_groups) -# Load the obj file, get the vertices/control points -obj = "imgs/Triangle.obj" -vertices_tmp, faces_tmp = pydiffvg.obj_to_scene(obj) -print(float(vertices_tmp[1][1])) -print(faces_tmp) + render = pydiffvg.RenderFunction.apply + img = render(256, # width + 256, # height + 2, # num_samples_x + 2, # num_samples_y + 0, # seed + None, + *scene_args) + # The output image is in linear RGB space. Do Gamma correction before saving the image. + pydiffvg.imwrite(img.cpu(), 'results/test_curve/target.png', gamma=2.2) + target = img.clone() -vertices = [] -faces = [] -for v in vertices_tmp: - vertices.append([float(v[1]), float(v[2])]) -for f in faces_tmp: - vs_count = len(f) - tmp = [] - for v in f[1:]: - tmp.append(int(v)) - faces.append(tmp) -print(vertices) -print(faces) + # Load the obj file, get the vertices/control points + obj = "imgs/Triangle.obj" + vertices_tmp, faces_tmp = pydiffvg.obj_to_scene(obj) + print(float(vertices_tmp[1][1])) + print(faces_tmp) -# Ternary subdivision -# Move the path to produce initial guess -# normalize points for easier learning rate -points_n = torch.tensor([[vertices[0][0]/256.0, vertices[0][1]/256.0], # base - [70.0/256.0, 140.0/256.0], # control point - [50.0/256.0, 100.0/256.0], # control point - [vertices[1][0]/256.0, vertices[1][1]/256.0], # base - [80.0/256.0, 40.0/256.0], # control point - [120.0/256.0, 40.0/256.0], # control point - [vertices[2][0]/256.0, vertices[2][1]/256.0], # base - [150.0/256.0, 100.0/256.0], # control point - [130.0/256.0, 140.0/256.0]], # control point - requires_grad = True) -color = torch.tensor([0.3, 0.2, 0.5, 1.0], requires_grad=True) -path.points = points_n * 256 -path_group.fill_color = color -scene_args = pydiffvg.RenderFunction.serialize_scene(\ - canvas_width, canvas_height, shapes, shape_groups) -img = render(256, # width - 256, # height - 2, # num_samples_x - 2, # num_samples_y - 1, # seed - None, - *scene_args) -pydiffvg.imwrite(img.cpu(), 'results/test_curve/init.png', gamma=2.2) + vertices = [] + faces = [] + for v in vertices_tmp: + vertices.append([float(v[1]), float(v[2])]) + for f in faces_tmp: + vs_count = len(f) + tmp = [] + for v in f[1:]: + tmp.append(int(v)) + faces.append(tmp) + print(vertices) + print(faces) -# Optimize -optimizer = torch.optim.Adam([points_n, color], lr=1e-2) -# Run 100 Adam iterations. -for t in range(100): - print('iteration:', t) - optimizer.zero_grad() - # Forward pass: render the image. + # Ternary subdivision + # Move the path to produce initial guess + # normalize points for easier learning rate + points_n = torch.tensor([[vertices[0][0]/256.0, vertices[0][1]/256.0], # base + [70.0/256.0, 140.0/256.0], # control point + [50.0/256.0, 100.0/256.0], # control point + [vertices[1][0]/256.0, vertices[1][1]/256.0], # base + [80.0/256.0, 40.0/256.0], # control point + [120.0/256.0, 40.0/256.0], # control point + [vertices[2][0]/256.0, vertices[2][1]/256.0], # base + [150.0/256.0, 100.0/256.0], # control point + [130.0/256.0, 140.0/256.0]], # control point + requires_grad = True) + color = torch.tensor([0.3, 0.2, 0.5, 1.0], requires_grad=True) path.points = points_n * 256 path_group.fill_color = color + scene_args = pydiffvg.RenderFunction.serialize_scene(\ + canvas_width, canvas_height, shapes, shape_groups) + return scene_args + img = render(256, # width + 256, # height + 2, # num_samples_x + 2, # num_samples_y + 1, # seed + None, + *scene_args) + pydiffvg.imwrite(img.cpu(), 'results/test_curve/init.png', gamma=2.2) + + # Optimize + optimizer = torch.optim.Adam([points_n, color], lr=1e-2) + # Run 100 Adam iterations. + for t in range(100): + print('iteration:', t) + optimizer.zero_grad() + # Forward pass: render the image. + path.points = points_n * 256 + path_group.fill_color = color + scene_args = pydiffvg.RenderFunction.serialize_scene(\ + canvas_width, canvas_height, shapes, shape_groups) + img = render(256, # width + 256, # height + 2, # num_samples_x + 2, # num_samples_y + t+1, # seed + None, + *scene_args) + # Save the intermediate render. + pydiffvg.imwrite(img.cpu(), + 'results/test_curve/iter_{}.png'.format(t), gamma=2.2) + # Compute the loss function. Here it is L2. + loss = (img - target).pow(2).sum() + print('loss:', loss.item()) + + # Backpropagate the gradients. + loss.backward() + # Print the gradients + print('points_n.grad:', points_n.grad) + print('color.grad:', color.grad) + + # Take a gradient descent step. + optimizer.step() + # Print the current params. + print('points:', path.points) + print('color:', path_group.fill_color) + + # Render the final result. scene_args = pydiffvg.RenderFunction.serialize_scene(\ canvas_width, canvas_height, shapes, shape_groups) img = render(256, # width - 256, # height - 2, # num_samples_x - 2, # num_samples_y - t+1, # seed - None, - *scene_args) - # Save the intermediate render. - pydiffvg.imwrite(img.cpu(), 'results/test_curve/iter_{}.png'.format(t), gamma=2.2) - # Compute the loss function. Here it is L2. - loss = (img - target).pow(2).sum() - print('loss:', loss.item()) + 256, # height + 2, # num_samples_x + 2, # num_samples_y + 102, # seed + None, + *scene_args) + # Save the images and differences. + pydiffvg.imwrite(img.cpu(), 'results/test_curve/final.png') - # Backpropagate the gradients. - loss.backward() - # Print the gradients - print('points_n.grad:', points_n.grad) - print('color.grad:', color.grad) - - # Take a gradient descent step. - optimizer.step() - # Print the current params. - print('points:', path.points) - print('color:', path_group.fill_color) - -# Render the final result. -scene_args = pydiffvg.RenderFunction.serialize_scene(\ - canvas_width, canvas_height, shapes, shape_groups) -img = render(256, # width - 256, # height - 2, # num_samples_x - 2, # num_samples_y - 102, # seed - None, - *scene_args) -# Save the images and differences. -pydiffvg.imwrite(img.cpu(), 'results/test_curve/final.png') - -# Convert the intermediate renderings to a video. -from subprocess import call -call(["ffmpeg", "-framerate", "24", "-i", - "results/test_curve/iter_%d.png", "-vb", "20M", - "results/test_curve/out.mp4"]) + # Convert the intermediate renderings to a video. + from subprocess import call + call(["ffmpeg", "-framerate", "24", "-i", + "results/test_curve/iter_%d.png", "-vb", "20M", + "results/test_curve/out.mp4"]) +if __name__ == "__main__": + run() diff --git a/color.h b/color.h index c787105..2cd370a 100644 --- a/color.h +++ b/color.h @@ -7,7 +7,8 @@ enum class ColorType { Constant, LinearGradient, - RadialGradient + RadialGradient, + PatchGradient }; struct Constant { @@ -61,3 +62,13 @@ struct RadialGradient { float *stop_offsets; float *stop_colors; // rgba }; + +/* +struct PatchGradient { + PatchGradient(const Vector2f &topLeft, + const Vector2f &topRight, + const Vector2f &bottomLeft, + const Vector2f &bottomRight, + const ) +} +*/ diff --git a/diffvg.cpp b/diffvg.cpp index 7346d24..fc10401 100644 --- a/diffvg.cpp +++ b/diffvg.cpp @@ -1490,6 +1490,11 @@ void render(std::shared_ptr scene, bool use_prefiltering, ptr eval_positions, int num_eval_positions) { + + ///////////////// + // Setup stuff // + ///////////////// + #ifdef __NVCC__ int old_device_id = -1; if (scene->use_gpu) { @@ -1519,6 +1524,11 @@ void render(std::shared_ptr scene, } } + /////////////////////////////////////////////////////////////////// + // IDK what this does but I think it relates to the prefiltering // + // TODO // + /////////////////////////////////////////////////////////////////// + if (render_image.get() != nullptr || d_render_image.get() != nullptr || render_sdf.get() != nullptr || d_render_sdf.get() != nullptr) { if (weight_image != nullptr) { @@ -1533,6 +1543,11 @@ void render(std::shared_ptr scene, }, width * height * num_samples_x * num_samples_y, scene->use_gpu); } + + //////////////////////////////////////////////// + // Think this relates to the actual rendering // + //////////////////////////////////////////////// + auto num_samples = eval_positions.get() == nullptr ? width * height * num_samples_x * num_samples_y : num_eval_positions; parallel_for(render_kernel{ @@ -1555,6 +1570,11 @@ void render(std::shared_ptr scene, }, num_samples, scene->use_gpu); } + ///////////////////////////////////////////////////////////////////// + // The reason for this is described in the diffvg paper // + // I don't think it's especially important for the gradient meshes // + ///////////////////////////////////////////////////////////////////// + // Boundary sampling if (!use_prefiltering && d_render_image.get() != nullptr) { auto num_samples = width * height * num_samples_x * num_samples_y; diff --git a/poetry.lock b/poetry.lock index 52126c3..fdd8e63 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,15 +1,57 @@ # This file is automatically @generated by Poetry and should not be changed by hand. +[[package]] +name = "appnope" +version = "0.1.3" +description = "Disable App Nap on macOS >= 10.9" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "appnope-0.1.3-py2.py3-none-any.whl", hash = "sha256:265a455292d0bd8a72453494fa24df5a11eb18373a60c7c0430889f22548605e"}, + {file = "appnope-0.1.3.tar.gz", hash = "sha256:02bd91c4de869fbb1e1c50aafc4098827a7a54ab2f39d9dcba6c9547ed920e24"}, +] + +[[package]] +name = "asttokens" +version = "2.2.1" +description = "Annotate AST trees with source code positions" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "asttokens-2.2.1-py2.py3-none-any.whl", hash = "sha256:6b0ac9e93fb0335014d382b8fa9b3afa7df546984258005da0b9e7095b3deb1c"}, + {file = "asttokens-2.2.1.tar.gz", hash = "sha256:4622110b2a6f30b77e1473affaa97e711bc2f07d3f10848420ff1898edbe94f3"}, +] + +[package.dependencies] +six = "*" + +[package.extras] +test = ["astroid", "pytest"] + +[[package]] +name = "backcall" +version = "0.2.0" +description = "Specifications for callback functions passed in to an API" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "backcall-0.2.0-py2.py3-none-any.whl", hash = "sha256:fbbce6a29f263178a1f7915c1940bde0ec2b2a967566fe1c65c1dfb7422bd255"}, + {file = "backcall-0.2.0.tar.gz", hash = "sha256:5cbdbf27be5e7cfadb448baf0aa95508f91f2bbc6c6437cd9cd06e2a4c215e1e"}, +] + [[package]] name = "certifi" -version = "2022.12.7" +version = "2023.5.7" description = "Python package for providing Mozilla's CA Bundle." category = "dev" optional = false python-versions = ">=3.6" files = [ - {file = "certifi-2022.12.7-py3-none-any.whl", hash = "sha256:4ad3232f5e926d6718ec31cfc1fcadfde020920e278684144551c91769c7bc18"}, - {file = "certifi-2022.12.7.tar.gz", hash = "sha256:35824b4c3a97115964b408844d64aa14db1cc518f6562e8d7261699d1350a9e3"}, + {file = "certifi-2023.5.7-py3-none-any.whl", hash = "sha256:c6c2e98f5c7869efca1f8916fed228dd91539f9f1b444c314c06eef02980c716"}, + {file = "certifi-2023.5.7.tar.gz", hash = "sha256:0f0d56dc5a6ad56fd4ba36484d6cc34451e1c6548c61daad8c320169f91eddc7"}, ] [[package]] @@ -208,7 +250,7 @@ test = ["codecov (>=2.0.5)", "coverage (>=4.2)", "flake8 (>=3.0.4)", "path.py (> name = "colorama" version = "0.4.6" description = "Cross-platform colored terminal text." -category = "dev" +category = "main" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" files = [ @@ -338,20 +380,62 @@ files = [ ] [[package]] -name = "filelock" -version = "3.11.0" -description = "A platform independent file lock." -category = "dev" +name = "decorator" +version = "5.1.1" +description = "Decorators for Humans" +category = "main" +optional = false +python-versions = ">=3.5" +files = [ + {file = "decorator-5.1.1-py3-none-any.whl", hash = "sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186"}, + {file = "decorator-5.1.1.tar.gz", hash = "sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330"}, +] + +[[package]] +name = "exceptiongroup" +version = "1.1.1" +description = "Backport of PEP 654 (exception groups)" +category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "filelock-3.11.0-py3-none-any.whl", hash = "sha256:f08a52314748335c6460fc8fe40cd5638b85001225db78c2aa01c8c0db83b318"}, - {file = "filelock-3.11.0.tar.gz", hash = "sha256:3618c0da67adcc0506b015fd11ef7faf1b493f0b40d87728e19986b536890c37"}, + {file = "exceptiongroup-1.1.1-py3-none-any.whl", hash = "sha256:232c37c63e4f682982c8b6459f33a8981039e5fb8756b2074364e5055c498c9e"}, + {file = "exceptiongroup-1.1.1.tar.gz", hash = "sha256:d484c3090ba2889ae2928419117447a14daf3c1231d5e30d0aae34f354f01785"}, ] [package.extras] -docs = ["furo (>=2023.3.27)", "sphinx (>=6.1.3)", "sphinx-autodoc-typehints (>=1.22,!=1.23.4)"] -testing = ["covdefaults (>=2.3)", "coverage (>=7.2.2)", "diff-cover (>=7.5)", "pytest (>=7.2.2)", "pytest-cov (>=4)", "pytest-mock (>=3.10)", "pytest-timeout (>=2.1)"] +test = ["pytest (>=6)"] + +[[package]] +name = "executing" +version = "1.2.0" +description = "Get the currently executing AST node of a frame, and other information" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "executing-1.2.0-py2.py3-none-any.whl", hash = "sha256:0314a69e37426e3608aada02473b4161d4caf5a4b244d1d0c48072b8fee7bacc"}, + {file = "executing-1.2.0.tar.gz", hash = "sha256:19da64c18d2d851112f09c287f8d3dbbdf725ab0e569077efb6cdcbd3497c107"}, +] + +[package.extras] +tests = ["asttokens", "littleutils", "pytest", "rich"] + +[[package]] +name = "filelock" +version = "3.12.0" +description = "A platform independent file lock." +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "filelock-3.12.0-py3-none-any.whl", hash = "sha256:ad98852315c2ab702aeb628412cbf7e95b7ce8c3bf9565670b4eaecf1db370a9"}, + {file = "filelock-3.12.0.tar.gz", hash = "sha256:fc03ae43288c013d2ea83c8597001b1129db351aad9c57fe2409327916b8e718"}, +] + +[package.extras] +docs = ["furo (>=2023.3.27)", "sphinx (>=6.1.3)", "sphinx-autodoc-typehints (>=1.23,!=1.23.4)"] +testing = ["covdefaults (>=2.3)", "coverage (>=7.2.3)", "diff-cover (>=7.5)", "pytest (>=7.3.1)", "pytest-cov (>=4)", "pytest-mock (>=3.10)", "pytest-timeout (>=2.1)"] [[package]] name = "fonttools" @@ -482,14 +566,14 @@ files = [ [[package]] name = "imageio" -version = "2.27.0" +version = "2.28.1" description = "Library for reading and writing a wide range of image, video, scientific, and volumetric data formats." category = "dev" optional = false python-versions = ">=3.7" files = [ - {file = "imageio-2.27.0-py3-none-any.whl", hash = "sha256:24c6ad7d000e64eacc2861c402b6fb128f370cb0a6623cf796d83bca0d0d14d3"}, - {file = "imageio-2.27.0.tar.gz", hash = "sha256:ee269c957785ef0373cc7a7323185956d83ec05e6cdf20b42a03ba7b74ac58c6"}, + {file = "imageio-2.28.1-py3-none-any.whl", hash = "sha256:b9b456146aab459e648cde633b81bf487eb45248948f79c033e55af3bf1e6d70"}, + {file = "imageio-2.28.1.tar.gz", hash = "sha256:5db5087be5c814ecf7e2c7d30a1a15c97eca97d8c26f31ddc54d767d4a43bce8"}, ] [package.dependencies] @@ -500,16 +584,16 @@ pillow = ">=8.3.2" all-plugins = ["astropy", "av", "imageio-ffmpeg", "psutil", "tifffile"] all-plugins-pypy = ["av", "imageio-ffmpeg", "psutil", "tifffile"] build = ["wheel"] -dev = ["black", "flake8", "fsspec[github]", "invoke", "pytest", "pytest-cov"] +dev = ["black", "flake8", "fsspec[github]", "pytest", "pytest-cov"] docs = ["numpydoc", "pydata-sphinx-theme", "sphinx (<6)"] ffmpeg = ["imageio-ffmpeg", "psutil"] fits = ["astropy"] -full = ["astropy", "av", "black", "flake8", "fsspec[github]", "gdal", "imageio-ffmpeg", "invoke", "itk", "numpydoc", "psutil", "pydata-sphinx-theme", "pytest", "pytest-cov", "sphinx (<6)", "tifffile", "wheel"] +full = ["astropy", "av", "black", "flake8", "fsspec[github]", "gdal", "imageio-ffmpeg", "itk", "numpydoc", "psutil", "pydata-sphinx-theme", "pytest", "pytest-cov", "sphinx (<6)", "tifffile", "wheel"] gdal = ["gdal"] itk = ["itk"] linting = ["black", "flake8"] pyav = ["av"] -test = ["fsspec[github]", "invoke", "pytest", "pytest-cov"] +test = ["fsspec[github]", "pytest", "pytest-cov"] tifffile = ["tifffile"] [[package]] @@ -547,11 +631,83 @@ zipp = {version = ">=3.1.0", markers = "python_version < \"3.10\""} docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] testing = ["flake8 (<5)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] +[[package]] +name = "iniconfig" +version = "2.0.0" +description = "brain-dead simple config-ini parsing" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, + {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, +] + +[[package]] +name = "ipython" +version = "8.13.2" +description = "IPython: Productive Interactive Computing" +category = "main" +optional = false +python-versions = ">=3.9" +files = [ + {file = "ipython-8.13.2-py3-none-any.whl", hash = "sha256:ffca270240fbd21b06b2974e14a86494d6d29290184e788275f55e0b55914926"}, + {file = "ipython-8.13.2.tar.gz", hash = "sha256:7dff3fad32b97f6488e02f87b970f309d082f758d7b7fc252e3b19ee0e432dbb"}, +] + +[package.dependencies] +appnope = {version = "*", markers = "sys_platform == \"darwin\""} +backcall = "*" +colorama = {version = "*", markers = "sys_platform == \"win32\""} +decorator = "*" +jedi = ">=0.16" +matplotlib-inline = "*" +pexpect = {version = ">4.3", markers = "sys_platform != \"win32\""} +pickleshare = "*" +prompt-toolkit = ">=3.0.30,<3.0.37 || >3.0.37,<3.1.0" +pygments = ">=2.4.0" +stack-data = "*" +traitlets = ">=5" +typing-extensions = {version = "*", markers = "python_version < \"3.10\""} + +[package.extras] +all = ["black", "curio", "docrepr", "ipykernel", "ipyparallel", "ipywidgets", "matplotlib", "matplotlib (!=3.2.0)", "nbconvert", "nbformat", "notebook", "numpy (>=1.21)", "pandas", "pytest (<7)", "pytest (<7.1)", "pytest-asyncio", "qtconsole", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "stack-data", "testpath", "trio", "typing-extensions"] +black = ["black"] +doc = ["docrepr", "ipykernel", "matplotlib", "pytest (<7)", "pytest (<7.1)", "pytest-asyncio", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "stack-data", "testpath", "typing-extensions"] +kernel = ["ipykernel"] +nbconvert = ["nbconvert"] +nbformat = ["nbformat"] +notebook = ["ipywidgets", "notebook"] +parallel = ["ipyparallel"] +qtconsole = ["qtconsole"] +test = ["pytest (<7.1)", "pytest-asyncio", "testpath"] +test-extra = ["curio", "matplotlib (!=3.2.0)", "nbformat", "numpy (>=1.21)", "pandas", "pytest (<7.1)", "pytest-asyncio", "testpath", "trio"] + +[[package]] +name = "jedi" +version = "0.18.2" +description = "An autocompletion tool for Python that can be used for text editors." +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "jedi-0.18.2-py2.py3-none-any.whl", hash = "sha256:203c1fd9d969ab8f2119ec0a3342e0b49910045abe6af0a3ae83a5764d54639e"}, + {file = "jedi-0.18.2.tar.gz", hash = "sha256:bae794c30d07f6d910d32a7048af09b5a39ed740918da923c6b780790ebac612"}, +] + +[package.dependencies] +parso = ">=0.8.0,<0.9.0" + +[package.extras] +docs = ["Jinja2 (==2.11.3)", "MarkupSafe (==1.1.1)", "Pygments (==2.8.1)", "alabaster (==0.7.12)", "babel (==2.9.1)", "chardet (==4.0.0)", "commonmark (==0.8.1)", "docutils (==0.17.1)", "future (==0.18.2)", "idna (==2.10)", "imagesize (==1.2.0)", "mock (==1.0.1)", "packaging (==20.9)", "pyparsing (==2.4.7)", "pytz (==2021.1)", "readthedocs-sphinx-ext (==2.1.4)", "recommonmark (==0.5.0)", "requests (==2.25.1)", "six (==1.15.0)", "snowballstemmer (==2.1.0)", "sphinx (==1.8.5)", "sphinx-rtd-theme (==0.4.3)", "sphinxcontrib-serializinghtml (==1.1.4)", "sphinxcontrib-websupport (==1.2.4)", "urllib3 (==1.26.4)"] +qa = ["flake8 (==3.8.3)", "mypy (==0.782)"] +testing = ["Django (<3.1)", "attrs", "colorama", "docopt", "pytest (<7.0.0)"] + [[package]] name = "jinja2" version = "3.1.2" description = "A very fast and expressive template engine." -category = "dev" +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -670,17 +826,6 @@ files = [ {file = "kiwisolver-1.4.4.tar.gz", hash = "sha256:d41997519fcba4a1e46eb4a2fe31bc12f0ff957b2b81bac28db24744f333e955"}, ] -[[package]] -name = "lit" -version = "16.0.1" -description = "A Software Testing Tool" -category = "dev" -optional = false -python-versions = "*" -files = [ - {file = "lit-16.0.1.tar.gz", hash = "sha256:630a47291b714cb115015df23ab04267c24fe59aec7ecd7e637d5c75cdb45c91"}, -] - [[package]] name = "llvmlite" version = "0.38.1" @@ -723,7 +868,7 @@ files = [ name = "markupsafe" version = "2.1.2" description = "Safely add untrusted strings to HTML/XML markup." -category = "dev" +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -842,11 +987,26 @@ pillow = ">=6.2.0" pyparsing = ">=2.3.1" python-dateutil = ">=2.7" +[[package]] +name = "matplotlib-inline" +version = "0.1.6" +description = "Inline Matplotlib backend for Jupyter" +category = "main" +optional = false +python-versions = ">=3.5" +files = [ + {file = "matplotlib-inline-0.1.6.tar.gz", hash = "sha256:f887e5f10ba98e8d2b150ddcf4702c1e5f8b3a20005eb0f74bfdbd360ee6f304"}, + {file = "matplotlib_inline-0.1.6-py3-none-any.whl", hash = "sha256:f1f41aab5328aa5aaea9b16d083b128102f8712542f819fe7e6a420ff581b311"}, +] + +[package.dependencies] +traitlets = "*" + [[package]] name = "mpmath" version = "1.3.0" description = "Python library for arbitrary-precision floating-point arithmetic" -category = "dev" +category = "main" optional = false python-versions = "*" files = [ @@ -864,7 +1024,7 @@ tests = ["pytest (>=4.6)"] name = "networkx" version = "3.1" description = "Python package for creating and manipulating graphs and networks" -category = "dev" +category = "main" optional = false python-versions = ">=3.8" files = [ @@ -954,180 +1114,11 @@ files = [ {file = "numpy-1.22.4.zip", hash = "sha256:425b390e4619f58d8526b3dcf656dde069133ae5c240229821f01b5f44ea07af"}, ] -[[package]] -name = "nvidia-cublas-cu11" -version = "11.10.3.66" -description = "CUBLAS native runtime libraries" -category = "dev" -optional = false -python-versions = ">=3" -files = [ - {file = "nvidia_cublas_cu11-11.10.3.66-py3-none-manylinux1_x86_64.whl", hash = "sha256:d32e4d75f94ddfb93ea0a5dda08389bcc65d8916a25cb9f37ac89edaeed3bded"}, - {file = "nvidia_cublas_cu11-11.10.3.66-py3-none-win_amd64.whl", hash = "sha256:8ac17ba6ade3ed56ab898a036f9ae0756f1e81052a317bf98f8c6d18dc3ae49e"}, -] - -[package.dependencies] -setuptools = "*" -wheel = "*" - -[[package]] -name = "nvidia-cuda-cupti-cu11" -version = "11.7.101" -description = "CUDA profiling tools runtime libs." -category = "dev" -optional = false -python-versions = ">=3" -files = [ - {file = "nvidia_cuda_cupti_cu11-11.7.101-py3-none-manylinux1_x86_64.whl", hash = "sha256:e0cfd9854e1f2edaa36ca20d21cd0bdd5dcfca4e3b9e130a082e05b33b6c5895"}, - {file = "nvidia_cuda_cupti_cu11-11.7.101-py3-none-win_amd64.whl", hash = "sha256:7cc5b8f91ae5e1389c3c0ad8866b3b016a175e827ea8f162a672990a402ab2b0"}, -] - -[package.dependencies] -setuptools = "*" -wheel = "*" - -[[package]] -name = "nvidia-cuda-nvrtc-cu11" -version = "11.7.99" -description = "NVRTC native runtime libraries" -category = "dev" -optional = false -python-versions = ">=3" -files = [ - {file = "nvidia_cuda_nvrtc_cu11-11.7.99-2-py3-none-manylinux1_x86_64.whl", hash = "sha256:9f1562822ea264b7e34ed5930567e89242d266448e936b85bc97a3370feabb03"}, - {file = "nvidia_cuda_nvrtc_cu11-11.7.99-py3-none-manylinux1_x86_64.whl", hash = "sha256:f7d9610d9b7c331fa0da2d1b2858a4a8315e6d49765091d28711c8946e7425e7"}, - {file = "nvidia_cuda_nvrtc_cu11-11.7.99-py3-none-win_amd64.whl", hash = "sha256:f2effeb1309bdd1b3854fc9b17eaf997808f8b25968ce0c7070945c4265d64a3"}, -] - -[package.dependencies] -setuptools = "*" -wheel = "*" - -[[package]] -name = "nvidia-cuda-runtime-cu11" -version = "11.7.99" -description = "CUDA Runtime native Libraries" -category = "dev" -optional = false -python-versions = ">=3" -files = [ - {file = "nvidia_cuda_runtime_cu11-11.7.99-py3-none-manylinux1_x86_64.whl", hash = "sha256:cc768314ae58d2641f07eac350f40f99dcb35719c4faff4bc458a7cd2b119e31"}, - {file = "nvidia_cuda_runtime_cu11-11.7.99-py3-none-win_amd64.whl", hash = "sha256:bc77fa59a7679310df9d5c70ab13c4e34c64ae2124dd1efd7e5474b71be125c7"}, -] - -[package.dependencies] -setuptools = "*" -wheel = "*" - -[[package]] -name = "nvidia-cudnn-cu11" -version = "8.5.0.96" -description = "cuDNN runtime libraries" -category = "dev" -optional = false -python-versions = ">=3" -files = [ - {file = "nvidia_cudnn_cu11-8.5.0.96-2-py3-none-manylinux1_x86_64.whl", hash = "sha256:402f40adfc6f418f9dae9ab402e773cfed9beae52333f6d86ae3107a1b9527e7"}, - {file = "nvidia_cudnn_cu11-8.5.0.96-py3-none-manylinux1_x86_64.whl", hash = "sha256:71f8111eb830879ff2836db3cccf03bbd735df9b0d17cd93761732ac50a8a108"}, -] - -[package.dependencies] -setuptools = "*" -wheel = "*" - -[[package]] -name = "nvidia-cufft-cu11" -version = "10.9.0.58" -description = "CUFFT native runtime libraries" -category = "dev" -optional = false -python-versions = ">=3" -files = [ - {file = "nvidia_cufft_cu11-10.9.0.58-py3-none-manylinux1_x86_64.whl", hash = "sha256:222f9da70c80384632fd6035e4c3f16762d64ea7a843829cb278f98b3cb7dd81"}, - {file = "nvidia_cufft_cu11-10.9.0.58-py3-none-win_amd64.whl", hash = "sha256:c4d316f17c745ec9c728e30409612eaf77a8404c3733cdf6c9c1569634d1ca03"}, -] - -[[package]] -name = "nvidia-curand-cu11" -version = "10.2.10.91" -description = "CURAND native runtime libraries" -category = "dev" -optional = false -python-versions = ">=3" -files = [ - {file = "nvidia_curand_cu11-10.2.10.91-py3-none-manylinux1_x86_64.whl", hash = "sha256:eecb269c970fa599a2660c9232fa46aaccbf90d9170b96c462e13bcb4d129e2c"}, - {file = "nvidia_curand_cu11-10.2.10.91-py3-none-win_amd64.whl", hash = "sha256:f742052af0e1e75523bde18895a9ed016ecf1e5aa0ecddfcc3658fd11a1ff417"}, -] - -[package.dependencies] -setuptools = "*" -wheel = "*" - -[[package]] -name = "nvidia-cusolver-cu11" -version = "11.4.0.1" -description = "CUDA solver native runtime libraries" -category = "dev" -optional = false -python-versions = ">=3" -files = [ - {file = "nvidia_cusolver_cu11-11.4.0.1-2-py3-none-manylinux1_x86_64.whl", hash = "sha256:72fa7261d755ed55c0074960df5904b65e2326f7adce364cbe4945063c1be412"}, - {file = "nvidia_cusolver_cu11-11.4.0.1-py3-none-manylinux1_x86_64.whl", hash = "sha256:700b781bfefd57d161443aff9ace1878584b93e0b2cfef3d6e9296d96febbf99"}, - {file = "nvidia_cusolver_cu11-11.4.0.1-py3-none-win_amd64.whl", hash = "sha256:00f70b256add65f8c1eb3b6a65308795a93e7740f6df9e273eccbba770d370c4"}, -] - -[package.dependencies] -setuptools = "*" -wheel = "*" - -[[package]] -name = "nvidia-cusparse-cu11" -version = "11.7.4.91" -description = "CUSPARSE native runtime libraries" -category = "dev" -optional = false -python-versions = ">=3" -files = [ - {file = "nvidia_cusparse_cu11-11.7.4.91-py3-none-manylinux1_x86_64.whl", hash = "sha256:a3389de714db63321aa11fbec3919271f415ef19fda58aed7f2ede488c32733d"}, - {file = "nvidia_cusparse_cu11-11.7.4.91-py3-none-win_amd64.whl", hash = "sha256:304a01599534f5186a8ed1c3756879282c72c118bc77dd890dc1ff868cad25b9"}, -] - -[package.dependencies] -setuptools = "*" -wheel = "*" - -[[package]] -name = "nvidia-nccl-cu11" -version = "2.14.3" -description = "NVIDIA Collective Communication Library (NCCL) Runtime" -category = "dev" -optional = false -python-versions = ">=3" -files = [ - {file = "nvidia_nccl_cu11-2.14.3-py3-none-manylinux1_x86_64.whl", hash = "sha256:5e5534257d1284b8e825bc3a182c6f06acd6eb405e9f89d49340e98cd8f136eb"}, -] - -[[package]] -name = "nvidia-nvtx-cu11" -version = "11.7.91" -description = "NVIDIA Tools Extension" -category = "dev" -optional = false -python-versions = ">=3" -files = [ - {file = "nvidia_nvtx_cu11-11.7.91-py3-none-manylinux1_x86_64.whl", hash = "sha256:b22c64eee426a62fc00952b507d6d29cf62b4c9df7a480fcc417e540e05fd5ac"}, - {file = "nvidia_nvtx_cu11-11.7.91-py3-none-win_amd64.whl", hash = "sha256:dfd7fcb2a91742513027d63a26b757f38dd8b07fecac282c4d132a9d373ff064"}, -] - -[package.dependencies] -setuptools = "*" -wheel = "*" - [[package]] name = "packaging" version = "23.1" description = "Core utilities for Python packages" -category = "dev" +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1137,37 +1128,37 @@ files = [ [[package]] name = "pandas" -version = "2.0.0" +version = "2.0.1" description = "Powerful data structures for data analysis, time series, and statistics" category = "dev" optional = false python-versions = ">=3.8" files = [ - {file = "pandas-2.0.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bbb2c5e94d6aa4e632646a3bacd05c2a871c3aa3e85c9bec9be99cb1267279f2"}, - {file = "pandas-2.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b5337c87c4e963f97becb1217965b6b75c6fe5f54c4cf09b9a5ac52fc0bd03d3"}, - {file = "pandas-2.0.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ded51f7e3dd9b4f8b87f2ceb7bd1a8df2491f7ee72f7074c6927a512607199e"}, - {file = "pandas-2.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:52c858de9e9fc422d25e67e1592a6e6135d7bcf9a19fcaf4d0831a0be496bf21"}, - {file = "pandas-2.0.0-cp310-cp310-win32.whl", hash = "sha256:2d1d138848dd71b37e3cbe7cd952ff84e2ab04d8988972166e18567dcc811245"}, - {file = "pandas-2.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:d08e41d96bc4de6f500afe80936c68fce6099d5a434e2af7c7fd8e7c72a3265d"}, - {file = "pandas-2.0.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:24472cfc7ced511ac90608728b88312be56edc8f19b9ed885a7d2e47ffaf69c0"}, - {file = "pandas-2.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4ffb14f50c74ee541610668137830bb93e9dfa319b1bef2cedf2814cd5ac9c70"}, - {file = "pandas-2.0.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c24c7d12d033a372a9daf9ff2c80f8b0af6f98d14664dbb0a4f6a029094928a7"}, - {file = "pandas-2.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8318de0f886e4dcb8f9f36e45a3d6a6c3d1cfdc508354da85e739090f0222991"}, - {file = "pandas-2.0.0-cp311-cp311-win32.whl", hash = "sha256:57c34b79c13249505e850d0377b722961b99140f81dafbe6f19ef10239f6284a"}, - {file = "pandas-2.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:8f987ec26e96a8490909bc5d98c514147236e49830cba7df8690f6087c12bbae"}, - {file = "pandas-2.0.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b3ba8f5dd470d8bfbc4259829589f4a32881151c49e36384d9eb982b35a12020"}, - {file = "pandas-2.0.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:fcd471c9d9f60926ab2f15c6c29164112f458acb42280365fbefa542d0c2fc74"}, - {file = "pandas-2.0.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9253edfd015520ce77a9343eb7097429479c039cd3ebe81d7810ea11b4b24695"}, - {file = "pandas-2.0.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:977326039bd1ded620001a1889e2ed4798460a6bc5a24fbaebb5f07a41c32a55"}, - {file = "pandas-2.0.0-cp38-cp38-win32.whl", hash = "sha256:78425ca12314b23356c28b16765639db10ebb7d8983f705d6759ff7fe41357fa"}, - {file = "pandas-2.0.0-cp38-cp38-win_amd64.whl", hash = "sha256:d93b7fcfd9f3328072b250d6d001dcfeec5d3bb66c1b9c8941e109a46c0c01a8"}, - {file = "pandas-2.0.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:425705cee8be54db2504e8dd2a730684790b15e5904b750c367611ede49098ab"}, - {file = "pandas-2.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a4f789b7c012a608c08cda4ff0872fd979cb18907a37982abe884e6f529b8793"}, - {file = "pandas-2.0.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3bb9d840bf15656805f6a3d87eea9dcb7efdf1314a82adcf7f00b820427c5570"}, - {file = "pandas-2.0.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0778ab54c8f399d83d98ffb674d11ec716449956bc6f6821891ab835848687f2"}, - {file = "pandas-2.0.0-cp39-cp39-win32.whl", hash = "sha256:70db5c278bbec0306d32bf78751ff56b9594c05a5098386f6c8a563659124f91"}, - {file = "pandas-2.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:4f3320bb55f34af4193020158ef8118ee0fb9aec7cc47d2084dbfdd868a0a24f"}, - {file = "pandas-2.0.0.tar.gz", hash = "sha256:cda9789e61b44463c1c4fe17ef755de77bcd13b09ba31c940d20f193d63a5dc8"}, + {file = "pandas-2.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:70a996a1d2432dadedbb638fe7d921c88b0cc4dd90374eab51bb33dc6c0c2a12"}, + {file = "pandas-2.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:909a72b52175590debbf1d0c9e3e6bce2f1833c80c76d80bd1aa09188be768e5"}, + {file = "pandas-2.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fe7914d8ddb2d54b900cec264c090b88d141a1eed605c9539a187dbc2547f022"}, + {file = "pandas-2.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0a514ae436b23a92366fbad8365807fc0eed15ca219690b3445dcfa33597a5cc"}, + {file = "pandas-2.0.1-cp310-cp310-win32.whl", hash = "sha256:12bd6618e3cc737c5200ecabbbb5eaba8ab645a4b0db508ceeb4004bb10b060e"}, + {file = "pandas-2.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:2b6fe5f7ce1cba0e74188c8473c9091ead9b293ef0a6794939f8cc7947057abd"}, + {file = "pandas-2.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:00959a04a1d7bbc63d75a768540fb20ecc9e65fd80744c930e23768345a362a7"}, + {file = "pandas-2.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:af2449e9e984dfad39276b885271ba31c5e0204ffd9f21f287a245980b0e4091"}, + {file = "pandas-2.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:910df06feaf9935d05247db6de452f6d59820e432c18a2919a92ffcd98f8f79b"}, + {file = "pandas-2.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6fa0067f2419f933101bdc6001bcea1d50812afbd367b30943417d67fbb99678"}, + {file = "pandas-2.0.1-cp311-cp311-win32.whl", hash = "sha256:7b8395d335b08bc8b050590da264f94a439b4770ff16bb51798527f1dd840388"}, + {file = "pandas-2.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:8db5a644d184a38e6ed40feeb12d410d7fcc36648443defe4707022da127fc35"}, + {file = "pandas-2.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7bbf173d364130334e0159a9a034f573e8b44a05320995127cf676b85fd8ce86"}, + {file = "pandas-2.0.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:6c0853d487b6c868bf107a4b270a823746175b1932093b537b9b76c639fc6f7e"}, + {file = "pandas-2.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f25e23a03f7ad7211ffa30cb181c3e5f6d96a8e4cb22898af462a7333f8a74eb"}, + {file = "pandas-2.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e09a53a4fe8d6ae2149959a2d02e1ef2f4d2ceb285ac48f74b79798507e468b4"}, + {file = "pandas-2.0.1-cp38-cp38-win32.whl", hash = "sha256:a2564629b3a47b6aa303e024e3d84e850d36746f7e804347f64229f8c87416ea"}, + {file = "pandas-2.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:03e677c6bc9cfb7f93a8b617d44f6091613a5671ef2944818469be7b42114a00"}, + {file = "pandas-2.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3d099ecaa5b9e977b55cd43cf842ec13b14afa1cfa51b7e1179d90b38c53ce6a"}, + {file = "pandas-2.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a37ee35a3eb6ce523b2c064af6286c45ea1c7ff882d46e10d0945dbda7572753"}, + {file = "pandas-2.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:320b180d125c3842c5da5889183b9a43da4ebba375ab2ef938f57bf267a3c684"}, + {file = "pandas-2.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18d22cb9043b6c6804529810f492ab09d638ddf625c5dea8529239607295cb59"}, + {file = "pandas-2.0.1-cp39-cp39-win32.whl", hash = "sha256:90d1d365d77d287063c5e339f49b27bd99ef06d10a8843cf00b1a49326d492c1"}, + {file = "pandas-2.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:99f7192d8b0e6daf8e0d0fd93baa40056684e4b4aaaef9ea78dff34168e1f2f0"}, + {file = "pandas-2.0.1.tar.gz", hash = "sha256:19b8e5270da32b41ebf12f0e7165efa7024492e9513fb46fb631c5022ae5709d"}, ] [package.dependencies] @@ -1202,6 +1193,49 @@ sql-other = ["SQLAlchemy (>=1.4.16)"] test = ["hypothesis (>=6.34.2)", "pytest (>=7.0.0)", "pytest-asyncio (>=0.17.0)", "pytest-xdist (>=2.2.0)"] xml = ["lxml (>=4.6.3)"] +[[package]] +name = "parso" +version = "0.8.3" +description = "A Python Parser" +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "parso-0.8.3-py2.py3-none-any.whl", hash = "sha256:c001d4636cd3aecdaf33cbb40aebb59b094be2a74c556778ef5576c175e19e75"}, + {file = "parso-0.8.3.tar.gz", hash = "sha256:8c07be290bb59f03588915921e29e8a50002acaf2cdc5fa0e0114f91709fafa0"}, +] + +[package.extras] +qa = ["flake8 (==3.8.3)", "mypy (==0.782)"] +testing = ["docopt", "pytest (<6.0.0)"] + +[[package]] +name = "pexpect" +version = "4.8.0" +description = "Pexpect allows easy control of interactive console applications." +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "pexpect-4.8.0-py2.py3-none-any.whl", hash = "sha256:0b48a55dcb3c05f3329815901ea4fc1537514d6ba867a152b581d69ae3710937"}, + {file = "pexpect-4.8.0.tar.gz", hash = "sha256:fc65a43959d153d0114afe13997d439c22823a27cefceb5ff35c2178c6784c0c"}, +] + +[package.dependencies] +ptyprocess = ">=0.5" + +[[package]] +name = "pickleshare" +version = "0.7.5" +description = "Tiny 'shelve'-like database with concurrency support" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "pickleshare-0.7.5-py2.py3-none-any.whl", hash = "sha256:9649af414d74d4df115d5d718f82acb59c9d418196b7b4290ed47a12ce62df56"}, + {file = "pickleshare-0.7.5.tar.gz", hash = "sha256:87683d47965c1da65cdacaf31c8441d12b8044cdec9aca500cd78fc2c683afca"}, +] + [[package]] name = "pillow" version = "9.5.0" @@ -1282,21 +1316,82 @@ files = [ docs = ["furo", "olefile", "sphinx (>=2.4)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinx-removed-in", "sphinxext-opengraph"] tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout"] +[[package]] +name = "pluggy" +version = "1.0.0" +description = "plugin and hook calling mechanisms for python" +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"}, + {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"}, +] + +[package.extras] +dev = ["pre-commit", "tox"] +testing = ["pytest", "pytest-benchmark"] + +[[package]] +name = "prompt-toolkit" +version = "3.0.38" +description = "Library for building powerful interactive command lines in Python" +category = "main" +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "prompt_toolkit-3.0.38-py3-none-any.whl", hash = "sha256:45ea77a2f7c60418850331366c81cf6b5b9cf4c7fd34616f733c5427e6abbb1f"}, + {file = "prompt_toolkit-3.0.38.tar.gz", hash = "sha256:23ac5d50538a9a38c8bde05fecb47d0b403ecd0662857a86f886f798563d5b9b"}, +] + +[package.dependencies] +wcwidth = "*" + +[[package]] +name = "ptyprocess" +version = "0.7.0" +description = "Run a subprocess in a pseudo terminal" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35"}, + {file = "ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220"}, +] + +[[package]] +name = "pure-eval" +version = "0.2.2" +description = "Safely evaluate AST nodes without side effects" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "pure_eval-0.2.2-py3-none-any.whl", hash = "sha256:01eaab343580944bc56080ebe0a674b39ec44a945e6d09ba7db3cb8cec289350"}, + {file = "pure_eval-0.2.2.tar.gz", hash = "sha256:2b45320af6dfaa1750f543d714b6d1c520a1688dec6fd24d339063ce0aaa9ac3"}, +] + +[package.extras] +tests = ["pytest"] + [[package]] name = "pyaml" -version = "21.10.1" -description = "PyYAML-based module to produce pretty and readable YAML-serialized data" +version = "23.5.8" +description = "PyYAML-based module to produce a bit more pretty and readable YAML-serialized data" category = "dev" optional = false python-versions = "*" files = [ - {file = "pyaml-21.10.1-py2.py3-none-any.whl", hash = "sha256:19985ed303c3a985de4cf8fd329b6d0a5a5b5c9035ea240eccc709ebacbaf4a0"}, - {file = "pyaml-21.10.1.tar.gz", hash = "sha256:c6519fee13bf06e3bb3f20cacdea8eba9140385a7c2546df5dbae4887f768383"}, + {file = "pyaml-23.5.8-py3-none-any.whl", hash = "sha256:da944f15d3fe035946450f1acefd267be6b32878f2c736f8dd98a94b6bff3c0c"}, + {file = "pyaml-23.5.8.tar.gz", hash = "sha256:287c58ad3aca43fd6da216f42b3d89c835aa1c79301948bbd25be9a2bb71def3"}, ] [package.dependencies] PyYAML = "*" +[package.extras] +anchors = ["unidecode"] + [[package]] name = "pycparser" version = "2.21" @@ -1311,82 +1406,97 @@ files = [ [[package]] name = "pygame" -version = "2.3.0" +version = "2.4.0" description = "Python Game Development" category = "main" optional = false python-versions = ">=3.6" files = [ - {file = "pygame-2.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:3e9535cf1af0c6ca38d94e0b492fc41057d7bf05e9bd64d3ed3e216d336d6d11"}, - {file = "pygame-2.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:23bd3c3a6d4e8acddee2297d609dbc5953d6ba99b0f0cc5ccc2f567889db3785"}, - {file = "pygame-2.3.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:619eed2d97f28af9d4cdb217a5517fd6f59b873f2f1d31b4489ed852b9a175c3"}, - {file = "pygame-2.3.0-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:9ccac73a8c913809ba2c1408d750abf14e45666b3c83493370441c52e99222b4"}, - {file = "pygame-2.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ec8e691407b6c91525b2d7c8386fd6232b97d8f8c33d134ec0c0165b1d52c24"}, - {file = "pygame-2.3.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8308b21804d137a3b7cafbd020d2159eb5bcc18ffc9c3993b20311069c326a2c"}, - {file = "pygame-2.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a1d737db18f4c94b620613c6a047a3a1eecc0f36df7d5da4070de575930cc5f0"}, - {file = "pygame-2.3.0-cp310-cp310-win32.whl", hash = "sha256:788717d0b9a0d0828a763381e1eb6a127ceef815f9a91ff52217ed4b78df62fc"}, - {file = "pygame-2.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:e3948be800b5f251a0741ec3aab3ca508dfc391095726a69af7064fa4d3e0547"}, - {file = "pygame-2.3.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:82e5806fd797bd1b27fae705683f6822ae5276ec9cda42e6e21bba61985b763a"}, - {file = "pygame-2.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fab0457ab07e8abb99de2b83c0a71f98bdf79afb01ff611873e4333fd8649f02"}, - {file = "pygame-2.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ad8fa7a91fa8f2a4fa46366142763675a0a11b7c34b06dfc20b1095d116da820"}, - {file = "pygame-2.3.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cfff49dbb7fcc2a9a88e3f25fda7f181ee4957fd89df78c47fa64c689d19b8a9"}, - {file = "pygame-2.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a5afd712bd7307d034e6940f3025c4b769656fd4cbb38fbdbd6af0f93d6c8386"}, - {file = "pygame-2.3.0-cp311-cp311-win32.whl", hash = "sha256:fa18acc2d6f0d09575802e1db11845fc0f83f9777cc385c51380125df92f3dc9"}, - {file = "pygame-2.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:101c57141d705ca1930377c324d2c7acd3099f1b4ac676981bdf5d5b329842c8"}, - {file = "pygame-2.3.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:17730a2ed1001e5876745702c92906ad31ecedc13825efba56a0cba92e273b7a"}, - {file = "pygame-2.3.0-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:4b334f6dd6c1412dd4b161a8562b7a422db957f67b7eb93e927606e2dd435882"}, - {file = "pygame-2.3.0-cp36-cp36m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:4db1b103025fd4b451dfa409c0da16d2ff31714ae82bdf45b1434863cd69370b"}, - {file = "pygame-2.3.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d339f90cc30de4b013670de84abd46de4be602d5c52bbe4e569fa15d17b204ca"}, - {file = "pygame-2.3.0-cp36-cp36m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a7390815dad55a2db9f8daac6f2c2e593801daea2d674433a72b91ea1caee0d3"}, - {file = "pygame-2.3.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:59a1e473c627acf369b30bb52fb5f39d1f68f8c204aa857578b72f07a23c952b"}, - {file = "pygame-2.3.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:228514c0d034c840b8ee6bf99185df34ac15e6a6a99684b8a3900124417c8d8f"}, - {file = "pygame-2.3.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:a8b315203925724f89a81a741682589ba1c36ec858d98e6accb7501ece9e99a3"}, - {file = "pygame-2.3.0-cp36-cp36m-win32.whl", hash = "sha256:38642c6cc6477db6ebddd52be39bad0a9e19cf097f83feaaf8e7573b9a9d2405"}, - {file = "pygame-2.3.0-cp36-cp36m-win_amd64.whl", hash = "sha256:525e11a2b9182ec84d690634016009e382ab8b488593c3f150a0b8aae28aa165"}, - {file = "pygame-2.3.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:32bdf1d5d9e0763779d0b915d4617253949a6c118c4c6b5ae1a77cf1df964e4c"}, - {file = "pygame-2.3.0-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:f57b1ee40387e43ab5c3cf20437283477b5ef52ead4bb1d9bff254ef9ee70623"}, - {file = "pygame-2.3.0-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:6ccde93b51d2393216f98e8f81cf5cc628513d837c89dcf5b588f52031659c09"}, - {file = "pygame-2.3.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c60be419d7cca1222895dfe9d520628b7346015208382a19fa678356a22664b3"}, - {file = "pygame-2.3.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:43f238229b3a9e5692ba5a31638f1c148257b37a49ef21f03b23b34d7f00b2d9"}, - {file = "pygame-2.3.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d628637d4f0c55613f258b84eef932faf89e683aa842f4fd483a676f44a38606"}, - {file = "pygame-2.3.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:35f5a9cc7a9a2ea3d048e418e79f30e1506cb47015939330903026c636761aab"}, - {file = "pygame-2.3.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:703d5def9d4dbe9c358f63151bee4a55e328dd7737e692f52522bc44be7c7c8c"}, - {file = "pygame-2.3.0-cp37-cp37m-win32.whl", hash = "sha256:53e9418c457fa549294feee7947bc0b24b048b4eba133f0e757dd2348d15af3b"}, - {file = "pygame-2.3.0-cp37-cp37m-win_amd64.whl", hash = "sha256:0a664cd6c50870f6749c389a8844318afc8a2d02f8cb7b05d67930fdf99252bd"}, - {file = "pygame-2.3.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:bf236758429d9b9cdadd1fcf40901588818ee440178b932409c40157ab41e902"}, - {file = "pygame-2.3.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:3d035ba196c258876a87451fa7de65b62c087d7016e51000e8d95bc67c8584f7"}, - {file = "pygame-2.3.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:57180b3aabbe17d8017aa724887019943d96ea69810f4315f5c1b7d4f64861f9"}, - {file = "pygame-2.3.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:246f75f67d2ad4c2dad21b1f35c6092d67c4c0db13b2fa0a42d794e6e2794f47"}, - {file = "pygame-2.3.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:033352321cc49d60fdc3c3ae4b3e10ecb6614846fb2eb3453c729aba48a2874d"}, - {file = "pygame-2.3.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3ee86606c6c7f61176ed24b427fa230fe4fc9f552aa555b8db21ddb608b4ce88"}, - {file = "pygame-2.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d949e93fbdaf5b43f69a484639104c07028f93686c8305afb0d8e382fde8ff5d"}, - {file = "pygame-2.3.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f2acf958513bd1612960ec68aa5e388262218f7365db59e54e1ee68a55bc544b"}, - {file = "pygame-2.3.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6c5d33355dfb66382bcac1fcf3db64ba71bc9e97082db3ae45a7a0d335e73268"}, - {file = "pygame-2.3.0-cp38-cp38-win32.whl", hash = "sha256:1eda9f30d376d4205e8204e542ab1348dcbb31755c8ba38772e48a3b2f91b2fc"}, - {file = "pygame-2.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:b507df9ea606a87c29e5028b8de9f35066a15f6a5d7f3e5b47b3719e9403f924"}, - {file = "pygame-2.3.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:25c1b1819211aaa0f98264e6b670a496a9975079d5ae2dffd304b0aca6b1aa3c"}, - {file = "pygame-2.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e516bc6bba5455817bbb0038f4c44d1914aac13c7f7954dee9213c9ae28bd9ac"}, - {file = "pygame-2.3.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:740b9f311c693b00d86a89cc6846afc1d1e013b006975eb8be0b18d5481c5b32"}, - {file = "pygame-2.3.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:932034e1738873a55c4e2eb83b6e8c03f9a55feaa6a04a7da7b1e0e5a5050b4a"}, - {file = "pygame-2.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:774233845099d632de676ad4d4dd08ba27ebce5bfa550b1dc9f6cce145e21c35"}, - {file = "pygame-2.3.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4f79a3c5e7f24474d6e722d597ee03d2b0d17958c77d4307787147cf339b4ad9"}, - {file = "pygame-2.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:84fad9538012f1d6b298dcf690c4336e0317fe97ac10993b4d847ff547e919dd"}, - {file = "pygame-2.3.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:910678441d02c3b55ac59fcbc4220a824b094407de084734b5d84e0900d6448b"}, - {file = "pygame-2.3.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:653ec5102b9cb13a24e26663a81d7810790e56b88113b90aa5fdca681c01a5b9"}, - {file = "pygame-2.3.0-cp39-cp39-win32.whl", hash = "sha256:e62607c86e02d29ba5cb00837f73b1dce7b325a1f1f6d93150a0f96fa68da1a1"}, - {file = "pygame-2.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:90931a210325274184860d898df4e87a0972654edbb2a6185afcdce32244dfb6"}, - {file = "pygame-2.3.0-pp36-pypy36_pp73-win32.whl", hash = "sha256:1dc89d825e0ccba5ba3605abbd83be1401e0a32de7ab64b9647a6bb1ecb0a4f7"}, - {file = "pygame-2.3.0-pp37-pypy37_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e323b75abda43345aff5ab2f6b1c017135f937f8a114d7aac8d95a07d200e19f"}, - {file = "pygame-2.3.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e13de2947c496fcb600fa4b5cd00a5fa33d4b3af9d13c169a5f79268268de0a8"}, - {file = "pygame-2.3.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:555234ed6b08242af95406fd3eb43255c3ce8e915e8c751f2d411bd40d574df4"}, - {file = "pygame-2.3.0-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:858d3968aebaca5015ef0ec82c513114a3c3fe64ce910222cfa852a39f03b135"}, - {file = "pygame-2.3.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:250b3ec3f90b05ad50cb0070d994a0a1f39fffe8181fc9508b8749884c313431"}, - {file = "pygame-2.3.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a5e83bd89da26f8360e02d5de2d2575981b0ebad81ea6d48aba610dabf167b88"}, - {file = "pygame-2.3.0-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c2961d44593aaa99580971e4123db00d4ca72fb4b30fa56350b3f6792331a41e"}, - {file = "pygame-2.3.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:385163fd1ed8809a72be68fddc9c76876c304e8712695aff2ea49adf3831caf9"}, - {file = "pygame-2.3.0.tar.gz", hash = "sha256:884b92c9cbf0bfaf8b8dd0f75a746613c55447d307ddd1addf903709b3b9f89f"}, + {file = "pygame-2.4.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:63591f381e5b28b90e115ac7a96f8ce5ecb917facb42d79d4f89714f89cc6d8e"}, + {file = "pygame-2.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:13511c7c29f0fc23636f3b95a96ab45f964e84073e7e27dc602a479cd274d89a"}, + {file = "pygame-2.4.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:1b7201a44869eb420dd56c8e003251c9e7422c5304b3e78508e767a5634ab31b"}, + {file = "pygame-2.4.0-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:3ab14e06c302921f33d25180813711a920acef386d3992fc21731d2d5e8e86f0"}, + {file = "pygame-2.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:418659c2d42f6a2356e2691006d79b6e07fd4992f9e904a2638c51c992f3e41b"}, + {file = "pygame-2.4.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e70fd71e0321a805001192e08ae4af45b86c68f155670230c3f6f4dd25089e70"}, + {file = "pygame-2.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ab8115af26a9e95f39b08fff416f097803480f265500b218a5ca065d6e73124f"}, + {file = "pygame-2.4.0-cp310-cp310-win32.whl", hash = "sha256:4ffec9661731fb674ccc88d1de92709219047af3d8198d0e6203c21f3f1b54a7"}, + {file = "pygame-2.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:bb5a39320d00fa781959d2d0151e6f0293dd1398c6dc9dc934112ecce7b4fb52"}, + {file = "pygame-2.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:23543e2d206d8de7d6db4f7b1c74e6fea6c01ead63caf7252e63341e1cdb09f6"}, + {file = "pygame-2.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4b562cfdd8caa76ba47ca2a9211fee6b0a95ceb95c9da94cf60a3909b2300854"}, + {file = "pygame-2.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:751bc57e4c3b7cd92762344562dcbd405e2b54488de1d7a1e083a470bdbc5ae9"}, + {file = "pygame-2.4.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d9b1127f085d09c7c0a976d440e8fc2f7adc579d62abcfc20c23c2699bbe2dc1"}, + {file = "pygame-2.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47fd096ceb68d966681f8d0e820f7305bf05b30421ca562cfdb3c89a5aef26e5"}, + {file = "pygame-2.4.0-cp311-cp311-win32.whl", hash = "sha256:de963a4b8787d93a9fba8f4052d9dde8b12adbeac5781e48035be1557dfadb20"}, + {file = "pygame-2.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:75ef535ebe541b74a160bb59c3e520f543250d19f69d5973350ec1b9706e1469"}, + {file = "pygame-2.4.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:ca2ecc65126eaaa5b8e6a119913cfb2c2b1ed4c8ee1b980baf333aa9d379f227"}, + {file = "pygame-2.4.0-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:4a98ed8c47e367b9233b5ca25c36c2b45ab61959ac543195f0b6349f0a599ec8"}, + {file = "pygame-2.4.0-cp36-cp36m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:00ecd4688ee25d5d4cf48eddab18749a9bb2b382772f7fa8a987e4d21026c603"}, + {file = "pygame-2.4.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:99c296ecb8ce6ea1f404f4d174fdb215c64515827778525301c29ddf6f8e6e07"}, + {file = "pygame-2.4.0-cp36-cp36m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b6b94fc99487ce4a45ce00fa9145f4861f6e021254a005101d00bc17a4bb4f5c"}, + {file = "pygame-2.4.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3020fb98f27a6ea79418a5b332ca07be93884e4a455c8a0a31b2dcf39ee2d96"}, + {file = "pygame-2.4.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8f97c8be81b3262ad8dae982485c4a73c9f2374614dfc0db8eb0f754badb29d6"}, + {file = "pygame-2.4.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:be7f948d33d0536c2922289e6f5983251cb0bd0d727db6ff692886c239f47a2c"}, + {file = "pygame-2.4.0-cp36-cp36m-win32.whl", hash = "sha256:a66b314f4a637784d5ca2970745bb2e6e554447dce8f4cfedd9b9fcef5e3ffc6"}, + {file = "pygame-2.4.0-cp36-cp36m-win_amd64.whl", hash = "sha256:c09323eeae9e0cb2ced0cb3635485ae17f4f1b2b6b908a494ce2d830c609d4be"}, + {file = "pygame-2.4.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c4241e1da3852a955d37a22157ed51b2d30a65f7987eac9d162bb302fb754d87"}, + {file = "pygame-2.4.0-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:802b03f6c367359c94eb6a90169666efa1aa1d6e24fce37a0b21642ccdfe48cf"}, + {file = "pygame-2.4.0-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:79b0962a8f09788ca735532cfcf2dd053424fe5eabbda564b74f8e5e2eb11f48"}, + {file = "pygame-2.4.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:627c8bb007a757da18d32c5d9b7ac50ab0356d9e922d570b0572765778080787"}, + {file = "pygame-2.4.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f576403c2b14f0eea694365b9018d5bacac70b1550261ffc7a54a92e18967541"}, + {file = "pygame-2.4.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5210cb09ec31281e16fda008bf8dfe2e024eef58e075dd0c01935d0004fdfffd"}, + {file = "pygame-2.4.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6060d68d10fafd51c4cb3a7d687d741009881860dfd429c863e570877e2ce9de"}, + {file = "pygame-2.4.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6c0081546749c0b4341ce575622a4f8eee05f675d3a0872ab6aed6e5bd2ba5a8"}, + {file = "pygame-2.4.0-cp37-cp37m-win32.whl", hash = "sha256:fa2531f83e7c5f6f7cc20a1b4e0f982bd608aad81ff6c385148e64256ab0419f"}, + {file = "pygame-2.4.0-cp37-cp37m-win_amd64.whl", hash = "sha256:cff815181437add5f3d702e8c7f1d2aa4ed04ed04cde27ec809e7ac516ee6b5f"}, + {file = "pygame-2.4.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:53bfdc1aea619fa8d347be37b08de87089d543375948aacf8b163b0c5eb6d4e4"}, + {file = "pygame-2.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7fa1e65fd559823997f39a592cb49d8c89dd31c8bbde8273fe3922e2c1f294f6"}, + {file = "pygame-2.4.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:65ee75e0e83e393fdc5c06e55e376c7511881a5ebee006ecca89cb1b3b41d6f1"}, + {file = "pygame-2.4.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:fbcba1b06f42338fecbd366227025f81729d9f4a577677fd3cd1ceff34d7286a"}, + {file = "pygame-2.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b04451e5addae3a078a7a4f494e6b217025f4813dfb364a49c250fc5dfd1d2e2"}, + {file = "pygame-2.4.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:faa3b63b71d555e7a21cecc11c65e059d9cb1902158d863ac3592e1947bc521a"}, + {file = "pygame-2.4.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ef14750fa60b47510cfe9c7c37e7abe67617f5d1f1a8ffa257a59d49836dadda"}, + {file = "pygame-2.4.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5a2aee4214e5efed2cb3650139010dd4d0b1c29a9760278ab259d0b46281b66a"}, + {file = "pygame-2.4.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:47be83060a9dbc79763fd230f04d53a29064b5f64d1b59425c432d3570b22623"}, + {file = "pygame-2.4.0-cp38-cp38-win32.whl", hash = "sha256:14492d8c0eaad778bb10b6d53eaea4ef77f4d3431b6b7c857397dc6cf4397ac9"}, + {file = "pygame-2.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:6ba967d0e3fed8611f1face6695dc8fa554ee543d300681f8080f5de9cc7da73"}, + {file = "pygame-2.4.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9f6b7a604812f447495829751dfe7ab57cb31c2c9acdb07ba4b7157490411a12"}, + {file = "pygame-2.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e2a3176b33b97ebae397f951d254e3155a0afe730e1b76fb35126555c27dd3b5"}, + {file = "pygame-2.4.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6ec870a63295ebff737640c4ef39868312e206dcba655b4ad5c7d0e8c2488b73"}, + {file = "pygame-2.4.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:e75d8c2980d719045be366160568bf508cbbed21285efe32468c75abcd4cf8b3"}, + {file = "pygame-2.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7e5d32def075e495b4802371fd8cda96ff4957aa39e215f83d87022dedf14cfb"}, + {file = "pygame-2.4.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cad74cbbefbdb81cb22a9ea22561614b8dc58fcd52cd54126bbb8ee9ee77a5d5"}, + {file = "pygame-2.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b4c75dd345707da622c78dbd6a63a025f7b89377ddc4e71ba40043929824f5d4"}, + {file = "pygame-2.4.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:075c1282b1d307669c8ef29942564b91acb85623bedba3bfb841079d539ded31"}, + {file = "pygame-2.4.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:1422673a2b485153cbc20dbbd37af791c9842ca98a1b7a89fe3ac115cce79805"}, + {file = "pygame-2.4.0-cp39-cp39-win32.whl", hash = "sha256:fb7bb86c4aedb4382d7f643ff7d21ab4731d59ddb9b448e78b9125ab1addc007"}, + {file = "pygame-2.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:93bb1406125ae9bd7a9bb0d45f11b30f157ea8d2efee1ebe9d781b1d1a9fce6b"}, + {file = "pygame-2.4.0-pp36-pypy36_pp73-win32.whl", hash = "sha256:2946c151691c80ffb9f3f39e1f294d7ed9edaae1814e528d2f5b4751e7e6d903"}, + {file = "pygame-2.4.0-pp37-pypy37_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:80502eb26483b0206d0508475ec7d67a86bc0afc5bb4aad3a6172a7a85a27554"}, + {file = "pygame-2.4.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f9c8bb7b77f97eb49dac900445fbf96a332d2072588949d6396581933843fb04"}, + {file = "pygame-2.4.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:8b6e1493724d29e46a0e7e8125d9808c9957c652db67afe9497d385509fc5ac5"}, + {file = "pygame-2.4.0-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:43db3a6c9be3d94eececf7c86cde7584d2bb87f394ade40139c3b4e528fdff24"}, + {file = "pygame-2.4.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:32ed4d4317bce8fe78592a7b5b4a07f2e0ff814e35c66cb5a3b398dae96c3f27"}, + {file = "pygame-2.4.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:e5f043751840a07ff0160abe46ed42a88bc29baee93656abb5a050beda176306"}, + {file = "pygame-2.4.0-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:867cf19f1c7aa6f187a0a31b702f5668e935e700b46d94bd58e94ec8581cf081"}, + {file = "pygame-2.4.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5a93d368311d40827dc5f0cad2a0e9a8700c1b017346808cfdfd9ea98aee45df"}, + {file = "pygame-2.4.0.tar.gz", hash = "sha256:e3603e70e96ee30af1954ce57d4922a059402f368013e7138e90f1c03d185267"}, ] +[[package]] +name = "pygments" +version = "2.15.1" +description = "Pygments is a syntax highlighting package written in Python." +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "Pygments-2.15.1-py3-none-any.whl", hash = "sha256:db2db3deb4b4179f399a09054b023b6a586b76499d36965813c71aa8ed7b5fd1"}, + {file = "Pygments-2.15.1.tar.gz", hash = "sha256:8ace4d3c1dd481894b2005f560ead0f9f19ee64fe983366be1a21e171d12775c"}, +] + +[package.extras] +plugins = ["importlib-metadata"] + [[package]] name = "pyparsing" version = "3.0.9" @@ -1414,6 +1524,44 @@ files = [ {file = "pyreadline3-3.4.1.tar.gz", hash = "sha256:6f3d1f7b8a31ba32b73917cefc1f28cc660562f39aea8646d30bd6eff21f7bae"}, ] +[[package]] +name = "pytest" +version = "7.3.1" +description = "pytest: simple powerful testing with Python" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pytest-7.3.1-py3-none-any.whl", hash = "sha256:3799fa815351fea3a5e96ac7e503a96fa51cc9942c3753cda7651b93c1cfa362"}, + {file = "pytest-7.3.1.tar.gz", hash = "sha256:434afafd78b1d78ed0addf160ad2b77a30d35d4bdf8af234fe621919d9ed15e3"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "sys_platform == \"win32\""} +exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} +iniconfig = "*" +packaging = "*" +pluggy = ">=0.12,<2.0" +tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""} + +[package.extras] +testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "xmlschema"] + +[[package]] +name = "pytest-metadata" +version = "2.0.4" +description = "pytest plugin for test session metadata" +category = "main" +optional = false +python-versions = ">=3.7,<4.0" +files = [ + {file = "pytest_metadata-2.0.4-py3-none-any.whl", hash = "sha256:acb739f89fabb3d798c099e9e0c035003062367a441910aaaf2281bc1972ee14"}, + {file = "pytest_metadata-2.0.4.tar.gz", hash = "sha256:fcc653f65fe3035b478820b5284fbf0f52803622ee3f60a2faed7a7d3ba1f41e"}, +] + +[package.dependencies] +pytest = ">=3.0.0,<8.0.0" + [[package]] name = "python-dateutil" version = "2.8.2" @@ -1621,21 +1769,21 @@ cffi = {version = "*", markers = "implementation_name == \"pypy\""} [[package]] name = "requests" -version = "2.28.2" +version = "2.30.0" description = "Python HTTP for Humans." category = "dev" optional = false -python-versions = ">=3.7, <4" +python-versions = ">=3.7" files = [ - {file = "requests-2.28.2-py3-none-any.whl", hash = "sha256:64299f4909223da747622c030b781c0d7811e359c37124b4bd368fb8c6518baa"}, - {file = "requests-2.28.2.tar.gz", hash = "sha256:98b1b2782e3c6c4904938b84c0eb932721069dfdb9134313beff7c83c2df24bf"}, + {file = "requests-2.30.0-py3-none-any.whl", hash = "sha256:10e94cc4f3121ee6da529d358cdaeaff2f1c409cd377dbc72b825852f2f7e294"}, + {file = "requests-2.30.0.tar.gz", hash = "sha256:239d7d4458afcb28a692cdd298d87542235f4ca8d36d03a15bfc128a6559a2f4"}, ] [package.dependencies] certifi = ">=2017.4.17" charset-normalizer = ">=2,<4" idna = ">=2.5,<4" -urllib3 = ">=1.21.1,<1.27" +urllib3 = ">=1.21.1,<3" [package.extras] socks = ["PySocks (>=1.5.6,!=1.5.7)"] @@ -1756,14 +1904,14 @@ stats = ["scipy (>=1.3)", "statsmodels (>=0.10)"] [[package]] name = "setuptools" -version = "67.6.1" +version = "67.7.2" description = "Easily download, build, install, upgrade, and uninstall Python packages" category = "dev" optional = false python-versions = ">=3.7" files = [ - {file = "setuptools-67.6.1-py3-none-any.whl", hash = "sha256:e728ca814a823bf7bf60162daf9db95b93d532948c4c0bea762ce62f60189078"}, - {file = "setuptools-67.6.1.tar.gz", hash = "sha256:257de92a9d50a60b8e22abfcbb771571fde0dbf3ec234463212027a4eeecbe9a"}, + {file = "setuptools-67.7.2-py3-none-any.whl", hash = "sha256:23aaf86b85ca52ceb801d32703f12d77517b2556af839621c641fca11287952b"}, + {file = "setuptools-67.7.2.tar.gz", hash = "sha256:f104fa03692a2602fa0fec6c6a9e63b6c8a968de13e17c026957dd1f53d80990"}, ] [package.extras] @@ -1775,7 +1923,7 @@ testing-integration = ["build[virtualenv]", "filelock (>=3.4.0)", "jaraco.envs ( name = "six" version = "1.16.0" description = "Python 2 and 3 compatibility utilities" -category = "dev" +category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" files = [ @@ -1785,53 +1933,53 @@ files = [ [[package]] name = "sqlalchemy" -version = "2.0.9" +version = "2.0.12" description = "Database Abstraction Library" category = "dev" optional = false python-versions = ">=3.7" files = [ - {file = "SQLAlchemy-2.0.9-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:734805708632e3965c2c40081f9a59263c29ffa27cba9b02d4d92dfd57ba869f"}, - {file = "SQLAlchemy-2.0.9-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8d3ece5960b3e821e43a4927cc851b6e84a431976d3ffe02aadb96519044807e"}, - {file = "SQLAlchemy-2.0.9-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8d118e233f416d713aac715e2c1101e17f91e696ff315fc9efbc75b70d11e740"}, - {file = "SQLAlchemy-2.0.9-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f005245e1cb9b8ca53df73ee85e029ac43155e062405015e49ec6187a2e3fb44"}, - {file = "SQLAlchemy-2.0.9-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:34eb96c1de91d8f31e988302243357bef3f7785e1b728c7d4b98bd0c117dafeb"}, - {file = "SQLAlchemy-2.0.9-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7e472e9627882f2d75b87ff91c5a2bc45b31a226efc7cc0a054a94fffef85862"}, - {file = "SQLAlchemy-2.0.9-cp310-cp310-win32.whl", hash = "sha256:0a865b5ec4ba24f57c33b633b728e43fde77b968911a6046443f581b25d29dd9"}, - {file = "SQLAlchemy-2.0.9-cp310-cp310-win_amd64.whl", hash = "sha256:6e84ab63d25d8564d7a8c05dc080659931a459ee27f6ed1cf4c91f292d184038"}, - {file = "SQLAlchemy-2.0.9-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:db4bd1c4792da753f914ff0b688086b9a8fd78bb9bc5ae8b6d2e65f176b81eb9"}, - {file = "SQLAlchemy-2.0.9-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ad5363a1c65fde7b7466769d4261126d07d872fc2e816487ae6cec93da604b6b"}, - {file = "SQLAlchemy-2.0.9-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ebc4eeb1737a5a9bdb0c24f4c982319fa6edd23cdee27180978c29cbb026f2bd"}, - {file = "SQLAlchemy-2.0.9-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bbda1da8d541904ba262825a833c9f619e93cb3fd1156be0a5e43cd54d588dcd"}, - {file = "SQLAlchemy-2.0.9-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d5327f54a9c39e7871fc532639616f3777304364a0bb9b89d6033ad34ef6c5f8"}, - {file = "SQLAlchemy-2.0.9-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:ac6a0311fb21a99855953f84c43fcff4bdca27a2ffcc4f4d806b26b54b5cddc9"}, - {file = "SQLAlchemy-2.0.9-cp311-cp311-win32.whl", hash = "sha256:d209594e68bec103ad5243ecac1b40bf5770c9ebf482df7abf175748a34f4853"}, - {file = "SQLAlchemy-2.0.9-cp311-cp311-win_amd64.whl", hash = "sha256:865392a50a721445156809c1a6d6ab6437be70c1c2599f591a8849ed95d3c693"}, - {file = "SQLAlchemy-2.0.9-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0b49f1f71d7a44329a43d3edd38cc5ee4c058dfef4487498393d16172007954b"}, - {file = "SQLAlchemy-2.0.9-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e4a019f723b6c1e6b3781be00fb9e0844bc6156f9951c836ff60787cc3938d76"}, - {file = "SQLAlchemy-2.0.9-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9838bd247ee42eb74193d865e48dd62eb50e45e3fdceb0fdef3351133ee53dcf"}, - {file = "SQLAlchemy-2.0.9-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:78612edf4ba50d407d0eb3a64e9ec76e6efc2b5d9a5c63415d53e540266a230a"}, - {file = "SQLAlchemy-2.0.9-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:f61ab84956dc628c8dfe9d105b6aec38afb96adae3e5e7da6085b583ff6ea789"}, - {file = "SQLAlchemy-2.0.9-cp37-cp37m-win32.whl", hash = "sha256:07950fc82f844a2de67ddb4e535f29b65652b4d95e8b847823ce66a6d540a41d"}, - {file = "SQLAlchemy-2.0.9-cp37-cp37m-win_amd64.whl", hash = "sha256:e62c4e762d6fd2901692a093f208a6a6575b930e9458ad58c2a7f080dd6132da"}, - {file = "SQLAlchemy-2.0.9-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b3e5864eba71a3718236a120547e52c8da2ccb57cc96cecd0480106a0c799c92"}, - {file = "SQLAlchemy-2.0.9-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:1d06e119cf79a3d80ab069f064a07152eb9ba541d084bdaee728d8a6f03fd03d"}, - {file = "SQLAlchemy-2.0.9-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ee2946042cc7851842d7a086a92b9b7b494cbe8c3e7e4627e27bc912d3a7655e"}, - {file = "SQLAlchemy-2.0.9-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:13f984a190d249769a050634b248aef8991acc035e849d02b634ea006c028fa8"}, - {file = "SQLAlchemy-2.0.9-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:e4780be0f19e5894c17f75fc8de2fe1ae233ab37827125239ceb593c6f6bd1e2"}, - {file = "SQLAlchemy-2.0.9-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:68ed381bc340b4a3d373dbfec1a8b971f6350139590c4ca3cb722fdb50035777"}, - {file = "SQLAlchemy-2.0.9-cp38-cp38-win32.whl", hash = "sha256:aa5c270ece17c0c0e0a38f2530c16b20ea05d8b794e46c79171a86b93b758891"}, - {file = "SQLAlchemy-2.0.9-cp38-cp38-win_amd64.whl", hash = "sha256:1b69666e25cc03c602d9d3d460e1281810109e6546739187044fc256c67941ef"}, - {file = "SQLAlchemy-2.0.9-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c6e27189ff9aebfb2c02fd252c629ea58657e7a5ff1a321b7fc9c2bf6dc0b5f3"}, - {file = "SQLAlchemy-2.0.9-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c8239ce63a90007bce479adf5460d48c1adae4b933d8e39a4eafecfc084e503c"}, - {file = "SQLAlchemy-2.0.9-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4f759eccb66e6d495fb622eb7f4ac146ae674d829942ec18b7f5a35ddf029597"}, - {file = "SQLAlchemy-2.0.9-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:246712af9fc761d6c13f4f065470982e175d902e77aa4218c9cb9fc9ff565a0c"}, - {file = "SQLAlchemy-2.0.9-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:6b72dccc5864ea95c93e0a9c4e397708917fb450f96737b4a8395d009f90b868"}, - {file = "SQLAlchemy-2.0.9-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:93c78d42c14aa9a9e0866eacd5b48df40a50d0e2790ee377af7910d224afddcf"}, - {file = "SQLAlchemy-2.0.9-cp39-cp39-win32.whl", hash = "sha256:f49c5d3c070a72ecb96df703966c9678dda0d4cb2e2736f88d15f5e1203b4159"}, - {file = "SQLAlchemy-2.0.9-cp39-cp39-win_amd64.whl", hash = "sha256:4c3020afb144572c7bfcba9d7cce57ad42bff6e6115dffcfe2d4ae6d444a214f"}, - {file = "SQLAlchemy-2.0.9-py3-none-any.whl", hash = "sha256:e730603cae5747bc6d6dece98b45a57d647ed553c8d5ecef602697b1c1501cf2"}, - {file = "SQLAlchemy-2.0.9.tar.gz", hash = "sha256:95719215e3ec7337b9f57c3c2eda0e6a7619be194a5166c07c1e599f6afc20fa"}, + {file = "SQLAlchemy-2.0.12-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:10f1ff0ebe21d2cea89ead231ba3ecf75678463ab85f19ce2ce91207620737f3"}, + {file = "SQLAlchemy-2.0.12-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:978bee4ecbcdadf087220618409fb9be9509458df479528b70308f0599c7c519"}, + {file = "SQLAlchemy-2.0.12-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:53b2c8adbcbb59732fb21a024aaa261983655845d86e3fc26a5676cec0ebaa09"}, + {file = "SQLAlchemy-2.0.12-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:91f4b1bdc987ef85fe3a0ce5d26ac72ff8f60207b08272aa2a65494836391d69"}, + {file = "SQLAlchemy-2.0.12-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:dfd6385b662aea83e63dd4db5fe116eb11914022deb1745f0b57fa8470c18ffe"}, + {file = "SQLAlchemy-2.0.12-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:5e9d390727c11b9a7e583bf6770de36895c0936bddb98ae93ae99282e6428d5f"}, + {file = "SQLAlchemy-2.0.12-cp310-cp310-win32.whl", hash = "sha256:a4709457f1c317e347051498b91fa2b86c4bcdebf93c84e6d121a4fc8a397307"}, + {file = "SQLAlchemy-2.0.12-cp310-cp310-win_amd64.whl", hash = "sha256:f0843132168b44ca33c5e5a2046c954775dde8c580ce27f5cf2e134d0d9919e4"}, + {file = "SQLAlchemy-2.0.12-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:32762dba51b663609757f861584a722093487f53737e76474cc6e190904dc31b"}, + {file = "SQLAlchemy-2.0.12-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5d709f43caee115b03b707b8cbbcb8b303045dd7cdc825b6d29857d71f3425ae"}, + {file = "SQLAlchemy-2.0.12-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9fe98e9d26778d7711ceee2c671741b4f54c74677668481d733d6f70747d7690"}, + {file = "SQLAlchemy-2.0.12-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2a3101252f3de9a18561c1fb0a68b1ee465485990aba458d4510f214bd5a582c"}, + {file = "SQLAlchemy-2.0.12-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:6b1fa0ffc378a7061c452cb4a1f804fad1b3b8aa8d0552725531d27941b2e3ed"}, + {file = "SQLAlchemy-2.0.12-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c5268ec05c21e2ecf5bca09314bcaadfec01f02163088cd602db4379862958dd"}, + {file = "SQLAlchemy-2.0.12-cp311-cp311-win32.whl", hash = "sha256:77a06b0983faf9aa48ee6219d41ade39dee16ce90857cc181dbcf6918acd234d"}, + {file = "SQLAlchemy-2.0.12-cp311-cp311-win_amd64.whl", hash = "sha256:a022c588c0f413f8cddf9fcc597dbf317efeac4186d8bff9aa7f3219258348b0"}, + {file = "SQLAlchemy-2.0.12-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b6ceca432ce88ad12aab5b5896c343a1993c90b325d9193dcd055e73e18a0439"}, + {file = "SQLAlchemy-2.0.12-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0e5501c78b5ab917f0f0f75ce7f0018f683a0a76e95f30e6561bf61c9ff69d43"}, + {file = "SQLAlchemy-2.0.12-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dc67efd00ce7f428a446ce012673c03c63c5abb5dec3f33750087b8bdc173bf0"}, + {file = "SQLAlchemy-2.0.12-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:1fac17c866111283cbcdb7024d646abb71fdd95f3ce975cf3710258bc55742fd"}, + {file = "SQLAlchemy-2.0.12-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:f30c5608c64fc9c1fa9a16277eb4784f782362566fe40ff8d283358c8f2c5fe0"}, + {file = "SQLAlchemy-2.0.12-cp37-cp37m-win32.whl", hash = "sha256:85b0efe1c71459ba435a6593f54a0e39334b16ba383e8010fdb9d0127ca51ba8"}, + {file = "SQLAlchemy-2.0.12-cp37-cp37m-win_amd64.whl", hash = "sha256:b76c2fde827522e21922418325c1b95c2d795cdecfb4bc261e4d37965199ee7f"}, + {file = "SQLAlchemy-2.0.12-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:aec5fb36b53125554ecc2285526eb5cc31b21f6cb059993c1c5ca831959de052"}, + {file = "SQLAlchemy-2.0.12-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4ad525b9dd17b478a2ed8580d7f2bc46b0f5889153c6b1c099729583e395b4b9"}, + {file = "SQLAlchemy-2.0.12-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d9796d5c13b2b7f05084d0ce52528cf919f9bde9e0f10672a6393a4490415695"}, + {file = "SQLAlchemy-2.0.12-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e1d50592cb24d1947c374c666add65ded7c181ec98a89ed17abbe9b8b2e2ff4"}, + {file = "SQLAlchemy-2.0.12-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:bf83700faa9642388fbd3167db3f6cbb2e88cc8367b8c22204f3f408ee782d25"}, + {file = "SQLAlchemy-2.0.12-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:297b752d4f30350b64175bbbd57dc94c061a35f5d1dba088d0a367dbbebabc94"}, + {file = "SQLAlchemy-2.0.12-cp38-cp38-win32.whl", hash = "sha256:369f6564e68a9c60f0b9dde121def491e651a4ba8dcdd652a93f1cd5977cd85c"}, + {file = "SQLAlchemy-2.0.12-cp38-cp38-win_amd64.whl", hash = "sha256:7eb25b981cbc9e7df9f56ad7ec4c6d77323090ca4b7147fcdc09d66535377759"}, + {file = "SQLAlchemy-2.0.12-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f6ebadefc4331dda83c22519e1ea1e61104df6eb38abbb80ab91b0a8527a5c19"}, + {file = "SQLAlchemy-2.0.12-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3745dee26a7ee012598577ad3b8f6e6cd50a49b2afa0cde9db668da6bf2c2319"}, + {file = "SQLAlchemy-2.0.12-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:09205893a84b6bedae0453d3f384f5d2a6499b6e45ad977549894cdcd85d8f1c"}, + {file = "SQLAlchemy-2.0.12-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8aad66215a3817a7a1d535769773333250de2653c89b53f7e2d42b677d398027"}, + {file = "SQLAlchemy-2.0.12-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:e495ad05a13171fbb5d72fe5993469c8bceac42bcf6b8f9f117a518ee7fbc353"}, + {file = "SQLAlchemy-2.0.12-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:03206576ca53f55b9de6e890273e498f4b2e6e687a9db9859bdcd21df5a63e53"}, + {file = "SQLAlchemy-2.0.12-cp39-cp39-win32.whl", hash = "sha256:87b2c2d13c3d1384859b60eabb3139e169ce68ada1d2963dbd0c7af797f16efe"}, + {file = "SQLAlchemy-2.0.12-cp39-cp39-win_amd64.whl", hash = "sha256:3c053c3f4c4e45d4c8b27977647566c140d6de3f61a4e2acb92ea24cf9911c7f"}, + {file = "SQLAlchemy-2.0.12-py3-none-any.whl", hash = "sha256:e752c34f7a2057ebe82c856698b9f277c633d4aad006bddf7af74598567c8931"}, + {file = "SQLAlchemy-2.0.12.tar.gz", hash = "sha256:bddfc5bd1dee5db0fddc9dab26f800c283f3243e7281bbf107200fed30125f9c"}, ] [package.dependencies] @@ -1861,6 +2009,26 @@ postgresql-psycopg2cffi = ["psycopg2cffi"] pymysql = ["pymysql"] sqlcipher = ["sqlcipher3-binary"] +[[package]] +name = "stack-data" +version = "0.6.2" +description = "Extract data from python stack frames and tracebacks for informative displays" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "stack_data-0.6.2-py3-none-any.whl", hash = "sha256:cbb2a53eb64e5785878201a97ed7c7b94883f48b87bfb0bbe8b623c74679e4a8"}, + {file = "stack_data-0.6.2.tar.gz", hash = "sha256:32d2dd0376772d01b6cb9fc996f3c8b57a357089dec328ed4b6553d037eaf815"}, +] + +[package.dependencies] +asttokens = ">=2.1.0" +executing = ">=1.2.0" +pure-eval = "*" + +[package.extras] +tests = ["cython", "littleutils", "pygments", "pytest", "typeguard"] + [[package]] name = "svgpathtools" version = "1.6.0" @@ -1894,7 +2062,7 @@ files = [ name = "sympy" version = "1.11.1" description = "Computer algebra system (CAS) in Python" -category = "dev" +category = "main" optional = false python-versions = ">=3.8" files = [ @@ -1923,57 +2091,53 @@ numpy = "*" [package.extras] all = ["defusedxml", "fsspec", "imagecodecs (>=2023.1.23)", "lxml", "matplotlib", "zarr"] +[[package]] +name = "tomli" +version = "2.0.1" +description = "A lil' TOML parser" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, + {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, +] + [[package]] name = "torch" -version = "2.0.0" +version = "2.0.1" description = "Tensors and Dynamic neural networks in Python with strong GPU acceleration" -category = "dev" +category = "main" optional = false python-versions = ">=3.8.0" files = [ - {file = "torch-2.0.0-1-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:c9090bda7d2eeeecd74f51b721420dbeb44f838d4536cc1b284e879417e3064a"}, - {file = "torch-2.0.0-1-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:bd42db2a48a20574d2c33489e120e9f32789c4dc13c514b0c44272972d14a2d7"}, - {file = "torch-2.0.0-1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:8969aa8375bcbc0c2993e7ede0a7f889df9515f18b9b548433f412affed478d9"}, - {file = "torch-2.0.0-1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:ab2da16567cb55b67ae39e32d520d68ec736191d88ac79526ca5874754c32203"}, - {file = "torch-2.0.0-cp310-cp310-manylinux1_x86_64.whl", hash = "sha256:7a9319a67294ef02459a19738bbfa8727bb5307b822dadd708bc2ccf6c901aca"}, - {file = "torch-2.0.0-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:9f01fe1f6263f31bd04e1757946fd63ad531ae37f28bb2dbf66f5c826ee089f4"}, - {file = "torch-2.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:527f4ae68df7b8301ee6b1158ca56350282ea633686537b30dbb5d7b4a52622a"}, - {file = "torch-2.0.0-cp310-none-macosx_10_9_x86_64.whl", hash = "sha256:ce9b5a49bd513dff7950a5a07d6e26594dd51989cee05ba388b03e8e366fd5d5"}, - {file = "torch-2.0.0-cp310-none-macosx_11_0_arm64.whl", hash = "sha256:53e1c33c6896583cdb9a583693e22e99266444c4a43392dddc562640d39e542b"}, - {file = "torch-2.0.0-cp311-cp311-manylinux1_x86_64.whl", hash = "sha256:09651bff72e439d004c991f15add0c397c66f98ab36fe60d5514b44e4da722e8"}, - {file = "torch-2.0.0-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:d439aec349c98f12819e8564b8c54008e4613dd4428582af0e6e14c24ca85870"}, - {file = "torch-2.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:2802f84f021907deee7e9470ed10c0e78af7457ac9a08a6cd7d55adef835fede"}, - {file = "torch-2.0.0-cp311-none-macosx_10_9_x86_64.whl", hash = "sha256:01858620f25f25e7a9ec4b547ff38e5e27c92d38ec4ccba9cfbfb31d7071ed9c"}, - {file = "torch-2.0.0-cp311-none-macosx_11_0_arm64.whl", hash = "sha256:9a2e53b5783ef5896a6af338b36d782f28e83c8ddfc2ac44b67b066d9d76f498"}, - {file = "torch-2.0.0-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:ec5fff2447663e369682838ff0f82187b4d846057ef4d119a8dea7772a0b17dd"}, - {file = "torch-2.0.0-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:11b0384fe3c18c01b8fc5992e70fc519cde65e44c51cc87be1838c1803daf42f"}, - {file = "torch-2.0.0-cp38-cp38-win_amd64.whl", hash = "sha256:e54846aa63855298cfb1195487f032e413e7ac9cbfa978fda32354cc39551475"}, - {file = "torch-2.0.0-cp38-none-macosx_10_9_x86_64.whl", hash = "sha256:cc788cbbbbc6eb4c90e52c550efd067586c2693092cf367c135b34893a64ae78"}, - {file = "torch-2.0.0-cp38-none-macosx_11_0_arm64.whl", hash = "sha256:d292640f0fd72b7a31b2a6e3b635eb5065fcbedd4478f9cad1a1e7a9ec861d35"}, - {file = "torch-2.0.0-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:6befaad784004b7af357e3d87fa0863c1f642866291f12a4c2af2de435e8ac5c"}, - {file = "torch-2.0.0-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:a83b26bd6ae36fbf5fee3d56973d9816e2002e8a3b7d9205531167c28aaa38a7"}, - {file = "torch-2.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:c7e67195e1c3e33da53954b026e89a8e1ff3bc1aeb9eb32b677172d4a9b5dcbf"}, - {file = "torch-2.0.0-cp39-none-macosx_10_9_x86_64.whl", hash = "sha256:6e0b97beb037a165669c312591f242382e9109a240e20054d5a5782d9236cad0"}, - {file = "torch-2.0.0-cp39-none-macosx_11_0_arm64.whl", hash = "sha256:297a4919aff1c0f98a58ebe969200f71350a1d4d4f986dbfd60c02ffce780e99"}, + {file = "torch-2.0.1-cp310-cp310-manylinux1_x86_64.whl", hash = "sha256:8ced00b3ba471856b993822508f77c98f48a458623596a4c43136158781e306a"}, + {file = "torch-2.0.1-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:359bfaad94d1cda02ab775dc1cc386d585712329bb47b8741607ef6ef4950747"}, + {file = "torch-2.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:7c84e44d9002182edd859f3400deaa7410f5ec948a519cc7ef512c2f9b34d2c4"}, + {file = "torch-2.0.1-cp310-none-macosx_10_9_x86_64.whl", hash = "sha256:567f84d657edc5582d716900543e6e62353dbe275e61cdc36eda4929e46df9e7"}, + {file = "torch-2.0.1-cp310-none-macosx_11_0_arm64.whl", hash = "sha256:787b5a78aa7917465e9b96399b883920c88a08f4eb63b5a5d2d1a16e27d2f89b"}, + {file = "torch-2.0.1-cp311-cp311-manylinux1_x86_64.whl", hash = "sha256:e617b1d0abaf6ced02dbb9486803abfef0d581609b09641b34fa315c9c40766d"}, + {file = "torch-2.0.1-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:b6019b1de4978e96daa21d6a3ebb41e88a0b474898fe251fd96189587408873e"}, + {file = "torch-2.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:dbd68cbd1cd9da32fe5d294dd3411509b3d841baecb780b38b3b7b06c7754434"}, + {file = "torch-2.0.1-cp311-none-macosx_10_9_x86_64.whl", hash = "sha256:ef654427d91600129864644e35deea761fb1fe131710180b952a6f2e2207075e"}, + {file = "torch-2.0.1-cp311-none-macosx_11_0_arm64.whl", hash = "sha256:25aa43ca80dcdf32f13da04c503ec7afdf8e77e3a0183dd85cd3e53b2842e527"}, + {file = "torch-2.0.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:5ef3ea3d25441d3957348f7e99c7824d33798258a2bf5f0f0277cbcadad2e20d"}, + {file = "torch-2.0.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:0882243755ff28895e8e6dc6bc26ebcf5aa0911ed81b2a12f241fc4b09075b13"}, + {file = "torch-2.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:f66aa6b9580a22b04d0af54fcd042f52406a8479e2b6a550e3d9f95963e168c8"}, + {file = "torch-2.0.1-cp38-none-macosx_10_9_x86_64.whl", hash = "sha256:1adb60d369f2650cac8e9a95b1d5758e25d526a34808f7448d0bd599e4ae9072"}, + {file = "torch-2.0.1-cp38-none-macosx_11_0_arm64.whl", hash = "sha256:1bcffc16b89e296826b33b98db5166f990e3b72654a2b90673e817b16c50e32b"}, + {file = "torch-2.0.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:e10e1597f2175365285db1b24019eb6f04d53dcd626c735fc502f1e8b6be9875"}, + {file = "torch-2.0.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:423e0ae257b756bb45a4b49072046772d1ad0c592265c5080070e0767da4e490"}, + {file = "torch-2.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:8742bdc62946c93f75ff92da00e3803216c6cce9b132fbca69664ca38cfb3e18"}, + {file = "torch-2.0.1-cp39-none-macosx_10_9_x86_64.whl", hash = "sha256:c62df99352bd6ee5a5a8d1832452110435d178b5164de450831a3a8cc14dc680"}, + {file = "torch-2.0.1-cp39-none-macosx_11_0_arm64.whl", hash = "sha256:671a2565e3f63b8fe8e42ae3e36ad249fe5e567435ea27b94edaa672a7d0c416"}, ] [package.dependencies] filelock = "*" jinja2 = "*" networkx = "*" -nvidia-cublas-cu11 = {version = "11.10.3.66", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} -nvidia-cuda-cupti-cu11 = {version = "11.7.101", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} -nvidia-cuda-nvrtc-cu11 = {version = "11.7.99", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} -nvidia-cuda-runtime-cu11 = {version = "11.7.99", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} -nvidia-cudnn-cu11 = {version = "8.5.0.96", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} -nvidia-cufft-cu11 = {version = "10.9.0.58", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} -nvidia-curand-cu11 = {version = "10.2.10.91", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} -nvidia-cusolver-cu11 = {version = "11.4.0.1", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} -nvidia-cusparse-cu11 = {version = "11.7.4.91", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} -nvidia-nccl-cu11 = {version = "2.14.3", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} -nvidia-nvtx-cu11 = {version = "11.7.91", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} sympy = "*" -triton = {version = "2.0.0", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} typing-extensions = "*" [package.extras] @@ -2023,62 +2187,62 @@ files = [ [[package]] name = "torchvision" -version = "0.15.1" +version = "0.15.2" description = "image and video datasets and models for torch deep learning" category = "dev" optional = false python-versions = ">=3.8" files = [ - {file = "torchvision-0.15.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bc10d48e9a60d006d0c1b48dea87f1ec9b63d856737d592f7c5c44cd87f3f4b7"}, - {file = "torchvision-0.15.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3708d3410fdcaf6280e358cda9de2a4ab06cc0b4c0fd9aeeac550ec2563a887e"}, - {file = "torchvision-0.15.1-cp310-cp310-manylinux1_x86_64.whl", hash = "sha256:d4de10c837f1493c1c54344388e300a06c96914c6cc55fcb2527c21f2f010bbd"}, - {file = "torchvision-0.15.1-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:b82fcc5abc9b5c96495c76596a1573025cc1e09d97d2d6fda717c44b9ca45881"}, - {file = "torchvision-0.15.1-cp310-cp310-win_amd64.whl", hash = "sha256:c84e97d8cc4fe167d87adad0a2a6424cff90544365545b20669bc50e6ea46875"}, - {file = "torchvision-0.15.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:97b90eb3b7333a31d049c4ccfd1064361e8491874959d38f466af64d67418cef"}, - {file = "torchvision-0.15.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6b60e1c839ae2a071befbba69b17468d67feafdf576e90ff9645bfbee998de17"}, - {file = "torchvision-0.15.1-cp311-cp311-manylinux1_x86_64.whl", hash = "sha256:13f71a3372d9168b01481a754ebaa171207f3dc455bf2fd86906c69222443738"}, - {file = "torchvision-0.15.1-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:b2e8394726009090b40f6cc3a95cc878cc011dfac3d8e7a6060c79213d360880"}, - {file = "torchvision-0.15.1-cp311-cp311-win_amd64.whl", hash = "sha256:2852f501189483187ce9eb0ccd01b3f4f0918d29057e4a18b3cce8dad9a8a964"}, - {file = "torchvision-0.15.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:e5861baaeea87d19b6fd7d131e11a4a6bd17be14234c490a259bb360775e9520"}, - {file = "torchvision-0.15.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:e714f362b9d8217cf4d68509b679ebc9ddf128cfe80f6c1def8e3f8a18466e75"}, - {file = "torchvision-0.15.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:43624accad1e47f16824be4db37ad678dd89326ad90b69c9c6363eeb22b9467e"}, - {file = "torchvision-0.15.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:7fe9b0cd3311b0db9e6d45ffab594ced06418fa4e2aa15eb2e60d55e5c51135c"}, - {file = "torchvision-0.15.1-cp38-cp38-win_amd64.whl", hash = "sha256:b45324ea4911a23a4b00b5a15cdbe36d47f93137206dab9f8c606d81b69dd3a7"}, - {file = "torchvision-0.15.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1dfdec7c7df967330bba3341a781e0c047d4e0163e67164a9918500362bf7d91"}, - {file = "torchvision-0.15.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c153710186cec0338d4fff411459a57ddbc8504436123ca73b3f0bdc26ff918c"}, - {file = "torchvision-0.15.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:ff4e650aa601f32ab97bce06704868dd2baad69ca4d454fa1f0012a51199f2bc"}, - {file = "torchvision-0.15.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:e9b4bb2a15849391df0415d2f76dd36e6528e4253f7b69322b7a0d682535544b"}, - {file = "torchvision-0.15.1-cp39-cp39-win_amd64.whl", hash = "sha256:21e6beb69e77ef6575c4fdd0ab332b96e8a7f144eee0d333acff469c827a4b5e"}, + {file = "torchvision-0.15.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7754088774e810c5672b142a45dcf20b1bd986a5a7da90f8660c43dc43fb850c"}, + {file = "torchvision-0.15.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:37eb138e13f6212537a3009ac218695483a635c404b6cc1d8e0d0d978026a86d"}, + {file = "torchvision-0.15.2-cp310-cp310-manylinux1_x86_64.whl", hash = "sha256:54143f7cc0797d199b98a53b7d21c3f97615762d4dd17ad45a41c7e80d880e73"}, + {file = "torchvision-0.15.2-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:1eefebf5fbd01a95fe8f003d623d941601c94b5cec547b420da89cb369d9cf96"}, + {file = "torchvision-0.15.2-cp310-cp310-win_amd64.whl", hash = "sha256:96fae30c5ca8423f4b9790df0f0d929748e32718d88709b7b567d2f630c042e3"}, + {file = "torchvision-0.15.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5f35f6bd5bcc4568e6522e4137fa60fcc72f4fa3e615321c26cd87e855acd398"}, + {file = "torchvision-0.15.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:757505a0ab2be7096cb9d2bf4723202c971cceddb72c7952a7e877f773de0f8a"}, + {file = "torchvision-0.15.2-cp311-cp311-manylinux1_x86_64.whl", hash = "sha256:012ad25cfd9019ff9b0714a168727e3845029be1af82296ff1e1482931fa4b80"}, + {file = "torchvision-0.15.2-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:b02a7ffeaa61448737f39a4210b8ee60234bda0515a0c0d8562f884454105b0f"}, + {file = "torchvision-0.15.2-cp311-cp311-win_amd64.whl", hash = "sha256:10be76ceded48329d0a0355ac33da131ee3993ff6c125e4a02ab34b5baa2472c"}, + {file = "torchvision-0.15.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8f12415b686dba884fb086f53ac803f692be5a5cdd8a758f50812b30fffea2e4"}, + {file = "torchvision-0.15.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:31211c01f8b8ec33b8a638327b5463212e79a03e43c895f88049f97af1bd12fd"}, + {file = "torchvision-0.15.2-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:c55f9889e436f14b4f84a9c00ebad0d31f5b4626f10cf8018e6c676f92a6d199"}, + {file = "torchvision-0.15.2-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:9a192f2aa979438f23c20e883980b23d13268ab9f819498774a6d2eb021802c2"}, + {file = "torchvision-0.15.2-cp38-cp38-win_amd64.whl", hash = "sha256:c07071bc8d02aa8fcdfe139ab6a1ef57d3b64c9e30e84d12d45c9f4d89fb6536"}, + {file = "torchvision-0.15.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4790260fcf478a41c7ecc60a6d5200a88159fdd8d756e9f29f0f8c59c4a67a68"}, + {file = "torchvision-0.15.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:987ab62225b4151a11e53fd06150c5258ced24ac9d7c547e0e4ab6fbca92a5ce"}, + {file = "torchvision-0.15.2-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:63df26673e66cba3f17e07c327a8cafa3cce98265dbc3da329f1951d45966838"}, + {file = "torchvision-0.15.2-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:b85f98d4cc2f72452f6792ab4463a3541bc5678a8cdd3da0e139ba2fe8b56d42"}, + {file = "torchvision-0.15.2-cp39-cp39-win_amd64.whl", hash = "sha256:07c462524cc1bba5190c16a9d47eac1fca024d60595a310f23c00b4ffff18b30"}, ] [package.dependencies] numpy = "*" pillow = ">=5.3.0,<8.3.0 || >=8.4.0" requests = "*" -torch = "2.0.0" +torch = "2.0.1" [package.extras] scipy = ["scipy"] [[package]] name = "tornado" -version = "6.3" +version = "6.3.1" description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed." category = "dev" optional = false python-versions = ">= 3.8" files = [ - {file = "tornado-6.3-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:6cfff1e9c15c79e106b8352269d201f8fc0815914a6260f3893ca18b724ea94b"}, - {file = "tornado-6.3-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:6164571f5b9f73143d1334df4584cb9ac86d20c461e17b6c189a19ead8bb93c1"}, - {file = "tornado-6.3-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4546003dc8b5733489139d3bff5fa6a0211be505faf819bd9970e7c2b32e8122"}, - {file = "tornado-6.3-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c659ab04d5aa477dbe44152c67d93f3ad3243b992d94f795ca1d5c73c37337ce"}, - {file = "tornado-6.3-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:912df5712024564e362ecce43c8d5862e14c78c8dd3846c9d889d44fbd7f4951"}, - {file = "tornado-6.3-cp38-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:c37b6a384d54ce6a31168d40ab21ad2591ddaf34973075cc0cad154402ecd9e8"}, - {file = "tornado-6.3-cp38-abi3-musllinux_1_1_i686.whl", hash = "sha256:c9114a61a4588c09065b9996ae05462350d17160b92b9bf9a1e93689cc0424dc"}, - {file = "tornado-6.3-cp38-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:4d349846931557b7ec92f224b5d598b160e2ba26ae1812480b42e9622c884bf7"}, - {file = "tornado-6.3-cp38-abi3-win32.whl", hash = "sha256:d7b737e18f701de3e4a3b0824260b4d740e4d60607b8089bb80e80ffd464780e"}, - {file = "tornado-6.3-cp38-abi3-win_amd64.whl", hash = "sha256:720f53e6367b38190ae7fa398c25c086c69d88b3c6535bd6021a126b727fb5cd"}, - {file = "tornado-6.3.tar.gz", hash = "sha256:d68f3192936ff2c4add04dc21a436a43b4408d466746b78bb2b9d0a53a18683f"}, + {file = "tornado-6.3.1-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:db181eb3df8738613ff0a26f49e1b394aade05034b01200a63e9662f347d4415"}, + {file = "tornado-6.3.1-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:b4e7b956f9b5e6f9feb643ea04f07e7c6b49301e03e0023eedb01fa8cf52f579"}, + {file = "tornado-6.3.1-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9661aa8bc0e9d83d757cd95b6f6d1ece8ca9fd1ccdd34db2de381e25bf818233"}, + {file = "tornado-6.3.1-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:81c17e0cc396908a5e25dc8e9c5e4936e6dfd544c9290be48bd054c79bcad51e"}, + {file = "tornado-6.3.1-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a27a1cfa9997923f80bdd962b3aab048ac486ad8cfb2f237964f8ab7f7eb824b"}, + {file = "tornado-6.3.1-cp38-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:d7117f3c7ba5d05813b17a1f04efc8e108a1b811ccfddd9134cc68553c414864"}, + {file = "tornado-6.3.1-cp38-abi3-musllinux_1_1_i686.whl", hash = "sha256:ffdce65a281fd708da5a9def3bfb8f364766847fa7ed806821a69094c9629e8a"}, + {file = "tornado-6.3.1-cp38-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:90f569a35a8ec19bde53aa596952071f445da678ec8596af763b9b9ce07605e6"}, + {file = "tornado-6.3.1-cp38-abi3-win32.whl", hash = "sha256:3455133b9ff262fd0a75630af0a8ee13564f25fb4fd3d9ce239b8a7d3d027bf8"}, + {file = "tornado-6.3.1-cp38-abi3-win_amd64.whl", hash = "sha256:1285f0691143f7ab97150831455d4db17a267b59649f7bd9700282cba3d5e771"}, + {file = "tornado-6.3.1.tar.gz", hash = "sha256:5e2f49ad371595957c50e42dd7e5c14d64a6843a3cf27352b69c706d1b5918af"}, ] [[package]] @@ -2103,48 +2267,26 @@ slack = ["slack-sdk"] telegram = ["requests"] [[package]] -name = "triton" -version = "2.0.0" -description = "A language and compiler for custom Deep Learning operations" -category = "dev" +name = "traitlets" +version = "5.9.0" +description = "Traitlets Python configuration system" +category = "main" optional = false -python-versions = "*" +python-versions = ">=3.7" files = [ - {file = "triton-2.0.0-1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:38806ee9663f4b0f7cd64790e96c579374089e58f49aac4a6608121aa55e2505"}, - {file = "triton-2.0.0-1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:226941c7b8595219ddef59a1fdb821e8c744289a132415ddd584facedeb475b1"}, - {file = "triton-2.0.0-1-cp36-cp36m-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:4c9fc8c89874bc48eb7e7b2107a9b8d2c0bf139778637be5bfccb09191685cfd"}, - {file = "triton-2.0.0-1-cp37-cp37m-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d2684b6a60b9f174f447f36f933e9a45f31db96cb723723ecd2dcfd1c57b778b"}, - {file = "triton-2.0.0-1-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:9d4978298b74fcf59a75fe71e535c092b023088933b2f1df933ec32615e4beef"}, - {file = "triton-2.0.0-1-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:74f118c12b437fb2ca25e1a04759173b517582fcf4c7be11913316c764213656"}, - {file = "triton-2.0.0-1-pp37-pypy37_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:9618815a8da1d9157514f08f855d9e9ff92e329cd81c0305003eb9ec25cc5add"}, - {file = "triton-2.0.0-1-pp38-pypy38_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1aca3303629cd3136375b82cb9921727f804e47ebee27b2677fef23005c3851a"}, - {file = "triton-2.0.0-1-pp39-pypy39_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:e3e13aa8b527c9b642e3a9defcc0fbd8ffbe1c80d8ac8c15a01692478dc64d8a"}, - {file = "triton-2.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f05a7e64e4ca0565535e3d5d3405d7e49f9d308505bb7773d21fb26a4c008c2"}, - {file = "triton-2.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bb4b99ca3c6844066e516658541d876c28a5f6e3a852286bbc97ad57134827fd"}, - {file = "triton-2.0.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47b4d70dc92fb40af553b4460492c31dc7d3a114a979ffb7a5cdedb7eb546c08"}, - {file = "triton-2.0.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fedce6a381901b1547e0e7e1f2546e4f65dca6d91e2d8a7305a2d1f5551895be"}, - {file = "triton-2.0.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75834f27926eab6c7f00ce73aaf1ab5bfb9bec6eb57ab7c0bfc0a23fac803b4c"}, - {file = "triton-2.0.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0117722f8c2b579cd429e0bee80f7731ae05f63fe8e9414acd9a679885fcbf42"}, - {file = "triton-2.0.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bcd9be5d0c2e45d2b7e6ddc6da20112b6862d69741576f9c3dbaf941d745ecae"}, - {file = "triton-2.0.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42a0d2c3fc2eab4ba71384f2e785fbfd47aa41ae05fa58bf12cb31dcbd0aeceb"}, - {file = "triton-2.0.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:52c47b72c72693198163ece9d90a721299e4fb3b8e24fd13141e384ad952724f"}, + {file = "traitlets-5.9.0-py3-none-any.whl", hash = "sha256:9e6ec080259b9a5940c797d58b613b5e31441c2257b87c2e795c5228ae80d2d8"}, + {file = "traitlets-5.9.0.tar.gz", hash = "sha256:f6cde21a9c68cf756af02035f72d5a723bf607e862e7be33ece505abf4a3bad9"}, ] -[package.dependencies] -cmake = "*" -filelock = "*" -lit = "*" -torch = "*" - [package.extras] -tests = ["autopep8", "flake8", "isort", "numpy", "pytest", "scipy (>=1.7.1)"] -tutorials = ["matplotlib", "pandas", "tabulate"] +docs = ["myst-parser", "pydata-sphinx-theme", "sphinx"] +test = ["argcomplete (>=2.0)", "pre-commit", "pytest", "pytest-mock"] [[package]] name = "typing-extensions" version = "4.5.0" description = "Backported and Experimental Type Hints for Python 3.7+" -category = "dev" +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -2166,20 +2308,21 @@ files = [ [[package]] name = "urllib3" -version = "1.26.15" +version = "2.0.2" description = "HTTP library with thread-safe connection pooling, file post, and more." category = "dev" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" +python-versions = ">=3.7" files = [ - {file = "urllib3-1.26.15-py2.py3-none-any.whl", hash = "sha256:aa751d169e23c7479ce47a0cb0da579e3ede798f994f5816a74e4f4500dcea42"}, - {file = "urllib3-1.26.15.tar.gz", hash = "sha256:8a388717b9476f934a21484e8c8e61875ab60644d29b9b39e11e4b9dc1c6b305"}, + {file = "urllib3-2.0.2-py3-none-any.whl", hash = "sha256:d055c2f9d38dc53c808f6fdc8eab7360b6fdbbde02340ed25cfbcd817c62469e"}, + {file = "urllib3-2.0.2.tar.gz", hash = "sha256:61717a1095d7e155cdb737ac7bb2f4324a858a1e2e6466f6d03ff630ca68d3cc"}, ] [package.extras] -brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)", "brotlipy (>=0.6.0)"] -secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "ipaddress", "pyOpenSSL (>=0.14)", "urllib3-secure-extra"] -socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] +brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] +secure = ["certifi", "cryptography (>=1.9)", "idna (>=2.0.0)", "pyopenssl (>=17.1.0)", "urllib3-secure-extra"] +socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] +zstd = ["zstandard (>=0.18.0)"] [[package]] name = "visdom" @@ -2204,6 +2347,18 @@ torchfile = "*" tornado = "*" websocket-client = "*" +[[package]] +name = "wcwidth" +version = "0.2.6" +description = "Measures the displayed width of unicode strings in a terminal" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "wcwidth-0.2.6-py2.py3-none-any.whl", hash = "sha256:795b138f6875577cd91bba52baf9e445cd5118fd32723b460e30a0af30ea230e"}, + {file = "wcwidth-0.2.6.tar.gz", hash = "sha256:a5220780a404dbe3353789870978e472cfe477761f06ee55077256e509b156d0"}, +] + [[package]] name = "websocket-client" version = "1.5.1" @@ -2221,21 +2376,6 @@ docs = ["Sphinx (>=3.4)", "sphinx-rtd-theme (>=0.5)"] optional = ["python-socks", "wsaccel"] test = ["websockets"] -[[package]] -name = "wheel" -version = "0.40.0" -description = "A built-package format for Python" -category = "dev" -optional = false -python-versions = ">=3.7" -files = [ - {file = "wheel-0.40.0-py3-none-any.whl", hash = "sha256:d236b20e7cb522daf2390fa84c55eea81c5c30190f90f29ae2ca1ad8355bf247"}, - {file = "wheel-0.40.0.tar.gz", hash = "sha256:cd1196f3faee2b31968d626e1731c94f99cbdb67cf5a46e4f5656cbee7738873"}, -] - -[package.extras] -test = ["pytest (>=6.0.0)"] - [[package]] name = "zipp" version = "3.15.0" @@ -2254,5 +2394,5 @@ testing = ["big-O", "flake8 (<5)", "jaraco.functools", "jaraco.itertools", "more [metadata] lock-version = "2.0" -python-versions = ">=3.8,<3.11" -content-hash = "3b536b6f11d2272abc40dd16fb00b87dddb7cf772747aead558d8b141b7ddd88" +python-versions = ">=3.9,<3.11" +content-hash = "ce69b0375995f4c906f8fdeb075bdded74a547bcfd0ff553a53b3cd8b4b5b988" diff --git a/pydiffvg/parse_svg.py b/pydiffvg/parse_svg.py index 0b08fdd..f1cf56c 100644 --- a/pydiffvg/parse_svg.py +++ b/pydiffvg/parse_svg.py @@ -586,13 +586,17 @@ def obj_to_scene(filename): """ Load from a obj file and convert to PyTorch tensors. """ - f = open(filename) - lines = f.readlines() + with open(filename, 'r') as f: + lines = f.readlines() + data_lines = [] vertices = [] faces = [] for line in lines: l=line.split() + # Ignore empty lines + if not l: + continue #vertex if(l[0] == "v"): vertices.append(l) diff --git a/pydiffvg/render_pytorch.py b/pydiffvg/render_pytorch.py index a686fb1..1f10c41 100644 --- a/pydiffvg/render_pytorch.py +++ b/pydiffvg/render_pytorch.py @@ -7,6 +7,9 @@ import warnings print_timing = False +def popmult(lst, n): + return (lst[:n], lst[n:]) + def set_print_timing(val): global print_timing print_timing=val @@ -35,98 +38,128 @@ class RenderFunction(torch.autograd.Function): """ num_shapes = len(shapes) num_shape_groups = len(shape_groups) - args = [] - args.append(canvas_width) - args.append(canvas_height) - args.append(num_shapes) - args.append(num_shape_groups) - args.append(output_type) - args.append(use_prefiltering) - args.append(eval_positions.to(pydiffvg.get_device())) + args = [canvas_width, + canvas_height, + num_shapes, + num_shape_groups, + output_type, + use_prefiltering, + eval_positions.to(pydiffvg.get_device())] + for shape in shapes: use_thickness = False if isinstance(shape, pydiffvg.Circle): - assert(shape.center.is_contiguous()) - args.append(diffvg.ShapeType.circle) - args.append(shape.radius.cpu()) - args.append(shape.center.cpu()) + assert shape.center.is_contiguous() + args += [ + diffvg.ShapeType.circle, + shape.radius.cpu(), + shape.center.cpu() + ] elif isinstance(shape, pydiffvg.Ellipse): - assert(shape.radius.is_contiguous()) - assert(shape.center.is_contiguous()) - args.append(diffvg.ShapeType.ellipse) - args.append(shape.radius.cpu()) - args.append(shape.center.cpu()) + assert shape.radius.is_contiguous() + assert shape.center.is_contiguous() + args += [ + diffvg.ShapeType.ellipse, + shape.radius.cpu(), + shape.center.cpu() + ] elif isinstance(shape, pydiffvg.Path): - assert(shape.num_control_points.is_contiguous()) - assert(shape.points.is_contiguous()) - assert(shape.points.shape[1] == 2) - assert(torch.isfinite(shape.points).all()) - args.append(diffvg.ShapeType.path) - args.append(shape.num_control_points.to(torch.int32).cpu()) - args.append(shape.points.cpu()) + assert shape.num_control_points.is_contiguous() + assert shape.points.is_contiguous() + assert shape.points.shape[1] == 2 + assert torch.isfinite(shape.points).all() + + args += [ + diffvg.ShapeType.path, + shape.num_control_points.to(torch.int32).cpu(), + shape.points.cpu() + ] + if len(shape.stroke_width.shape) > 0 and shape.stroke_width.shape[0] > 1: - assert(torch.isfinite(shape.stroke_width).all()) + assert torch.isfinite(shape.stroke_width).all() use_thickness = True args.append(shape.stroke_width.cpu()) else: args.append(None) - args.append(shape.is_closed) - args.append(shape.use_distance_approx) + + args += [shape.is_closed, shape.use_distance_approx] elif isinstance(shape, pydiffvg.Polygon): - assert(shape.points.is_contiguous()) - assert(shape.points.shape[1] == 2) + assert shape.points.is_contiguous() + assert shape.points.shape[1] == 2 + args.append(diffvg.ShapeType.path) + if shape.is_closed: args.append(torch.zeros(shape.points.shape[0], dtype = torch.int32)) else: args.append(torch.zeros(shape.points.shape[0] - 1, dtype = torch.int32)) - args.append(shape.points.cpu()) - args.append(None) - args.append(shape.is_closed) - args.append(False) # use_distance_approx + + args += [ + shape.points.cpu(), + None, + shape.is_closed(), + False # use_distance_approx + ] + elif isinstance(shape, pydiffvg.Rect): - assert(shape.p_min.is_contiguous()) - assert(shape.p_max.is_contiguous()) - args.append(diffvg.ShapeType.rect) - args.append(shape.p_min.cpu()) - args.append(shape.p_max.cpu()) + assert shape.p_min.is_contiguous() + assert shape.p_max.is_contiguous() + + args += [ + diffvg.ShapeType.rect, + shape.p_min.cpu(), + shape.p_max.cpu() + ] else: - assert(False) + assert False + if use_thickness: args.append(torch.tensor(0.0)) else: args.append(shape.stroke_width.cpu()) for shape_group in shape_groups: - assert(shape_group.shape_ids.is_contiguous()) + assert shape_group.shape_ids.is_contiguous() args.append(shape_group.shape_ids.to(torch.int32).cpu()) # Fill color if shape_group.fill_color is None: args.append(None) + elif isinstance(shape_group.fill_color, torch.Tensor): - assert(shape_group.fill_color.is_contiguous()) - args.append(diffvg.ColorType.constant) - args.append(shape_group.fill_color.cpu()) + assert shape_group.fill_color.is_contiguous() + + args += [ + diffvg.ColorType.constant, + shape_group.fill_color.cpu() + ] + elif isinstance(shape_group.fill_color, pydiffvg.LinearGradient): - assert(shape_group.fill_color.begin.is_contiguous()) - assert(shape_group.fill_color.end.is_contiguous()) - assert(shape_group.fill_color.offsets.is_contiguous()) - assert(shape_group.fill_color.stop_colors.is_contiguous()) - args.append(diffvg.ColorType.linear_gradient) - args.append(shape_group.fill_color.begin.cpu()) - args.append(shape_group.fill_color.end.cpu()) - args.append(shape_group.fill_color.offsets.cpu()) - args.append(shape_group.fill_color.stop_colors.cpu()) + assert shape_group.fill_color.begin.is_contiguous() + assert shape_group.fill_color.end.is_contiguous() + assert shape_group.fill_color.offsets.is_contiguous() + assert shape_group.fill_color.stop_colors.is_contiguous() + + args += [ + diffvg.ColorType.linear_gradient, + shape_group.fill_color.begin.cpu(), + shape_group.fill_color.end.cpu(), + shape_group.fill_color.offsets.cpu(), + shape_group.fill_color.stop_colors.cpu(), + ] + elif isinstance(shape_group.fill_color, pydiffvg.RadialGradient): - assert(shape_group.fill_color.center.is_contiguous()) - assert(shape_group.fill_color.radius.is_contiguous()) - assert(shape_group.fill_color.offsets.is_contiguous()) - assert(shape_group.fill_color.stop_colors.is_contiguous()) - args.append(diffvg.ColorType.radial_gradient) - args.append(shape_group.fill_color.center.cpu()) - args.append(shape_group.fill_color.radius.cpu()) - args.append(shape_group.fill_color.offsets.cpu()) - args.append(shape_group.fill_color.stop_colors.cpu()) + assert shape_group.fill_color.center.is_contiguous() + assert shape_group.fill_color.radius.is_contiguous() + assert shape_group.fill_color.offsets.is_contiguous() + assert shape_group.fill_color.stop_colors.is_contiguous() + + args += [ + diffvg.ColorType.radial_gradient, + shape_group.fill_color.center.cpu(), + shape_group.fill_color.radius.cpu(), + shape_group.fill_color.offsets.cpu(), + shape_group.fill_color.stop_colors.cpu() + ] if shape_group.fill_color is not None: # go through the underlying shapes and check if they are all closed @@ -138,35 +171,44 @@ class RenderFunction(torch.autograd.Function): # Stroke color if shape_group.stroke_color is None: args.append(None) + elif isinstance(shape_group.stroke_color, torch.Tensor): - assert(shape_group.stroke_color.is_contiguous()) - args.append(diffvg.ColorType.constant) - args.append(shape_group.stroke_color.cpu()) + assert shape_group.stroke_color.is_contiguous() + args += [ diffvg.ColorType.constant, shape_group.stroke_color.cpu() ] + elif isinstance(shape_group.stroke_color, pydiffvg.LinearGradient): - assert(shape_group.stroke_color.begin.is_contiguous()) - assert(shape_group.stroke_color.end.is_contiguous()) - assert(shape_group.stroke_color.offsets.is_contiguous()) - assert(shape_group.stroke_color.stop_colors.is_contiguous()) - assert(torch.isfinite(shape_group.stroke_color.stop_colors).all()) - args.append(diffvg.ColorType.linear_gradient) - args.append(shape_group.stroke_color.begin.cpu()) - args.append(shape_group.stroke_color.end.cpu()) - args.append(shape_group.stroke_color.offsets.cpu()) - args.append(shape_group.stroke_color.stop_colors.cpu()) + assert shape_group.stroke_color.begin.is_contiguous() + assert shape_group.stroke_color.end.is_contiguous() + assert shape_group.stroke_color.offsets.is_contiguous() + assert shape_group.stroke_color.stop_colors.is_contiguous() + assert torch.isfinite(shape_group.stroke_color.stop_colors).all() + + args += [ + diffvg.ColorType.linear_gradient, + shape_group.stroke_color.begin.cpu(), + shape_group.stroke_color.end.cpu(), + shape_group.stroke_color.offsets.cpu(), + shape_group.stroke_color.stop_colors.cpu() + ] + elif isinstance(shape_group.stroke_color, pydiffvg.RadialGradient): - assert(shape_group.stroke_color.center.is_contiguous()) - assert(shape_group.stroke_color.radius.is_contiguous()) - assert(shape_group.stroke_color.offsets.is_contiguous()) - assert(shape_group.stroke_color.stop_colors.is_contiguous()) - assert(torch.isfinite(shape_group.stroke_color.stop_colors).all()) - args.append(diffvg.ColorType.radial_gradient) - args.append(shape_group.stroke_color.center.cpu()) - args.append(shape_group.stroke_color.radius.cpu()) - args.append(shape_group.stroke_color.offsets.cpu()) - args.append(shape_group.stroke_color.stop_colors.cpu()) - args.append(shape_group.use_even_odd_rule) - # Transformation - args.append(shape_group.shape_to_canvas.contiguous().cpu()) + assert shape_group.stroke_color.center.is_contiguous() + assert shape_group.stroke_color.radius.is_contiguous() + assert shape_group.stroke_color.offsets.is_contiguous() + assert shape_group.stroke_color.stop_colors.is_contiguous() + assert torch.isfinite(shape_group.stroke_color.stop_colors).all() + + args += [ + diffvg.ColorType.radial_gradient, + shape_group.stroke_color.center.cpu(), + shape_group.stroke_color.radius.cpu(), + shape_group.stroke_color.offsets.cpu(), + shape_group.stroke_color.stop_colors.cpu() + ] + + args += [ shape_group.use_even_odd_rule, + shape_group.shape_to_canvas.contiguous().cpu() ] + args.append(filter.type) args.append(filter.radius.cpu()) return args @@ -184,52 +226,31 @@ class RenderFunction(torch.autograd.Function): Forward rendering pass. """ # Unpack arguments - current_index = 0 - canvas_width = args[current_index] - current_index += 1 - canvas_height = args[current_index] - current_index += 1 - num_shapes = args[current_index] - current_index += 1 - num_shape_groups = args[current_index] - current_index += 1 - output_type = args[current_index] - current_index += 1 - use_prefiltering = args[current_index] - current_index += 1 - eval_positions = args[current_index] - current_index += 1 + args = list(args) + + (canvas_width, canvas_height, num_shapes, + num_shape_groups, output_type, use_prefiltering, eval_positions), args = popmult(args, 7) + shapes = [] shape_groups = [] shape_contents = [] # Important to avoid GC deleting the shapes color_contents = [] # Same as above for shape_id in range(num_shapes): - shape_type = args[current_index] - current_index += 1 + shape_type = args.pop(0) if shape_type == diffvg.ShapeType.circle: - radius = args[current_index] - current_index += 1 - center = args[current_index] - current_index += 1 + (radius, center), args = popmult(args, 2) + shape = diffvg.Circle(radius, diffvg.Vector2f(center[0], center[1])) elif shape_type == diffvg.ShapeType.ellipse: - radius = args[current_index] - current_index += 1 - center = args[current_index] - current_index += 1 + (radius, center), args = popmult(args, 2) + shape = diffvg.Ellipse(diffvg.Vector2f(radius[0], radius[1]), diffvg.Vector2f(center[0], center[1])) elif shape_type == diffvg.ShapeType.path: - num_control_points = args[current_index] - current_index += 1 - points = args[current_index] - current_index += 1 - thickness = args[current_index] - current_index += 1 - is_closed = args[current_index] - current_index += 1 - use_distance_approx = args[current_index] - current_index += 1 + + (num_control_points, points, thickness, + is_closed, use_distance_approx), args = popmult(args, 5) + shape = diffvg.Path(diffvg.int_ptr(num_control_points.data_ptr()), diffvg.float_ptr(points.data_ptr()), diffvg.float_ptr(thickness.data_ptr() if thickness is not None else 0), @@ -238,55 +259,36 @@ class RenderFunction(torch.autograd.Function): is_closed, use_distance_approx) elif shape_type == diffvg.ShapeType.rect: - p_min = args[current_index] - current_index += 1 - p_max = args[current_index] - current_index += 1 + (p_min, p_max), args = popmult(args, 2) shape = diffvg.Rect(diffvg.Vector2f(p_min[0], p_min[1]), diffvg.Vector2f(p_max[0], p_max[1])) else: - assert(False) - stroke_width = args[current_index] - current_index += 1 + assert False + + stroke_width = args.pop(0) shapes.append(diffvg.Shape(\ shape_type, shape.get_ptr(), stroke_width.item())) shape_contents.append(shape) for shape_group_id in range(num_shape_groups): - shape_ids = args[current_index] - current_index += 1 - fill_color_type = args[current_index] - current_index += 1 + (shape_ids, fill_color_type), args = popmult(args, 2) if fill_color_type == diffvg.ColorType.constant: - color = args[current_index] - current_index += 1 + color = args.pop(0) fill_color = diffvg.Constant(\ diffvg.Vector4f(color[0], color[1], color[2], color[3])) elif fill_color_type == diffvg.ColorType.linear_gradient: - beg = args[current_index] - current_index += 1 - end = args[current_index] - current_index += 1 - offsets = args[current_index] - current_index += 1 - stop_colors = args[current_index] - current_index += 1 - assert(offsets.shape[0] == stop_colors.shape[0]) + (beg, end, offsets, stop_colors), args = popmult(args, 4) + + assert offsets.shape[0] == stop_colors.shape[0] fill_color = diffvg.LinearGradient(diffvg.Vector2f(beg[0], beg[1]), diffvg.Vector2f(end[0], end[1]), offsets.shape[0], diffvg.float_ptr(offsets.data_ptr()), diffvg.float_ptr(stop_colors.data_ptr())) elif fill_color_type == diffvg.ColorType.radial_gradient: - center = args[current_index] - current_index += 1 - radius = args[current_index] - current_index += 1 - offsets = args[current_index] - current_index += 1 - stop_colors = args[current_index] - current_index += 1 - assert(offsets.shape[0] == stop_colors.shape[0]) + (center, radius, offsets, stop_colors), args = popmult(args, 4) + + assert offsets.shape[0] == stop_colors.shape[0] fill_color = diffvg.RadialGradient(diffvg.Vector2f(center[0], center[1]), diffvg.Vector2f(radius[0], radius[1]), offsets.shape[0], @@ -295,39 +297,28 @@ class RenderFunction(torch.autograd.Function): elif fill_color_type is None: fill_color = None else: - assert(False) - stroke_color_type = args[current_index] - current_index += 1 + assert False + + stroke_color_type = args.pop(0) if stroke_color_type == diffvg.ColorType.constant: - color = args[current_index] - current_index += 1 + color = args.pop(0) stroke_color = diffvg.Constant(\ diffvg.Vector4f(color[0], color[1], color[2], color[3])) + elif stroke_color_type == diffvg.ColorType.linear_gradient: - beg = args[current_index] - current_index += 1 - end = args[current_index] - current_index += 1 - offsets = args[current_index] - current_index += 1 - stop_colors = args[current_index] - current_index += 1 - assert(offsets.shape[0] == stop_colors.shape[0]) + (beg, end, offsets, stop_colors), args = popmult(args, 4) + + assert offsets.shape[0] == stop_colors.shape[0] stroke_color = diffvg.LinearGradient(diffvg.Vector2f(beg[0], beg[1]), diffvg.Vector2f(end[0], end[1]), offsets.shape[0], diffvg.float_ptr(offsets.data_ptr()), diffvg.float_ptr(stop_colors.data_ptr())) + elif stroke_color_type == diffvg.ColorType.radial_gradient: - center = args[current_index] - current_index += 1 - radius = args[current_index] - current_index += 1 - offsets = args[current_index] - current_index += 1 - stop_colors = args[current_index] - current_index += 1 - assert(offsets.shape[0] == stop_colors.shape[0]) + (center, radius, offsets, stop_colors), args = popmult(args, 4) + + assert offsets.shape[0] == stop_colors.shape[0] stroke_color = diffvg.RadialGradient(diffvg.Vector2f(center[0], center[1]), diffvg.Vector2f(radius[0], radius[1]), offsets.shape[0], @@ -335,17 +326,18 @@ class RenderFunction(torch.autograd.Function): diffvg.float_ptr(stop_colors.data_ptr())) elif stroke_color_type is None: stroke_color = None + else: - assert(False) - use_even_odd_rule = args[current_index] - current_index += 1 - shape_to_canvas = args[current_index] - current_index += 1 + assert False + + (use_even_odd_rule, shape_to_canvas), args = popmult(args, 2) if fill_color is not None: color_contents.append(fill_color) + if stroke_color is not None: color_contents.append(stroke_color) + shape_groups.append(diffvg.ShapeGroup(\ diffvg.int_ptr(shape_ids.data_ptr()), shape_ids.shape[0], @@ -356,10 +348,7 @@ class RenderFunction(torch.autograd.Function): use_even_odd_rule, diffvg.float_ptr(shape_to_canvas.data_ptr()))) - filter_type = args[current_index] - current_index += 1 - filter_radius = args[current_index] - current_index += 1 + (filter_type, filter_radius), args = popmult(args, 2) filt = diffvg.Filter(filter_type, filter_radius) start = time.time() @@ -367,15 +356,16 @@ class RenderFunction(torch.autograd.Function): shapes, shape_groups, filt, pydiffvg.get_use_gpu(), pydiffvg.get_device().index if pydiffvg.get_device().index is not None else -1) time_elapsed = time.time() - start + global print_timing if print_timing: print('Scene construction, time: %.5f s' % time_elapsed) if output_type == OutputType.color: - assert(eval_positions.shape[0] == 0) + assert eval_positions.shape[0] == 0 rendered_image = torch.zeros(height, width, 4, device = pydiffvg.get_device()) else: - assert(output_type == OutputType.sdf) + assert output_type == OutputType.sdf if eval_positions.shape[0] == 0: rendered_image = torch.zeros(height, width, 1, device = pydiffvg.get_device()) else: @@ -386,9 +376,10 @@ class RenderFunction(torch.autograd.Function): if background_image.shape[2] == 3: raise NotImplementedError('Background image must have 4 channels, not 3. Add a fourth channel with all ones via torch.ones().') background_image = background_image.contiguous() - assert(background_image.shape[0] == rendered_image.shape[0]) - assert(background_image.shape[1] == rendered_image.shape[1]) - assert(background_image.shape[2] == 4) + + assert background_image.shape[0] == rendered_image.shape[0] + assert background_image.shape[1] == rendered_image.shape[1] + assert background_image.shape[2] == 4 start = time.time() diffvg.render(scene, @@ -407,7 +398,7 @@ class RenderFunction(torch.autograd.Function): use_prefiltering, diffvg.float_ptr(eval_positions.data_ptr()), eval_positions.shape[0]) - assert(torch.isfinite(rendered_image).all()) + assert torch.isfinite(rendered_image).all() time_elapsed = time.time() - start if print_timing: print('Forward pass, time: %.5f s' % time_elapsed) @@ -438,55 +429,33 @@ class RenderFunction(torch.autograd.Function): *args): if not grad_img.is_contiguous(): grad_img = grad_img.contiguous() - assert(torch.isfinite(grad_img).all()) + assert torch.isfinite(grad_img).all() + args = list(args) # Unpack arguments - current_index = 0 - canvas_width = args[current_index] - current_index += 1 - canvas_height = args[current_index] - current_index += 1 - num_shapes = args[current_index] - current_index += 1 - num_shape_groups = args[current_index] - current_index += 1 - output_type = args[current_index] - current_index += 1 - use_prefiltering = args[current_index] - current_index += 1 - eval_positions = args[current_index] - current_index += 1 + (canvas_width, canvas_height, num_shapes, + num_shape_groups, output_type, use_prefiltering, + eval_positions), args = popmult(args, 7) + shapes = [] shape_groups = [] shape_contents = [] # Important to avoid GC deleting the shapes color_contents = [] # Same as above for shape_id in range(num_shapes): - shape_type = args[current_index] - current_index += 1 + shape_type = args.pop(0) if shape_type == diffvg.ShapeType.circle: - radius = args[current_index] - current_index += 1 - center = args[current_index] - current_index += 1 + (radius, center), args = popmult(args, 2) + shape = diffvg.Circle(radius, diffvg.Vector2f(center[0], center[1])) elif shape_type == diffvg.ShapeType.ellipse: - radius = args[current_index] - current_index += 1 - center = args[current_index] - current_index += 1 + (radius, center), args = popmult(args, 2) + shape = diffvg.Ellipse(diffvg.Vector2f(radius[0], radius[1]), diffvg.Vector2f(center[0], center[1])) elif shape_type == diffvg.ShapeType.path: - num_control_points = args[current_index] - current_index += 1 - points = args[current_index] - current_index += 1 - thickness = args[current_index] - current_index += 1 - is_closed = args[current_index] - current_index += 1 - use_distance_approx = args[current_index] - current_index += 1 + (num_control_points, points, thickness, + is_closed, use_distance_approx), args = popmult(args, 5) + shape = diffvg.Path(diffvg.int_ptr(num_control_points.data_ptr()), diffvg.float_ptr(points.data_ptr()), diffvg.float_ptr(thickness.data_ptr() if thickness is not None else 0), @@ -495,114 +464,93 @@ class RenderFunction(torch.autograd.Function): is_closed, use_distance_approx) elif shape_type == diffvg.ShapeType.rect: - p_min = args[current_index] - current_index += 1 - p_max = args[current_index] - current_index += 1 + (p_min, p_max), args = popmult(args, 2) + shape = diffvg.Rect(diffvg.Vector2f(p_min[0], p_min[1]), diffvg.Vector2f(p_max[0], p_max[1])) else: - assert(False) - stroke_width = args[current_index] - current_index += 1 + assert False + + stroke_width = args.pop(0) + shapes.append(diffvg.Shape(\ shape_type, shape.get_ptr(), stroke_width.item())) shape_contents.append(shape) for shape_group_id in range(num_shape_groups): - shape_ids = args[current_index] - current_index += 1 - fill_color_type = args[current_index] - current_index += 1 + (shape_ids, fill_color_type), args = popmult(args, 2) + if fill_color_type == diffvg.ColorType.constant: - color = args[current_index] - current_index += 1 + color = args.pop(0) + fill_color = diffvg.Constant(\ diffvg.Vector4f(color[0], color[1], color[2], color[3])) + elif fill_color_type == diffvg.ColorType.linear_gradient: - beg = args[current_index] - current_index += 1 - end = args[current_index] - current_index += 1 - offsets = args[current_index] - current_index += 1 - stop_colors = args[current_index] - current_index += 1 - assert(offsets.shape[0] == stop_colors.shape[0]) + (beg, end, offsets, stop_colors), args = popmult(args, 4) + + assert offsets.shape[0] == stop_colors.shape[0] fill_color = diffvg.LinearGradient(diffvg.Vector2f(beg[0], beg[1]), diffvg.Vector2f(end[0], end[1]), offsets.shape[0], diffvg.float_ptr(offsets.data_ptr()), diffvg.float_ptr(stop_colors.data_ptr())) + elif fill_color_type == diffvg.ColorType.radial_gradient: - center = args[current_index] - current_index += 1 - radius = args[current_index] - current_index += 1 - offsets = args[current_index] - current_index += 1 - stop_colors = args[current_index] - current_index += 1 - assert(offsets.shape[0] == stop_colors.shape[0]) + (center, radius, offsets, stop_colors), args = popmult(args, 4) + + assert offsets.shape[0] == stop_colors.shape[0] fill_color = diffvg.RadialGradient(diffvg.Vector2f(center[0], center[1]), diffvg.Vector2f(radius[0], radius[1]), offsets.shape[0], diffvg.float_ptr(offsets.data_ptr()), diffvg.float_ptr(stop_colors.data_ptr())) + elif fill_color_type is None: fill_color = None + else: - assert(False) - stroke_color_type = args[current_index] - current_index += 1 + assert False + + stroke_color_type = args.pop(0) + if stroke_color_type == diffvg.ColorType.constant: - color = args[current_index] - current_index += 1 + color = args.pop(0) stroke_color = diffvg.Constant(\ diffvg.Vector4f(color[0], color[1], color[2], color[3])) elif stroke_color_type == diffvg.ColorType.linear_gradient: - beg = args[current_index] - current_index += 1 - end = args[current_index] - current_index += 1 - offsets = args[current_index] - current_index += 1 - stop_colors = args[current_index] - current_index += 1 - assert(offsets.shape[0] == stop_colors.shape[0]) + (beg, end, offsets, stop_colors) = popmult(args, 4) + + assert offsets.shape[0] == stop_colors.shape[0] stroke_color = diffvg.LinearGradient(diffvg.Vector2f(beg[0], beg[1]), diffvg.Vector2f(end[0], end[1]), offsets.shape[0], diffvg.float_ptr(offsets.data_ptr()), diffvg.float_ptr(stop_colors.data_ptr())) elif stroke_color_type == diffvg.ColorType.radial_gradient: - center = args[current_index] - current_index += 1 - radius = args[current_index] - current_index += 1 - offsets = args[current_index] - current_index += 1 - stop_colors = args[current_index] - current_index += 1 - assert(offsets.shape[0] == stop_colors.shape[0]) + (center, radius, offsets, stop_colors), args = popmult(args, 4) + + assert offsets.shape[0] == stop_colors.shape[0] stroke_color = diffvg.RadialGradient(diffvg.Vector2f(center[0], center[1]), diffvg.Vector2f(radius[0], radius[1]), offsets.shape[0], diffvg.float_ptr(offsets.data_ptr()), diffvg.float_ptr(stop_colors.data_ptr())) + elif stroke_color_type is None: stroke_color = None + else: - assert(False) - use_even_odd_rule = args[current_index] - current_index += 1 - shape_to_canvas = args[current_index] - current_index += 1 + assert False + + (use_even_odd_rule, shape_to_canvas), args = popmult(args, 2) if fill_color is not None: color_contents.append(fill_color) + if stroke_color is not None: color_contents.append(stroke_color) + shape_groups.append(diffvg.ShapeGroup(\ diffvg.int_ptr(shape_ids.data_ptr()), shape_ids.shape[0], @@ -613,31 +561,32 @@ class RenderFunction(torch.autograd.Function): use_even_odd_rule, diffvg.float_ptr(shape_to_canvas.data_ptr()))) - filter_type = args[current_index] - current_index += 1 - filter_radius = args[current_index] - current_index += 1 + (filter_type, filter_radius), args = popmult(args, 2) + filt = diffvg.Filter(filter_type, filter_radius) scene = diffvg.Scene(canvas_width, canvas_height, - shapes, shape_groups, filt, pydiffvg.get_use_gpu(), - pydiffvg.get_device().index if pydiffvg.get_device().index is not None else -1) + shapes, shape_groups, filt, pydiffvg.get_use_gpu(), + pydiffvg.get_device().index if pydiffvg.get_device().index is not None else -1) if output_type == OutputType.color: - assert(grad_img.shape[2] == 4) + assert grad_img.shape[2] == 4 else: - assert(grad_img.shape[2] == 1) + assert grad_img.shape[2] == 1 if background_image is not None: background_image = background_image.to(pydiffvg.get_device()) if background_image.shape[2] == 3: - background_image = torch.cat((\ - background_image, torch.ones(background_image.shape[0], background_image.shape[1], 1, - device = background_image.device)), dim = 2) + background_image = torch.cat(( + background_image, torch.ones(background_image.shape[0], + background_image.shape[1], + 1, + device=background_image.device)), + dim=2) background_image = background_image.contiguous() - assert(background_image.shape[0] == rendered_image.shape[0]) - assert(background_image.shape[1] == rendered_image.shape[1]) - assert(background_image.shape[2] == 4) + assert background_image.shape[0] == rendered_image.shape[0] + assert background_image.shape[1] == rendered_image.shape[1] + assert background_image.shape[2] == 4 translation_grad_image = \ torch.zeros(height, width, 2, device = pydiffvg.get_device()) @@ -661,7 +610,7 @@ class RenderFunction(torch.autograd.Function): time_elapsed = time.time() - start if print_timing: print('Gradient pass, time: %.5f s' % time_elapsed) - assert(torch.isfinite(translation_grad_image).all()) + assert torch.isfinite(translation_grad_image).all() return translation_grad_image @@ -670,7 +619,7 @@ class RenderFunction(torch.autograd.Function): grad_img): if not grad_img.is_contiguous(): grad_img = grad_img.contiguous() - assert(torch.isfinite(grad_img).all()) + assert torch.isfinite(grad_img).all() scene = ctx.scene width = ctx.width @@ -710,20 +659,11 @@ class RenderFunction(torch.autograd.Function): if print_timing: print('Backward pass, time: %.5f s' % time_elapsed) - d_args = [] - d_args.append(None) # width - d_args.append(None) # height - d_args.append(None) # num_samples_x - d_args.append(None) # num_samples_y - d_args.append(None) # seed - d_args.append(d_background_image) - d_args.append(None) # canvas_width - d_args.append(None) # canvas_height - d_args.append(None) # num_shapes - d_args.append(None) # num_shape_groups - d_args.append(None) # output_type - d_args.append(None) # use_prefiltering - d_args.append(None) # eval_positions + # [width, height, num_samples_x, num_samples_y, seed, + # d_background_image, canvas_width, canvas_height, num_shapes, + # num_shape_groups, output_type, use_prefiltering, _eval_positions] + d_args = [None] * 5 + [d_background_image] + [None] * 7 + for shape_id in range(scene.num_shapes): d_args.append(None) # type d_shape = scene.get_d_shape(shape_id) @@ -731,21 +671,21 @@ class RenderFunction(torch.autograd.Function): if d_shape.type == diffvg.ShapeType.circle: d_circle = d_shape.as_circle() radius = torch.tensor(d_circle.radius) - assert(torch.isfinite(radius).all()) + assert torch.isfinite(radius).all() d_args.append(radius) c = d_circle.center c = torch.tensor((c.x, c.y)) - assert(torch.isfinite(c).all()) + assert torch.isfinite(c).all() d_args.append(c) elif d_shape.type == diffvg.ShapeType.ellipse: d_ellipse = d_shape.as_ellipse() r = d_ellipse.radius r = torch.tensor((d_ellipse.radius.x, d_ellipse.radius.y)) - assert(torch.isfinite(r).all()) + assert torch.isfinite(r).all() d_args.append(r) c = d_ellipse.center c = torch.tensor((c.x, c.y)) - assert(torch.isfinite(c).all()) + assert torch.isfinite(c).all() d_args.append(c) elif d_shape.type == diffvg.ShapeType.path: d_path = d_shape.as_path() @@ -757,9 +697,9 @@ class RenderFunction(torch.autograd.Function): d_path.copy_to(diffvg.float_ptr(points.data_ptr()), diffvg.float_ptr(thickness.data_ptr())) else: d_path.copy_to(diffvg.float_ptr(points.data_ptr()), diffvg.float_ptr(0)) - assert(torch.isfinite(points).all()) + assert torch.isfinite(points).all() if thickness is not None: - assert(torch.isfinite(thickness).all()) + assert torch.isfinite(thickness).all() d_args.append(None) # num_control_points d_args.append(points) d_args.append(thickness) @@ -769,17 +709,17 @@ class RenderFunction(torch.autograd.Function): d_rect = d_shape.as_rect() p_min = torch.tensor((d_rect.p_min.x, d_rect.p_min.y)) p_max = torch.tensor((d_rect.p_max.x, d_rect.p_max.y)) - assert(torch.isfinite(p_min).all()) - assert(torch.isfinite(p_max).all()) + assert torch.isfinite(p_min).all() + assert torch.isfinite(p_max).all() d_args.append(p_min) d_args.append(p_max) else: - assert(False) + assert False if use_thickness: d_args.append(None) else: w = torch.tensor((d_shape.stroke_width)) - assert(torch.isfinite(w).all()) + assert torch.isfinite(w).all() d_args.append(w) for group_id in range(scene.num_shape_groups): @@ -802,7 +742,7 @@ class RenderFunction(torch.autograd.Function): d_linear_gradient.copy_to(\ diffvg.float_ptr(offsets.data_ptr()), diffvg.float_ptr(stop_colors.data_ptr())) - assert(torch.isfinite(stop_colors).all()) + assert torch.isfinite(stop_colors).all() d_args.append(offsets) d_args.append(stop_colors) elif d_shape_group.fill_color_type == diffvg.ColorType.radial_gradient: @@ -816,11 +756,11 @@ class RenderFunction(torch.autograd.Function): d_radial_gradient.copy_to(\ diffvg.float_ptr(offsets.data_ptr()), diffvg.float_ptr(stop_colors.data_ptr())) - assert(torch.isfinite(stop_colors).all()) + assert torch.isfinite(stop_colors).all() d_args.append(offsets) d_args.append(stop_colors) else: - assert(False) + assert False d_args.append(None) # stroke_color_type if d_shape_group.has_stroke_color(): if d_shape_group.stroke_color_type == diffvg.ColorType.constant: @@ -838,7 +778,7 @@ class RenderFunction(torch.autograd.Function): d_linear_gradient.copy_to(\ diffvg.float_ptr(offsets.data_ptr()), diffvg.float_ptr(stop_colors.data_ptr())) - assert(torch.isfinite(stop_colors).all()) + assert torch.isfinite(stop_colors).all() d_args.append(offsets) d_args.append(stop_colors) elif d_shape_group.fill_color_type == diffvg.ColorType.radial_gradient: @@ -852,15 +792,15 @@ class RenderFunction(torch.autograd.Function): d_radial_gradient.copy_to(\ diffvg.float_ptr(offsets.data_ptr()), diffvg.float_ptr(stop_colors.data_ptr())) - assert(torch.isfinite(stop_colors).all()) + assert torch.isfinite(stop_colors).all() d_args.append(offsets) d_args.append(stop_colors) else: - assert(False) + assert False d_args.append(None) # use_even_odd_rule d_shape_to_canvas = torch.zeros((3, 3)) d_shape_group.copy_to(diffvg.float_ptr(d_shape_to_canvas.data_ptr())) - assert(torch.isfinite(d_shape_to_canvas).all()) + assert torch.isfinite(d_shape_to_canvas).all() d_args.append(d_shape_to_canvas) d_args.append(None) # filter_type d_args.append(torch.tensor(scene.get_d_filter_radius())) diff --git a/pyproject.toml b/pyproject.toml index b4fc9bd..4370fb2 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -5,8 +5,11 @@ description = "" authors = ["Marco Lee "] [tool.poetry.dependencies] -python = ">=3.8,<3.11" +python = ">=3.9,<3.11" pygame = "^2.0.1" +torch = "^2.0.1" +ipython = "^8.13.2" +pytest-metadata = "^2.0.4" [tool.poetry.dev-dependencies] torch = "^2.0.0" diff --git a/results/single_circle/iter_10.png b/results/single_circle/iter_10.png index 2439b96..62fda1a 100644 Binary files a/results/single_circle/iter_10.png and b/results/single_circle/iter_10.png differ diff --git a/results/single_circle/iter_11.png b/results/single_circle/iter_11.png index 0f29612..714e5b6 100644 Binary files a/results/single_circle/iter_11.png and b/results/single_circle/iter_11.png differ diff --git a/results/single_circle/iter_12.png b/results/single_circle/iter_12.png index 682deb9..db41ac1 100644 Binary files a/results/single_circle/iter_12.png and b/results/single_circle/iter_12.png differ diff --git a/results/single_circle/iter_13.png b/results/single_circle/iter_13.png index f38799e..9d6e1d1 100644 Binary files a/results/single_circle/iter_13.png and b/results/single_circle/iter_13.png differ diff --git a/results/single_circle/iter_14.png b/results/single_circle/iter_14.png index 6386276..3e49724 100644 Binary files a/results/single_circle/iter_14.png and b/results/single_circle/iter_14.png differ diff --git a/results/single_circle/iter_15.png b/results/single_circle/iter_15.png index dc619aa..bd278bf 100644 Binary files a/results/single_circle/iter_15.png and b/results/single_circle/iter_15.png differ diff --git a/results/single_circle/iter_16.png b/results/single_circle/iter_16.png index f06fed9..2178c91 100644 Binary files a/results/single_circle/iter_16.png and b/results/single_circle/iter_16.png differ diff --git a/results/single_circle/iter_17.png b/results/single_circle/iter_17.png index 6ffa433..ba98e89 100644 Binary files a/results/single_circle/iter_17.png and b/results/single_circle/iter_17.png differ diff --git a/results/single_circle/iter_18.png b/results/single_circle/iter_18.png index ca0ca91..c3f5640 100644 Binary files a/results/single_circle/iter_18.png and b/results/single_circle/iter_18.png differ diff --git a/results/single_circle/iter_19.png b/results/single_circle/iter_19.png index 0fbc40a..49410c4 100644 Binary files a/results/single_circle/iter_19.png and b/results/single_circle/iter_19.png differ diff --git a/results/single_circle/iter_20.png b/results/single_circle/iter_20.png index 1cd4f82..84795bc 100644 Binary files a/results/single_circle/iter_20.png and b/results/single_circle/iter_20.png differ diff --git a/results/single_circle/iter_21.png b/results/single_circle/iter_21.png index 68606c4..4bea964 100644 Binary files a/results/single_circle/iter_21.png and b/results/single_circle/iter_21.png differ diff --git a/results/single_circle/iter_22.png b/results/single_circle/iter_22.png index 5c3d01b..89be48f 100644 Binary files a/results/single_circle/iter_22.png and b/results/single_circle/iter_22.png differ diff --git a/results/single_circle/iter_23.png b/results/single_circle/iter_23.png index 22938aa..c14a07b 100644 Binary files a/results/single_circle/iter_23.png and b/results/single_circle/iter_23.png differ diff --git a/results/single_circle/iter_24.png b/results/single_circle/iter_24.png index 951ce66..64ca0b5 100644 Binary files a/results/single_circle/iter_24.png and b/results/single_circle/iter_24.png differ diff --git a/results/single_circle/iter_25.png b/results/single_circle/iter_25.png index b9b9939..11f9dcd 100644 Binary files a/results/single_circle/iter_25.png and b/results/single_circle/iter_25.png differ diff --git a/results/single_circle/iter_26.png b/results/single_circle/iter_26.png index 67005cc..54b262e 100644 Binary files a/results/single_circle/iter_26.png and b/results/single_circle/iter_26.png differ diff --git a/results/single_circle/iter_27.png b/results/single_circle/iter_27.png index 6829c89..7c876d1 100644 Binary files a/results/single_circle/iter_27.png and b/results/single_circle/iter_27.png differ diff --git a/results/single_circle/iter_28.png b/results/single_circle/iter_28.png index 11afd8b..a808754 100644 Binary files a/results/single_circle/iter_28.png and b/results/single_circle/iter_28.png differ diff --git a/results/single_circle/iter_29.png b/results/single_circle/iter_29.png index 611065c..31b30c2 100644 Binary files a/results/single_circle/iter_29.png and b/results/single_circle/iter_29.png differ diff --git a/results/single_circle/iter_30.png b/results/single_circle/iter_30.png index 5b1b9cc..3b5b43e 100644 Binary files a/results/single_circle/iter_30.png and b/results/single_circle/iter_30.png differ diff --git a/results/single_circle/iter_31.png b/results/single_circle/iter_31.png index 6aff50d..17adacd 100644 Binary files a/results/single_circle/iter_31.png and b/results/single_circle/iter_31.png differ diff --git a/results/single_circle/iter_32.png b/results/single_circle/iter_32.png index b7a17ec..fca1cc3 100644 Binary files a/results/single_circle/iter_32.png and b/results/single_circle/iter_32.png differ diff --git a/results/single_circle/iter_33.png b/results/single_circle/iter_33.png index e1b2553..56a2d4d 100644 Binary files a/results/single_circle/iter_33.png and b/results/single_circle/iter_33.png differ diff --git a/results/single_circle/iter_34.png b/results/single_circle/iter_34.png index 500ce3c..ff6f673 100644 Binary files a/results/single_circle/iter_34.png and b/results/single_circle/iter_34.png differ diff --git a/results/single_circle/iter_35.png b/results/single_circle/iter_35.png index 2731596..3a52da7 100644 Binary files a/results/single_circle/iter_35.png and b/results/single_circle/iter_35.png differ diff --git a/results/single_circle/iter_36.png b/results/single_circle/iter_36.png index c8eb212..b6858d5 100644 Binary files a/results/single_circle/iter_36.png and b/results/single_circle/iter_36.png differ diff --git a/results/single_circle/iter_37.png b/results/single_circle/iter_37.png index f53cd27..fa7236a 100644 Binary files a/results/single_circle/iter_37.png and b/results/single_circle/iter_37.png differ diff --git a/results/single_circle/iter_38.png b/results/single_circle/iter_38.png index d412663..6c902c3 100644 Binary files a/results/single_circle/iter_38.png and b/results/single_circle/iter_38.png differ diff --git a/results/single_circle/iter_39.png b/results/single_circle/iter_39.png index b9be658..610fee2 100644 Binary files a/results/single_circle/iter_39.png and b/results/single_circle/iter_39.png differ diff --git a/results/single_circle/iter_40.png b/results/single_circle/iter_40.png index e834366..464fb9d 100644 Binary files a/results/single_circle/iter_40.png and b/results/single_circle/iter_40.png differ diff --git a/results/single_circle/iter_41.png b/results/single_circle/iter_41.png index 883d72c..c649c91 100644 Binary files a/results/single_circle/iter_41.png and b/results/single_circle/iter_41.png differ diff --git a/results/single_circle/iter_42.png b/results/single_circle/iter_42.png index 0f035c1..b9d0d33 100644 Binary files a/results/single_circle/iter_42.png and b/results/single_circle/iter_42.png differ diff --git a/results/single_circle/iter_43.png b/results/single_circle/iter_43.png index 35f0604..b9635c6 100644 Binary files a/results/single_circle/iter_43.png and b/results/single_circle/iter_43.png differ diff --git a/results/single_circle/iter_44.png b/results/single_circle/iter_44.png index 0dba6e5..e8d1660 100644 Binary files a/results/single_circle/iter_44.png and b/results/single_circle/iter_44.png differ diff --git a/results/single_circle/iter_45.png b/results/single_circle/iter_45.png index 60d75d3..7c5fce8 100644 Binary files a/results/single_circle/iter_45.png and b/results/single_circle/iter_45.png differ diff --git a/results/single_circle/iter_46.png b/results/single_circle/iter_46.png index 87b6e5e..b3d733c 100644 Binary files a/results/single_circle/iter_46.png and b/results/single_circle/iter_46.png differ diff --git a/results/single_circle/iter_47.png b/results/single_circle/iter_47.png index 164027d..5f28e41 100644 Binary files a/results/single_circle/iter_47.png and b/results/single_circle/iter_47.png differ diff --git a/results/single_circle/iter_48.png b/results/single_circle/iter_48.png index 6ae3f5d..15b3a79 100644 Binary files a/results/single_circle/iter_48.png and b/results/single_circle/iter_48.png differ diff --git a/results/single_circle/iter_49.png b/results/single_circle/iter_49.png index a8a4f22..f431dc3 100644 Binary files a/results/single_circle/iter_49.png and b/results/single_circle/iter_49.png differ diff --git a/results/single_circle/iter_50.png b/results/single_circle/iter_50.png index 9fcb037..69fb887 100644 Binary files a/results/single_circle/iter_50.png and b/results/single_circle/iter_50.png differ diff --git a/results/single_circle/iter_51.png b/results/single_circle/iter_51.png index 1bea8e9..53e2751 100644 Binary files a/results/single_circle/iter_51.png and b/results/single_circle/iter_51.png differ diff --git a/results/single_circle/iter_52.png b/results/single_circle/iter_52.png index 68e6e0f..09c66f9 100644 Binary files a/results/single_circle/iter_52.png and b/results/single_circle/iter_52.png differ diff --git a/results/single_circle/iter_53.png b/results/single_circle/iter_53.png index 0470ce7..e3efcb0 100644 Binary files a/results/single_circle/iter_53.png and b/results/single_circle/iter_53.png differ diff --git a/results/single_circle/iter_54.png b/results/single_circle/iter_54.png index e87f88f..74e3032 100644 Binary files a/results/single_circle/iter_54.png and b/results/single_circle/iter_54.png differ diff --git a/results/single_circle/iter_55.png b/results/single_circle/iter_55.png index 6bb51c7..2e86cb8 100644 Binary files a/results/single_circle/iter_55.png and b/results/single_circle/iter_55.png differ diff --git a/results/single_circle/iter_56.png b/results/single_circle/iter_56.png index 2621316..5db66a3 100644 Binary files a/results/single_circle/iter_56.png and b/results/single_circle/iter_56.png differ diff --git a/results/single_circle/iter_57.png b/results/single_circle/iter_57.png index e1b9cd9..03bc156 100644 Binary files a/results/single_circle/iter_57.png and b/results/single_circle/iter_57.png differ diff --git a/results/single_circle/iter_58.png b/results/single_circle/iter_58.png index e2f4c8d..d46616a 100644 Binary files a/results/single_circle/iter_58.png and b/results/single_circle/iter_58.png differ diff --git a/results/single_circle/iter_59.png b/results/single_circle/iter_59.png index beca9f9..aadc3f4 100644 Binary files a/results/single_circle/iter_59.png and b/results/single_circle/iter_59.png differ diff --git a/results/single_circle/iter_60.png b/results/single_circle/iter_60.png index 0611104..9633eb7 100644 Binary files a/results/single_circle/iter_60.png and b/results/single_circle/iter_60.png differ diff --git a/results/single_circle/iter_61.png b/results/single_circle/iter_61.png index 8a9ec96..4f60f3e 100644 Binary files a/results/single_circle/iter_61.png and b/results/single_circle/iter_61.png differ diff --git a/results/single_circle/iter_62.png b/results/single_circle/iter_62.png index 9c731f2..6bc4d0b 100644 Binary files a/results/single_circle/iter_62.png and b/results/single_circle/iter_62.png differ diff --git a/results/single_circle/iter_63.png b/results/single_circle/iter_63.png index 65a166a..977551d 100644 Binary files a/results/single_circle/iter_63.png and b/results/single_circle/iter_63.png differ diff --git a/results/single_circle/iter_9.png b/results/single_circle/iter_9.png index 3be053f..13afa29 100644 Binary files a/results/single_circle/iter_9.png and b/results/single_circle/iter_9.png differ