From 57eff46d6cedfb186f8f8fd516cfbd7a0ed02976 Mon Sep 17 00:00:00 2001 From: Avinash Mallya Date: Sat, 13 Sep 2025 21:27:23 -0500 Subject: [PATCH] Switch to Hugo --- 404.html | 25 - Gemfile | 35 - Gemfile.lock | 265 ----- LICENSE | 21 - README.md | 3 - _config.yml | 56 -- _includes/head-custom.html | 12 - about.md | 12 - archetypes/default.md | 5 + .../001_overlap_joins/overlap_algorithm.xlsx | Bin 12109 -> 0 bytes assets/favicon.png | Bin 1415 -> 0 bytes assets/original.css | 187 ++++ build_website.sh | 1 - content/_index.md | 26 + content/blog/001_overlap_joins/index.md | 495 +++++++++ .../001_overlap_joins/overlap_algorithm.png | Bin .../001_Network_Cluster_1.png | Bin .../002_Network_Cluster_2.png | Bin .../blog/002_representative_samples/index.md | 8 +- .../blog/003_powerpointsnap}/01_Shapes.png | Bin .../blog/003_powerpointsnap}/02_Charts.png | Bin .../blog/003_powerpointsnap}/03_Tables.png | Bin .../DataLabelsScreenshot.JPG | Bin .../Revenue_Presentation_1.png | Bin .../Revenue_Presentation_2.png | Bin .../003_powerpointsnap}/SnapScreenshot.JPG | Bin .../Table_Presentation_1.png | Bin .../Table_Presentation_2.png | Bin .../blog/003_powerpointsnap/index.md | 18 +- content/blog/_index.md | 5 + content/projects.md | 18 + favicon.ico | Bin 1415 -> 0 bytes hugo.toml | 81 ++ index.md | 18 - layouts/partials/nav.html | 22 + public/404.html | 5 + .../001_overlap_joins/index.html | 569 +++++++++++ public/blog/001_overlap_joins/index.html | 309 ++++++ .../001_overlap_joins/overlap_algorithm.png | Bin 0 -> 140393 bytes .../001_Network_Cluster_1.png | Bin 0 -> 230939 bytes .../002_Network_Cluster_2.png | Bin 0 -> 302590 bytes .../002_representative_samples/index.html | 243 +++++ public/blog/003_powerpointsnap/01_Shapes.png | Bin 0 -> 36688 bytes public/blog/003_powerpointsnap/02_Charts.png | Bin 0 -> 52936 bytes public/blog/003_powerpointsnap/03_Tables.png | Bin 0 -> 21908 bytes .../DataLabelsScreenshot.JPG | Bin 0 -> 22809 bytes .../Revenue_Presentation_1.png | Bin 0 -> 252958 bytes .../Revenue_Presentation_2.png | Bin 0 -> 214873 bytes .../003_powerpointsnap/SnapScreenshot.JPG | Bin 0 -> 26280 bytes .../Table_Presentation_1.png | Bin 0 -> 318022 bytes .../Table_Presentation_2.png | Bin 0 -> 300690 bytes public/blog/003_powerpointsnap/index.html | 24 + public/blog/index.html | 21 + public/blog/index.xml | 927 +++++++++++++++++ public/categories/index.html | 5 + public/categories/index.xml | 1 + public/favicon.ico | Bin 0 -> 4286 bytes public/herman.min.css | 1 + public/index.html | 11 + public/index.xml | 950 ++++++++++++++++++ public/original.min.css | 1 + public/posts/001_overlap_joins/index.html | 562 +++++++++++ public/posts/index.html | 106 ++ public/posts/index.xml | 463 +++++++++ public/posts/my-first-post/index.html | 110 ++ .../posts/post.exe | 11 +- public/posts/post/index.html | 562 +++++++++++ public/projects/index.html | 19 + public/projects/index.xml | 25 + public/projects/projects/index.html | 107 ++ public/robots.txt | 3 + public/sitemap.xml | 1 + public/syntax.min.css | 1 + public/tags/approximate/index.html | 6 + public/tags/approximate/index.xml | 383 +++++++ public/tags/category/index.html | 6 + public/tags/category/index.xml | 383 +++++++ public/tags/faiss/index.html | 6 + public/tags/faiss/index.xml | 383 +++++++ public/tags/graph/index.html | 6 + public/tags/graph/index.xml | 383 +++++++ public/tags/index.html | 19 + public/tags/index.xml | 1 + public/tags/nearest/index.html | 6 + public/tags/nearest/index.xml | 383 +++++++ public/tags/neighbor/index.html | 6 + public/tags/neighbor/index.xml | 383 +++++++ public/tags/network/index.html | 6 + public/tags/network/index.xml | 383 +++++++ public/tags/networkx/index.html | 6 + public/tags/networkx/index.xml | 383 +++++++ public/tags/polars/index.html | 6 + public/tags/polars/index.xml | 383 +++++++ public/tags/powerpoint/index.html | 6 + public/tags/powerpoint/index.xml | 101 ++ public/tags/ppt/index.html | 6 + public/tags/ppt/index.xml | 101 ++ public/tags/representative/index.html | 6 + public/tags/representative/index.xml | 383 +++++++ public/tags/samples/index.html | 6 + public/tags/samples/index.xml | 383 +++++++ public/tags/vba/index.html | 6 + public/tags/vba/index.xml | 101 ++ static/favicon.ico | Bin 0 -> 4286 bytes .../.github/workflows/gh-pages.yml | 32 + themes/hugo-bearcub/.gitignore | 5 + themes/hugo-bearcub/LICENSE | 21 + themes/hugo-bearcub/README.md | 245 +++++ themes/hugo-bearcub/assets/herman.css | 202 ++++ .../assets/images/social_card_bg.png | Bin 0 -> 6698 bytes .../assets/images/social_card_fg.png | Bin 0 -> 4656 bytes themes/hugo-bearcub/assets/original.css | 180 ++++ themes/hugo-bearcub/assets/syntax.css | 91 ++ .../exampleSite/content.pt/_index.md | 35 + .../exampleSite/content.pt/blog/_index.md | 5 + .../exampleSite/content/_index.md | 35 + .../exampleSite/content/blog/_index.md | 5 + .../exampleSite/content/blog/emoji-support.md | 46 + .../content/blog/markdown-syntax.md | 148 +++ .../content/blog/math-typesetting.md | 49 + .../content/blog/placeholder-text.md | 45 + .../exampleSite/content/blog/rich-content.md | 34 + themes/hugo-bearcub/exampleSite/hugo.toml | 89 ++ .../exampleSite/static/images/favicon.png | Bin 0 -> 126 bytes .../exampleSite/static/images/share.webp | Bin 0 -> 7490 bytes themes/hugo-bearcub/i18n/de.toml | 14 + themes/hugo-bearcub/i18n/en.toml | 14 + themes/hugo-bearcub/i18n/ko.toml | 14 + themes/hugo-bearcub/i18n/pt.toml | 14 + themes/hugo-bearcub/i18n/tr.toml | 14 + themes/hugo-bearcub/layouts/404.html | 6 + .../_default/_markup/render-codeblock.html | 6 + .../hugo-bearcub/layouts/_default/baseof.html | 54 + .../hugo-bearcub/layouts/_default/list.html | 36 + themes/hugo-bearcub/layouts/_default/rss.xml | 72 ++ .../hugo-bearcub/layouts/_default/single.html | 28 + themes/hugo-bearcub/layouts/index.html | 3 + .../layouts/partials/custom_body.html | 3 + .../layouts/partials/custom_head.html | 3 + .../layouts/partials/favicon.html | 2 + .../hugo-bearcub/layouts/partials/footer.html | 3 + .../hugo-bearcub/layouts/partials/header.html | 4 + themes/hugo-bearcub/layouts/partials/nav.html | 22 + .../layouts/partials/seo_tags.html | 22 + .../layouts/partials/social_card.html | 124 +++ themes/hugo-bearcub/layouts/robots.txt | 3 + .../layouts/shortcodes/absfigure.html | 29 + .../layouts/shortcodes/highlight.html | 5 + .../layouts/shortcodes/rawhtml.html | 2 + themes/hugo-bearcub/theme.toml | 29 + 150 files changed, 12296 insertions(+), 467 deletions(-) delete mode 100644 404.html delete mode 100644 Gemfile delete mode 100644 Gemfile.lock delete mode 100644 LICENSE delete mode 100644 README.md delete mode 100644 _config.yml delete mode 100644 _includes/head-custom.html delete mode 100644 about.md create mode 100644 archetypes/default.md delete mode 100644 assets/001_overlap_joins/overlap_algorithm.xlsx delete mode 100644 assets/favicon.png create mode 100644 assets/original.css delete mode 100755 build_website.sh create mode 100644 content/_index.md create mode 100644 content/blog/001_overlap_joins/index.md rename {assets => content/blog}/001_overlap_joins/overlap_algorithm.png (100%) rename {assets/003_representative_samples => content/blog/002_representative_samples}/001_Network_Cluster_1.png (100%) rename {assets/003_representative_samples => content/blog/002_representative_samples}/002_Network_Cluster_2.png (100%) rename _posts/2023-10-19-Finding_Rep_Samples.md => content/blog/002_representative_samples/index.md (98%) rename {assets/002_power_point_snap => content/blog/003_powerpointsnap}/01_Shapes.png (100%) rename {assets/002_power_point_snap => content/blog/003_powerpointsnap}/02_Charts.png (100%) rename {assets/002_power_point_snap => content/blog/003_powerpointsnap}/03_Tables.png (100%) rename {assets/002_power_point_snap => content/blog/003_powerpointsnap}/DataLabelsScreenshot.JPG (100%) rename {assets/002_power_point_snap => content/blog/003_powerpointsnap}/Revenue_Presentation_1.png (100%) rename {assets/002_power_point_snap => content/blog/003_powerpointsnap}/Revenue_Presentation_2.png (100%) rename {assets/002_power_point_snap => content/blog/003_powerpointsnap}/SnapScreenshot.JPG (100%) rename {assets/002_power_point_snap => content/blog/003_powerpointsnap}/Table_Presentation_1.png (100%) rename {assets/002_power_point_snap => content/blog/003_powerpointsnap}/Table_Presentation_2.png (100%) rename _posts/2023-10-20-PowerPointSnap.md => content/blog/003_powerpointsnap/index.md (89%) create mode 100644 content/blog/_index.md create mode 100644 content/projects.md delete mode 100644 favicon.ico create mode 100644 hugo.toml delete mode 100644 index.md create mode 100644 layouts/partials/nav.html create mode 100644 public/404.html create mode 100644 public/blog/001_overlap_joins/001_overlap_joins/index.html create mode 100644 public/blog/001_overlap_joins/index.html create mode 100644 public/blog/001_overlap_joins/overlap_algorithm.png create mode 100644 public/blog/002_representative_samples/001_Network_Cluster_1.png create mode 100644 public/blog/002_representative_samples/002_Network_Cluster_2.png create mode 100644 public/blog/002_representative_samples/index.html create mode 100644 public/blog/003_powerpointsnap/01_Shapes.png create mode 100644 public/blog/003_powerpointsnap/02_Charts.png create mode 100644 public/blog/003_powerpointsnap/03_Tables.png create mode 100644 public/blog/003_powerpointsnap/DataLabelsScreenshot.JPG create mode 100644 public/blog/003_powerpointsnap/Revenue_Presentation_1.png create mode 100644 public/blog/003_powerpointsnap/Revenue_Presentation_2.png create mode 100644 public/blog/003_powerpointsnap/SnapScreenshot.JPG create mode 100644 public/blog/003_powerpointsnap/Table_Presentation_1.png create mode 100644 public/blog/003_powerpointsnap/Table_Presentation_2.png create mode 100644 public/blog/003_powerpointsnap/index.html create mode 100644 public/blog/index.html create mode 100644 public/blog/index.xml create mode 100644 public/categories/index.html create mode 100644 public/categories/index.xml create mode 100644 public/favicon.ico create mode 100644 public/herman.min.css create mode 100644 public/index.html create mode 100644 public/index.xml create mode 100644 public/original.min.css create mode 100644 public/posts/001_overlap_joins/index.html create mode 100644 public/posts/index.html create mode 100644 public/posts/index.xml create mode 100644 public/posts/my-first-post/index.html rename _posts/2023-06-22-overlap_joins.md => public/posts/post.exe (99%) create mode 100644 public/posts/post/index.html create mode 100644 public/projects/index.html create mode 100644 public/projects/index.xml create mode 100644 public/projects/projects/index.html create mode 100644 public/robots.txt create mode 100644 public/sitemap.xml create mode 100644 public/syntax.min.css create mode 100644 public/tags/approximate/index.html create mode 100644 public/tags/approximate/index.xml create mode 100644 public/tags/category/index.html create mode 100644 public/tags/category/index.xml create mode 100644 public/tags/faiss/index.html create mode 100644 public/tags/faiss/index.xml create mode 100644 public/tags/graph/index.html create mode 100644 public/tags/graph/index.xml create mode 100644 public/tags/index.html create mode 100644 public/tags/index.xml create mode 100644 public/tags/nearest/index.html create mode 100644 public/tags/nearest/index.xml create mode 100644 public/tags/neighbor/index.html create mode 100644 public/tags/neighbor/index.xml create mode 100644 public/tags/network/index.html create mode 100644 public/tags/network/index.xml create mode 100644 public/tags/networkx/index.html create mode 100644 public/tags/networkx/index.xml create mode 100644 public/tags/polars/index.html create mode 100644 public/tags/polars/index.xml create mode 100644 public/tags/powerpoint/index.html create mode 100644 public/tags/powerpoint/index.xml create mode 100644 public/tags/ppt/index.html create mode 100644 public/tags/ppt/index.xml create mode 100644 public/tags/representative/index.html create mode 100644 public/tags/representative/index.xml create mode 100644 public/tags/samples/index.html create mode 100644 public/tags/samples/index.xml create mode 100644 public/tags/vba/index.html create mode 100644 public/tags/vba/index.xml create mode 100644 static/favicon.ico create mode 100644 themes/hugo-bearcub/.github/workflows/gh-pages.yml create mode 100644 themes/hugo-bearcub/.gitignore create mode 100644 themes/hugo-bearcub/LICENSE create mode 100644 themes/hugo-bearcub/README.md create mode 100644 themes/hugo-bearcub/assets/herman.css create mode 100644 themes/hugo-bearcub/assets/images/social_card_bg.png create mode 100644 themes/hugo-bearcub/assets/images/social_card_fg.png create mode 100644 themes/hugo-bearcub/assets/original.css create mode 100644 themes/hugo-bearcub/assets/syntax.css create mode 100644 themes/hugo-bearcub/exampleSite/content.pt/_index.md create mode 100644 themes/hugo-bearcub/exampleSite/content.pt/blog/_index.md create mode 100644 themes/hugo-bearcub/exampleSite/content/_index.md create mode 100644 themes/hugo-bearcub/exampleSite/content/blog/_index.md create mode 100644 themes/hugo-bearcub/exampleSite/content/blog/emoji-support.md create mode 100644 themes/hugo-bearcub/exampleSite/content/blog/markdown-syntax.md create mode 100644 themes/hugo-bearcub/exampleSite/content/blog/math-typesetting.md create mode 100644 themes/hugo-bearcub/exampleSite/content/blog/placeholder-text.md create mode 100644 themes/hugo-bearcub/exampleSite/content/blog/rich-content.md create mode 100644 themes/hugo-bearcub/exampleSite/hugo.toml create mode 100644 themes/hugo-bearcub/exampleSite/static/images/favicon.png create mode 100644 themes/hugo-bearcub/exampleSite/static/images/share.webp create mode 100644 themes/hugo-bearcub/i18n/de.toml create mode 100644 themes/hugo-bearcub/i18n/en.toml create mode 100644 themes/hugo-bearcub/i18n/ko.toml create mode 100644 themes/hugo-bearcub/i18n/pt.toml create mode 100644 themes/hugo-bearcub/i18n/tr.toml create mode 100644 themes/hugo-bearcub/layouts/404.html create mode 100644 themes/hugo-bearcub/layouts/_default/_markup/render-codeblock.html create mode 100644 themes/hugo-bearcub/layouts/_default/baseof.html create mode 100644 themes/hugo-bearcub/layouts/_default/list.html create mode 100644 themes/hugo-bearcub/layouts/_default/rss.xml create mode 100644 themes/hugo-bearcub/layouts/_default/single.html create mode 100644 themes/hugo-bearcub/layouts/index.html create mode 100644 themes/hugo-bearcub/layouts/partials/custom_body.html create mode 100644 themes/hugo-bearcub/layouts/partials/custom_head.html create mode 100644 themes/hugo-bearcub/layouts/partials/favicon.html create mode 100644 themes/hugo-bearcub/layouts/partials/footer.html create mode 100644 themes/hugo-bearcub/layouts/partials/header.html create mode 100644 themes/hugo-bearcub/layouts/partials/nav.html create mode 100644 themes/hugo-bearcub/layouts/partials/seo_tags.html create mode 100644 themes/hugo-bearcub/layouts/partials/social_card.html create mode 100644 themes/hugo-bearcub/layouts/robots.txt create mode 100644 themes/hugo-bearcub/layouts/shortcodes/absfigure.html create mode 100644 themes/hugo-bearcub/layouts/shortcodes/highlight.html create mode 100644 themes/hugo-bearcub/layouts/shortcodes/rawhtml.html create mode 100644 themes/hugo-bearcub/theme.toml diff --git a/404.html b/404.html deleted file mode 100644 index 086a5c9..0000000 --- a/404.html +++ /dev/null @@ -1,25 +0,0 @@ ---- -permalink: /404.html -layout: default ---- - - - -
-

404

- -

Page not found :(

-

The requested page could not be found.

-
diff --git a/Gemfile b/Gemfile deleted file mode 100644 index f11e16b..0000000 --- a/Gemfile +++ /dev/null @@ -1,35 +0,0 @@ -source "https://rubygems.org" -# Hello! This is where you manage which Jekyll version is used to run. -# When you want to use a different version, change it below, save the -# file and run `bundle install`. Run Jekyll with `bundle exec`, like so: -# -# bundle exec jekyll serve -# -# This will help ensure the proper Jekyll version is running. -# Happy Jekylling! -# gem "jekyll", "~> 4.3.2" -# This is the default theme for new Jekyll sites. You may change this to anything you like. -# gem "hacker", "~> 0.2.0" -# If you want to use GitHub Pages, remove the "gem "jekyll"" above and -# uncomment the line below. To upgrade, run `bundle update github-pages`. -# If you have any plugins, put them here! -group :jekyll_plugins do - gem "jekyll-feed", "~> 0.12" - gem "github-pages", "~> 228" -end - -# Windows and JRuby does not include zoneinfo files, so bundle the tzinfo-data gem -# and associated library. -platforms :mingw, :x64_mingw, :mswin, :jruby do - gem "tzinfo", ">= 1", "< 3" - gem "tzinfo-data" -end - -# Performance-booster for watching directories on Windows -gem "wdm", "~> 0.1.1", :platforms => [:mingw, :x64_mingw, :mswin] - -# Lock `http_parser.rb` gem to `v0.6.x` on JRuby builds since newer versions of the gem -# do not have a Java counterpart. -gem "http_parser.rb", "~> 0.6.0", :platforms => [:jruby] - -gem "webrick", "~> 1.8" diff --git a/Gemfile.lock b/Gemfile.lock deleted file mode 100644 index d7b1808..0000000 --- a/Gemfile.lock +++ /dev/null @@ -1,265 +0,0 @@ -GEM - remote: https://rubygems.org/ - specs: - activesupport (7.0.5) - concurrent-ruby (~> 1.0, >= 1.0.2) - i18n (>= 1.6, < 2) - minitest (>= 5.1) - tzinfo (~> 2.0) - addressable (2.8.4) - public_suffix (>= 2.0.2, < 6.0) - coffee-script (2.4.1) - coffee-script-source - execjs - coffee-script-source (1.11.1) - colorator (1.1.0) - commonmarker (0.23.9) - concurrent-ruby (1.2.2) - dnsruby (1.70.0) - simpleidn (~> 0.2.1) - em-websocket (0.5.3) - eventmachine (>= 0.12.9) - http_parser.rb (~> 0) - ethon (0.16.0) - ffi (>= 1.15.0) - eventmachine (1.2.7) - execjs (2.8.1) - faraday (2.7.7) - faraday-net_http (>= 2.0, < 3.1) - ruby2_keywords (>= 0.0.4) - faraday-net_http (3.0.2) - ffi (1.15.5) - forwardable-extended (2.6.0) - gemoji (3.0.1) - github-pages (228) - github-pages-health-check (= 1.17.9) - jekyll (= 3.9.3) - jekyll-avatar (= 0.7.0) - jekyll-coffeescript (= 1.1.1) - jekyll-commonmark-ghpages (= 0.4.0) - jekyll-default-layout (= 0.1.4) - jekyll-feed (= 0.15.1) - jekyll-gist (= 1.5.0) - jekyll-github-metadata (= 2.13.0) - jekyll-include-cache (= 0.2.1) - jekyll-mentions (= 1.6.0) - jekyll-optional-front-matter (= 0.3.2) - jekyll-paginate (= 1.1.0) - jekyll-readme-index (= 0.3.0) - jekyll-redirect-from (= 0.16.0) - jekyll-relative-links (= 0.6.1) - jekyll-remote-theme (= 0.4.3) - jekyll-sass-converter (= 1.5.2) - jekyll-seo-tag (= 2.8.0) - jekyll-sitemap (= 1.4.0) - jekyll-swiss (= 1.0.0) - jekyll-theme-architect (= 0.2.0) - jekyll-theme-cayman (= 0.2.0) - jekyll-theme-dinky (= 0.2.0) - jekyll-theme-hacker (= 0.2.0) - jekyll-theme-leap-day (= 0.2.0) - jekyll-theme-merlot (= 0.2.0) - jekyll-theme-midnight (= 0.2.0) - jekyll-theme-minimal (= 0.2.0) - jekyll-theme-modernist (= 0.2.0) - jekyll-theme-primer (= 0.6.0) - jekyll-theme-slate (= 0.2.0) - jekyll-theme-tactile (= 0.2.0) - jekyll-theme-time-machine (= 0.2.0) - jekyll-titles-from-headings (= 0.5.3) - jemoji (= 0.12.0) - kramdown (= 2.3.2) - kramdown-parser-gfm (= 1.1.0) - liquid (= 4.0.4) - mercenary (~> 0.3) - minima (= 2.5.1) - nokogiri (>= 1.13.6, < 2.0) - rouge (= 3.26.0) - terminal-table (~> 1.4) - github-pages-health-check (1.17.9) - addressable (~> 2.3) - dnsruby (~> 1.60) - octokit (~> 4.0) - public_suffix (>= 3.0, < 5.0) - typhoeus (~> 1.3) - html-pipeline (2.14.3) - activesupport (>= 2) - nokogiri (>= 1.4) - http_parser.rb (0.8.0) - i18n (1.14.1) - concurrent-ruby (~> 1.0) - jekyll (3.9.3) - addressable (~> 2.4) - colorator (~> 1.0) - em-websocket (~> 0.5) - i18n (>= 0.7, < 2) - jekyll-sass-converter (~> 1.0) - jekyll-watch (~> 2.0) - kramdown (>= 1.17, < 3) - liquid (~> 4.0) - mercenary (~> 0.3.3) - pathutil (~> 0.9) - rouge (>= 1.7, < 4) - safe_yaml (~> 1.0) - jekyll-avatar (0.7.0) - jekyll (>= 3.0, < 5.0) - jekyll-coffeescript (1.1.1) - coffee-script (~> 2.2) - coffee-script-source (~> 1.11.1) - jekyll-commonmark (1.4.0) - commonmarker (~> 0.22) - jekyll-commonmark-ghpages (0.4.0) - commonmarker (~> 0.23.7) - jekyll (~> 3.9.0) - jekyll-commonmark (~> 1.4.0) - rouge (>= 2.0, < 5.0) - jekyll-default-layout (0.1.4) - jekyll (~> 3.0) - jekyll-feed (0.15.1) - jekyll (>= 3.7, < 5.0) - jekyll-gist (1.5.0) - octokit (~> 4.2) - jekyll-github-metadata (2.13.0) - jekyll (>= 3.4, < 5.0) - octokit (~> 4.0, != 4.4.0) - jekyll-include-cache (0.2.1) - jekyll (>= 3.7, < 5.0) - jekyll-mentions (1.6.0) - html-pipeline (~> 2.3) - jekyll (>= 3.7, < 5.0) - jekyll-optional-front-matter (0.3.2) - jekyll (>= 3.0, < 5.0) - jekyll-paginate (1.1.0) - jekyll-readme-index (0.3.0) - jekyll (>= 3.0, < 5.0) - jekyll-redirect-from (0.16.0) - jekyll (>= 3.3, < 5.0) - jekyll-relative-links (0.6.1) - jekyll (>= 3.3, < 5.0) - jekyll-remote-theme (0.4.3) - addressable (~> 2.0) - jekyll (>= 3.5, < 5.0) - jekyll-sass-converter (>= 1.0, <= 3.0.0, != 2.0.0) - rubyzip (>= 1.3.0, < 3.0) - jekyll-sass-converter (1.5.2) - sass (~> 3.4) - jekyll-seo-tag (2.8.0) - jekyll (>= 3.8, < 5.0) - jekyll-sitemap (1.4.0) - jekyll (>= 3.7, < 5.0) - jekyll-swiss (1.0.0) - jekyll-theme-architect (0.2.0) - jekyll (> 3.5, < 5.0) - jekyll-seo-tag (~> 2.0) - jekyll-theme-cayman (0.2.0) - jekyll (> 3.5, < 5.0) - jekyll-seo-tag (~> 2.0) - jekyll-theme-dinky (0.2.0) - jekyll (> 3.5, < 5.0) - jekyll-seo-tag (~> 2.0) - jekyll-theme-hacker (0.2.0) - jekyll (> 3.5, < 5.0) - jekyll-seo-tag (~> 2.0) - jekyll-theme-leap-day (0.2.0) - jekyll (> 3.5, < 5.0) - jekyll-seo-tag (~> 2.0) - jekyll-theme-merlot (0.2.0) - jekyll (> 3.5, < 5.0) - jekyll-seo-tag (~> 2.0) - jekyll-theme-midnight (0.2.0) - jekyll (> 3.5, < 5.0) - jekyll-seo-tag (~> 2.0) - jekyll-theme-minimal (0.2.0) - jekyll (> 3.5, < 5.0) - jekyll-seo-tag (~> 2.0) - jekyll-theme-modernist (0.2.0) - jekyll (> 3.5, < 5.0) - jekyll-seo-tag (~> 2.0) - jekyll-theme-primer (0.6.0) - jekyll (> 3.5, < 5.0) - jekyll-github-metadata (~> 2.9) - jekyll-seo-tag (~> 2.0) - jekyll-theme-slate (0.2.0) - jekyll (> 3.5, < 5.0) - jekyll-seo-tag (~> 2.0) - jekyll-theme-tactile (0.2.0) - jekyll (> 3.5, < 5.0) - jekyll-seo-tag (~> 2.0) - jekyll-theme-time-machine (0.2.0) - jekyll (> 3.5, < 5.0) - jekyll-seo-tag (~> 2.0) - jekyll-titles-from-headings (0.5.3) - jekyll (>= 3.3, < 5.0) - jekyll-watch (2.2.1) - listen (~> 3.0) - jemoji (0.12.0) - gemoji (~> 3.0) - html-pipeline (~> 2.2) - jekyll (>= 3.0, < 5.0) - kramdown (2.3.2) - rexml - kramdown-parser-gfm (1.1.0) - kramdown (~> 2.0) - liquid (4.0.4) - listen (3.8.0) - rb-fsevent (~> 0.10, >= 0.10.3) - rb-inotify (~> 0.9, >= 0.9.10) - mercenary (0.3.6) - minima (2.5.1) - jekyll (>= 3.5, < 5.0) - jekyll-feed (~> 0.9) - jekyll-seo-tag (~> 2.1) - minitest (5.18.1) - nokogiri (1.15.2-arm64-darwin) - racc (~> 1.4) - octokit (4.25.1) - faraday (>= 1, < 3) - sawyer (~> 0.9) - pathutil (0.16.2) - forwardable-extended (~> 2.6) - public_suffix (4.0.7) - racc (1.7.1) - rb-fsevent (0.11.2) - rb-inotify (0.10.1) - ffi (~> 1.0) - rexml (3.2.5) - rouge (3.26.0) - ruby2_keywords (0.0.5) - rubyzip (2.3.2) - safe_yaml (1.0.5) - sass (3.7.4) - sass-listen (~> 4.0.0) - sass-listen (4.0.0) - rb-fsevent (~> 0.9, >= 0.9.4) - rb-inotify (~> 0.9, >= 0.9.7) - sawyer (0.9.2) - addressable (>= 2.3.5) - faraday (>= 0.17.3, < 3) - simpleidn (0.2.1) - unf (~> 0.1.4) - terminal-table (1.8.0) - unicode-display_width (~> 1.1, >= 1.1.1) - typhoeus (1.4.0) - ethon (>= 0.9.0) - tzinfo (2.0.6) - concurrent-ruby (~> 1.0) - unf (0.1.4) - unf_ext - unf_ext (0.0.8.2) - unicode-display_width (1.8.0) - webrick (1.8.1) - -PLATFORMS - arm64-darwin-22 - -DEPENDENCIES - github-pages (~> 228) - http_parser.rb (~> 0.6.0) - jekyll-feed (~> 0.12) - tzinfo (>= 1, < 3) - tzinfo-data - wdm (~> 0.1.1) - webrick (~> 1.8) - -BUNDLED WITH - 2.4.14 diff --git a/LICENSE b/LICENSE deleted file mode 100644 index b3d95a8..0000000 --- a/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2023 avimallu - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/README.md b/README.md deleted file mode 100644 index 2a62b0a..0000000 --- a/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# What is this repo? - -This is the source code for my personal website. You can visit it [here](https://avimallu.github.io/). \ No newline at end of file diff --git a/_config.yml b/_config.yml deleted file mode 100644 index b60e640..0000000 --- a/_config.yml +++ /dev/null @@ -1,56 +0,0 @@ -# Welcome to Jekyll! -# -# This config file is meant for settings that affect your whole blog, values -# which you are expected to set up once and rarely edit after that. If you find -# yourself editing this file very often, consider using Jekyll's data files -# feature for the data you need to update frequently. -# -# For technical reasons, this file is *NOT* reloaded automatically when you use -# 'bundle exec jekyll serve'. If you change this file, please restart the server process. -# -# If you need help with YAML syntax, here are some quick references for you: -# https://learn-the-web.algonquindesign.ca/topics/markdown-yaml-cheat-sheet/#yaml -# https://learnxinyminutes.com/docs/yaml/ -# -# Site settings -# These are used to personalize your new site. If you look in the HTML files, -# you will see them accessed via {{ site.title }}, {{ site.email }}, and so on. -# You can create any custom variable you would like, and they will be accessible -# in the templates via {{ site.myvariable }}. - -title: Avinash's Blog -email: avimallu@avimallu -show_downloads: False -description: >- # this means to ignore newlines until "baseurl:" - Avinash's personal blog. -baseurl: "" # the subpath of your site, e.g. /blog -url: "" # the base hostname & protocol for your site, e.g. http://example.com -domain: avimallu.github.io -url: https://avimallu.github.io -linkedin_username: avinash-mallya -github_username: avimallu - -# Build settings -remote_theme: pages-themes/hacker@v0.2.0 -plugins: -- jekyll-remote-theme - -# Exclude from processing. -# The following items will not be processed, by default. -# Any item listed under the `exclude:` key here will be automatically added to -# the internal "default list". -# -# Excluded items can be processed by explicitly listing the directories or -# their entries' file path in the `include:` list. -# -# exclude: -# - .sass-cache/ -# - .jekyll-cache/ -# - gemfiles/ -# - Gemfile -# - Gemfile.lock -# - node_modules/ -# - vendor/bundle/ -# - vendor/cache/ -# - vendor/gems/ -# - vendor/ruby/ diff --git a/_includes/head-custom.html b/_includes/head-custom.html deleted file mode 100644 index 44cdb83..0000000 --- a/_includes/head-custom.html +++ /dev/null @@ -1,12 +0,0 @@ - - - -{% include head-custom-theme-colors.html %} - - -{% include head-custom-google-analytics.html %} - - - - - diff --git a/about.md b/about.md deleted file mode 100644 index e2ade15..0000000 --- a/about.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -title: About Me -permalink: /about_me ---- - -Hi there! - -My name is Avinash Mallya (pronounced Uh-vin-ash Mul-yeah), and I'm a Data Scientist at [WISEcode](https://www.wisecode.ai/). This is my personal blog where I post about some creative ways that I've solved some complex problems in my career, usually with a solid amount of code to make sure that it's helpful for you. - -In my free time, I'm involved in helping folks out at my favourite open-source package repositories, namely [Polars](https://github.com/pola-rs/polars/) and [`data.table`](https://github.com/Rdatatable/data.table). In fact - I've written [some parts](https://pola-rs.github.io/polars-book/user-guide/) of the Polars user-guide. - -You can connect with me on [LinkedIn](https://www.linkedin.com/in/avinash-mallya), or [Github](https://github.com/avimallu). The source code for this website can be found at its [repo on my Github](https://github.com/avimallu/avimallu.github.io) as well. You'll also find source code in the form of text files, Jupyter Notebooks, or R Markdown files on my Github profile. \ No newline at end of file diff --git a/archetypes/default.md b/archetypes/default.md new file mode 100644 index 0000000..25b6752 --- /dev/null +++ b/archetypes/default.md @@ -0,0 +1,5 @@ ++++ +date = '{{ .Date }}' +draft = true +title = '{{ replace .File.ContentBaseName "-" " " | title }}' ++++ diff --git a/assets/001_overlap_joins/overlap_algorithm.xlsx b/assets/001_overlap_joins/overlap_algorithm.xlsx deleted file mode 100644 index a7a79ce04765b4f3f1ece439c2cb6d5a8e8da47f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12109 zcmeHtg;yQP_VvZx-QC^YA-F@3;2!K^!6iU~ySrQPK!D&H+}+*XT|P2z=FLpr{JwwS zy}oyK-@B^MUR~Aa?5a~|E6IX^qXQrT&;S5{1mN&;zitfz06;?k0B8Vc(05`$TPIUn zCw(MQ{0>;3;b{)Zb>zQtJ-v&wN98OWI>fmvT2_n zCexk305de%=UPaaS}2q1y{jpcuPz^PO!4To(EL1B@k=1JeLsINu*k1%!SF5c?n^Iv zYXtM?%-*mO&jBLWD>i8`(T6r^R3>)alsf{2iiE3m?Ft>HM}ao{UOiYi&(nC5DY40s znwss0K`#C>GUP@xqWu=opYbGIW+VQSHKV6127}>g`u4j6jm+utkO@+OxY}}ci1D`v z3A9RC7sTY8fb1y=+|akwj+=sOnSRlQhMtB|w?5LYAIV0&!4yX>P+|r@k_0qEHaX43 z?nXJ1@%P@Weqm!oJXQ7hDCYh(9J4US}^2MMdW$t92<0NW8cI07XmbknqO7bgc`;dFpEF zI$2W2joP_6lD6b~QMPQ~3fY^9Gx4v;Ba9ljFlhPs0hj{GzS`aLTFXYa`XbJ~Iggdk8{7JaUKQ$r!zkM&@(np1sy2S9iGTsun!&D~&Q7cuC##O|084 z#8X?*o;(>8(t1@$*->vdlemsEP za+vu8tEJ;8LI11I41C-Cc>hWDu*~mUT^(@>joH>qz1YGvWTu}R(bxqJj5I%j8(?gA zl7#NIUE&)0yy?+Q-fh^bJ@+1d3%^8`u$V)@Gr);Buve1EhbG2xD<`>8{bbEa^r4@o zb>WJ&e(9&fhLSlA0fbqkxsRv@i@pj}l76|*)0QRO=7mgT4Y)pr)di?D0uh&yQrO) z)IyB9B@(HY2*xPTL61v7J6R7@L*;I9`YmlgF7ex@)%_YUj&N24Th90>Cw1XjzI9wa z7$Kx*n1J?UMbL>kWeUZ7i!N;h0Pc}=<_|??(oHc~=N+E!@O>gN&33w-WORF8G4U>4 z=L!bkFYLG=?>}h65W8iHJ4P;AU));`!Cik(EEhSrr(^h#4?96^k!yydK@T^CLjNPd zYc|S;pr#2x*G@=6*&x_|r-zI4ZlYER4%q<-DI$ZbR`&>|BMCjEFN78|RK^z($^NNy zoA;0#E6dJ!_}Q}FWK=VYDG1|D3Z&E2qG~)|8NDc)mld(AxW21&XpV%JMp`W-UirB* z$0{fTTQPM<50po$9KL`Ysv`scf(JE5iyA-`hBDS9Tmjmn88O64*V6 zFIi>%NFk$1*?YowBXTZIGw+}gwKLL(eL4e$WJiSHn~xeJ)KoiE2{1-`d<%VF5owmJ`UNwlVB~ZtrTT+79`d*#@#;f{_2xYaA*ciuN$^$_OD%DH z#Fj#AHXrGP>oz4-74PE}6%#Gd2OwLqwuRAB>k{v%vBRu@ZTSseAg|YMy@BAAn^4me zFainLtDVtFfsn~5taX{;nDMeXogqQ7FMl|;(So;r(T6ot@mX`w`y^8MB}r)#Lnks_ zPMIn8p!FZQzF4sog5tF$_m%6>{}s577KRR{CaO*j?`_Q;e^Py1O#9E}s`yFtITBr_ z*b-)uQhZ*Z48E@z%8pHw4Lv^JY%1n6Ar}P5XQ{34^H+m-;TJ!wj143OEzIFqaKa&? z%F@Q2-v#wd9sLOZ*k*x&YyJfph~AYW7t0SGa626!Iyrcx)2}o&X@FgyV7+La28`O+ ztz-R`q4YT=2#>6A<4lgTsO)3^hXgnlv{9|6@v(D9#*3_hv;hi8zxR+xyIQ%v551O^ z>4km$E>mn-H|~fncCt;KxmtSg_|$`$SB2h&lQx66^W736=yW7m^4w z+`mkOX6&$rzALXG=xPU>f{{;2LmFSu@%rHm_SL>~)90?MAtKwS6pHoc?F`Oh{Tlnr zbZT1RjfT~VO!Qf7{K-G^p|OpaY&SRnu!9W%ApAb8PHxtwzm4ah*3wTl^m%1Ns8E-F zN#9S@CR6O8-^Q0M^RM$fc0<7^zglkeaxa-E-n6dF3TN$oNZpR9Z34&h*ybY2z)|eZ zcAHfs1BE<6*!GzS^;|L}E~*(b-N4jv=2;P@697J82E4t1;a)lMWIU z&M8H;`Z8&`$*o>Xj<11bBq4LF0^Rr3FI$IuN(MDe!yU~$;-n$ElZBxyr6b5Z5P3~= zxkAI4@)nkkw=k@@EZdYMBfN!PhU6>_WHKCU72c*v>fVCv9i`bd43PpG4Xtt!T-HHQ zP8NYG6g% zr=&zTah}@%AeHK+ctPxWaa`U_-pHx7j8mAr$VJ@O^d9&&|Z+zO&5gw$ElkbPrdBbGOEkH2qWW;=6>CmvvJ4}iV!)&QTxQA)u^ zIJAvr|4Uy|w5abLxi0-x1uC75TsAuRX&-l?D~ZgY6S|elrHiPF|6{yn+NRTxId)9U zb%W%XrGB;udbjr`A{cNrMQYmu-u$zH&d#H?9>pF>afvhV>aA*zBOdY?X=yLOM84kt=?=z4>9RiOQt;J^>VY^bN6#QQ;x}& zKg$UkIWVnj3|Nd6#Zpl!nH0^=kGiC?(8A)uk&@2({s~oktduJkY@~o&Y9i4irTjBM z6?44fA(N`x^1K#^u{uB+~ao1v67h5OI*|L zqYx>*m!j4Bnj|YJ{`k$ODOvjytcg*iV2wHxW5&HgS&XQ-1~vPHE)dh&dV+Mynr4J$ zQ9Ohyz$1&%knh`Bil%}w1&aXq6R&`!`oHJ;G+-leea>g@IlFneV@ zF|1sA`CpB{0ro7Lf*Ne59{ZWJ&@LfyY7`PMQ!_iLta7NYd%ZMdmuxLHk3ApUe-fpH1Cid9A-U)n092z7SoxW6Fg!u!o%7Iog9JAKa3P9S|~ zeD-STz{g#8?`15OQ{L&jrE7bU(P(`_cqPJZsx9MJcYoX#m>oc4q;4Hgx#&pEgzQYU zKQz*jp%c#h``x>0>LhQ(iON6${wkLv-V6*}n+y=K|2t!qn8s@%QxMw?8cZP98o*4#9RXBY!&a zJ3+p-9d}2LF3=M{rM&`4FnRE|L9IF~1OgfT{8nwu6Q9fq=7kEC7irE{(*sm6iFSwRN}fn{%E3Rl*B1@58}%zLBKb-ba8HjGqC3lc-Fq*ZAQ&}}INbxI zn($Q>WC(*#TQUAQRB^Vz!^g~{1!rcb({0XZSt0tk@Y~)YR#an2 zY5%wrg4RHl?cS_?887ux{eSFzPM;{y?{(iVA0GgCW&EGZUlRvIm!A{pA3uKU_o0?9 zaDfxui>UHNcvqK$##@Tj2rIz^11x}3vyrH+Uxiez06thg4fE-wIgi}Kk-iWnh92)c zXOxu5?e%aP9-3P?Y7o_Mn@Ffh;n_rRRw}P@S1%4tzSt?8M8Kc4{PMP{SY6Q3_I%on z@8v47`lvWruTI+E0CY-WZD+84(w!|`ZvK!}f8biaxewzK^Fwt4t~V!EtU6hR;r<7X zGiJfkxw z_u60eE@Dd1JIQ9o_MKYB%hXam#r+)WYELNwDf|w~>!Pxa70geD?ROnpgSm|UwphkO zPIIjCm|?5r*@um6$(iz{H=X*8p^Q*+$oFXOLR~#!TrdvEmD2$V3Uv}-edL9!c=Mu{ zo-$zYE<0x1u3>1PHc9P_L9E!qqU&O2JkcM~Vhm?nY!x z6>VF#c>cax*($rZ_|Stf+cy+CMfut!Ue&%6lkzlE67ep}7Fut69@ zZja>`+kIzXs8K$(?5bPb@U@*MNf;=7;xHCYL^^uZIDqJ=e}7mcGiyp(gI~1)J-8Um z-^GV0Kxl3ZEj(*~2;+B3ILbEY0C!OoNa7ZmyX=+djeJ|l*B;oSbP59l*Fh1XJE(H} z1|&;w^+EP^*Fz4A+su1kfaCTy!yt+m)02A}UQn`P^#WG#CP!fKqI;|`FhFdZ419U+ z5&QzDQ^2;(9Nw$fes#g)+s->AQ9^I3^Gd7`e!sTpJA79KR0>;k7NV#?W3G1lk66kw zMk79!n`@txm&uS2Kta-;GkZ5+77>`g^*9_ndpu<32`)+QQp2Die23h? z67>=$7L;<*+Gg_uG%N6R5r)h~RD~HJQO8HP!)-@@behByjMteZuX%K4ii`?4Q~&aO zpQ^@N5c>$iEZBZqv`l&?dPX86A(f2Gh!WO7Qi;N)<;Mw&U7*}sAC#~raN6Dly2o&c z%~&OWtw3;O%uX3Dnu%v)l#c@Qv@pJVdlz<)3;C&?Mj~$?-Kj@-OtB`Gd#%` z7t$3r9?8{v8Lno+Z~NQP?T_dB8lo55RDU+A`UV!6J+{Zsxt~#^o&k|L#Ucu3>h<=> zaSAPjEseIDX4}-?_Yp0fFlMrzi8aSDwS|GstX9>xIcwxDv;IUl;{`medA(Oi{7-MQTkC0 zzE@wU6ne-dm;y>7A1EN>m8=HYQFY%Njh8!#zrjXFXFN7iQuH@cnmi~L01LTes`(zv zXe=kO4%uUT31AxOWvZuK%G4y_ZolpG z$>>sF`0E%gdVu9<5-yme{46lO?M{zhkPZh9$&lVPn>k>DIGaU5mq_)n0Og(VXMTB| zgaGbfu!sqEcSP(99O$QvFqR_ScC3RewM$sz!k|?;9I#rBH{DrMPe~?&qTzQ)8;?-` z$lL8$$Sn%5P2I#lYc{{}wv&aajVaS_=ie!NC=`ziy%pTPjH@w9_g$AmfdmQs8RQcKJ>>xH#m&cIW1%<+7$-Ey25+F#ov zUmvVUr|0V6NxQXnyb#2K-7mhNc9!=b-Zsh*LFs-fyHVpreE@TLRA0Bco}f7L^GueS zPh|iRe8Z{)T!jdYpiXCCx>=$5!Ausq{=3c@*&{urx=Sl1acPI|0gRt(EM4m7F-$sk zBhZ%N{Y9E%XhxKy5K0bJROK{Dxwf>!j#&i(A3;^frPup@z$=bISA7qq=2`7ppqPM0 z1qPr}8hlryL6A|utq}BmE+7l3WoFHb*EI;%#8bI;HR|eSUP*pviiqwC3dcs=PZ+$-9KjYe)q&n;9YJI#LNNjyMi^W>;y4q2UB$!{oCrCOa3I2LozGi$v8EWW@_;3ayl-|WG+7%;=vg=%Q zJkSfO_l|hK<3r_9#{#})H$)SEtJPcs(OErtL~_NOuMmsIVb0htysO121E;5U8FEXp z7xlr7!K2Yu$BZ(ifSVn*ERA)Qx$sKUZG;fi-~#UUan;tZVqpX&jbcGtGXkvZa+SfC z$H*1_K@${W4h9q|jNinJf(ANFi9gMs4=vkNbQW1n33!^28NNOTvv<&!t?mH}M&&~l z9&r{9f|gK|O;!h=c1g-|CUSB25Soj7WBO0B+q{8SxFW5v@EeE^gt}dvF|rQ3wb2buhIZPiCawAvP^j;;4e| zO@|4-HiacO6Ja^|Rfd|*^ViPS3}9^4D^=;j#|KRJS}mEuj{Ud zkd>|c_zeS~Vd1fs{DLr^b;Q$4w5^ZhQfE^+k-*U3ylqB{-3~=+aN<0^$e> z5&7=yA&xhd+H^h| zTxoQ|#S&!-cC`ggmdhp&ym!@Hv=Sky=O(ZX<;?JuKVU2CBZ{KynSauoOV%87(i~IT zPt4YSW4{H@G*68_$5+1a=8hT=d_QR1-tRzUO zzWY*As*ZN?+1}MyLf6rfv0L4t?P7P%xI)&GO}@j*QT^_WBb{M;>tdLIgH;tM9>=Q_ ztI!Y05}o7`*TtaE;1iF)K8BxTL#Oc(Sx|c;MVO8#)gIZ2uh*5eo$P(U61H-N0+H{U zYPsEW@sAaPQt~%x85oElfO3pb+CK(+Z!R3QvigZNSigPLL*$0gLNyT8-&5BE0L{t5akngw63x3e< zPddf!1@dhol$?uAR?+6$J}EFblv^>@Bce{Z$uzA^dWC|uGc#lkvdU{UDRhQZS1T`k zW21+LSDfU$wfXRdTi~pmN~kw|Q2T>0{eevS?S21Z)07#Mi!Z;soey`R%C3?qFp-S< zejKkij?*A?F;*)adZmenis8kZ#u{o#W|koi*RT~?&0i%OrMBd=Gxpnor%Iju541?D z2GPnoh!Y3*AUcMl63*`{dS)1pH?|mtKBI(&%IObc)vVpGx9H4y+Ml2hr$5y6XKC3u zTYfgH5ugTdR>&PaoaX(kSN84%!F{Q644?nBnG6AOe#%zqfD5+9q3#{DC55SXu2vCL zybNDa9o|#c6EU5!!4{2|Neke{va$B%A2%PT)W^GQUehK<)PJWJKM;3b^wjWuTO2hM+qni5e)G~Z&Cs&H(YAO+~?H~Vlc(|Q4A00$)5 zoIEsTx{-cur>Nv?E!tw?EA;URgX@ybu!GuQbSb1-5X#sEz9u=842F4%hDBQ{c1biX z(Mk)LIoU>-SE(wc@{+NS=xHYR-qpwU6f;4ZK{B&mU=$gfxsB>&?C;dLZz3qeJov&R zp)>7g3hKQlrD4nCm1Pgecq}-GB8A`sKsKPp&mO4^El@37k!^iPigsD0zxfzQj8xu= zYPx^qX}q)`3rXWggsfgONf=$W5yHFNell6cGdq)K3ZqFM^>#=_>{!{f)PY{COzoej z9PE>4O_6*5#;?RaHj4Pi4rPOPNE?;*m*bb$ z@{t>pwxP=5Hs12Lp%>Fq#l9ypekpl>I6TYF?d0Wlj6Rr}sDz9Q|D?3Mdc|Wu|j;GdmS5M>8nDlWCXmPHfc97_d(6*OwNZ%7hS_@}J<5~I0 zJ2$_yGXETevd<&lNe_I!pCal?}G9&lsL)?ML912^I27Ti=BK~2h zTL%?{t$ky7q*i6?@vvlH{?*HZVdD07Vr8fGB%=D_x%@z(abxfM5D}60o5;^n;*&l? z%Qv5u@M@r{ zPUo929X1uV92}lknmym{$Z`Z(@PGk~R8&BPz(pHIWea2YlI#Pn!BtAWBZ?4!$_q0d zrif9$hb~RNvo3Zg&QNcz!+x#VsMk%&K20|;qnZjFW7nH(hD65%#R`KefWmOYz`xqr z)Z(DcBCp-?z7XBfvV_b)fTxKe+aaR(@q(v(oPa<;@rK66tvJy{_t1mk{`nPC3KT}O zYerqu6WK`p@jhlaoheZa+d?@>tX2ZcJ5(<`WvBImK$1cdL(;=PEsy!N51C**;TEIf zMyu3%7%wy|7-r!6ja4sO%g8gl@877fg>!Z>d=WvLo(h93B`@|06xRtP`7%_joQrUV zKVAhBIBLLOpOwLZMVA)DjlHHq@(nv#I0>3L3=#Y+wdHZxj4Lz{ znLR-65W5BD`C5D|#&+61k1Ie99Pwm6d&lspw93NM%s^|=u<~-ifjK3gLAJBkW_(xhNViJN2bH@5O_SWt>jzlFipe1)qbq*#%@eB&73OMQDjn)e5!g5*dT^XsH z;bcDl^DV8n?J!{&HMB~oKd1peEEy+Tgqar9zYF_*P_x&bf`y&*lNdO^rZi8foNufC z!hucI2APpZZ`dFVwZq;%TLmU%Np_;7w>b4iWv9X{lEak935h#=gC}8?x-eoL5qm#6 zh*4_zO`c#%F_c|EHYiNLR+{*$-}5q$KWmTDp%tQ+Pk9%}F4Ck{i{LMr)4egCU{{X4 zV)1+iZ!OE@d@9OTS}MoRV%-U22AiBJXySvBI3k(F=eaeOFDcIF$>46Vc{|xqqyMM? zXa&B|HgMi6JQ;}bt@=jF1hlur%^a@TH;S6#7HVOSbh0mW(?}b$zH4&f@t$-U3xsl$ zz5uS%Q_OjaK7z*awA?dpQT-M%zlydx^t7O(UVRYn)kBg0>Vt-McK>t1*CG4;NQ;pN zF8ow3f!!0qFX8dnD8u`f8cAtfRvLlCIGZaJ7-v_J2bD%2&M4N7P0l&bhZ8aB3FZ_X zBc{{2%bECBbU7%8fHuR_Ts_F}pAa$%h5BK8A~3p^cA-cw?u9B^#)@`zVSeew%%B}( z?TL>w(LVf$S%2hM2=fJO`2GCADEsuP7c-E+Jwe0Njqa>%*Q%6hqfbdLq9o&G<{P5f zYHs2Zi^_R2<_e@WX_>p;l?8X6-(f{l8=dkacn3%+ssK4$2HPreY7C2WH1{46 zNwZ35Z=MOJ+z*yCtDUdSV*|=j{*G$~%)Xo5JnO?%V)x6|#AiZ5iH_^hhU@8ewO}jk zj>BAnJc{?79s~{0&q;WNyQx{X4+l z)r)@^{=DYDhQ?pCjK3QGUD5Sd!~WN2{lE2HzvBEV^Z66$=~ejii|FT9<6or)e;U`q z|7QFj!h>HCeyytiiGYCkFNA;B*nc(swLbNy>GNyy@%xki|Eg8L0{&X^`4jN*btm!v zDggb8^6LiVpD5pOena_nJMve6UsI?*0oX`>?bn|P)vqXjpXL9=005>b0f7IQ^M5t} jJ3;@|T$|=E=D*Xmk}Sll(*XeRuOF;eza^&s`S1S$Q~Np* diff --git a/assets/favicon.png b/assets/favicon.png deleted file mode 100644 index 1de88d55b6fcbe624464a94235abafd2a1550271..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1415 zcmV;21$g?2P)dGov^0T=GO4K&L7bwk#8*iCGqZS{@!qbz_HleH!QI(w?|UGJJo3pMcBn9mlEC zwJY>F=>Hh{_znGMudlCvWV2cP?K>Rx#K6G77dSWmT%b)xamjpJTwI*yZ9D>K_2S~< z3;_RFXv^mFd?51c=H{l4yx|c5%l~}o;E6br08f0v-;w};p91hGomX=JiD@7)<+#$> z;hNvv+>}J1k^F;y0{(l4Jm((wckrD>62GRi2K3_(Lie|W4`G+69e&dH_V#v;;TWXU z=z#SxV88OGuCA_n;0aL9Cj%Y^+T>PFh69$;V8H2nS67$sQPA&%GdMW-3(kJvS5{V5 z1X`Bt?s>xX3e#eaC(h5$MOj&yC@Ly4%F*Zr@&^0l#Jan?)n~4u2aeQ~xxBpmARR6v z2HqzjCMRrvdwc7%p0wtJNplII`ilOa*U5%^qNk@vea0?&fXiDpSXx>N1+U6Rm6&Q} zwP&AvnEr!EXb1=+0iA4AkmMl_j@pC~pnIakL2qwwju*8Aph$#zK+Q~QTwn~?2Dg!f zD>0H$Bm%Y`;3jEpZ53NvTk_QK@UWPhn==M-pri~z3@P8v1DQ-F+yfeDXJ==kqM|}x z+1uL_4Gj&}1Rmnt9ME_z5`iEOm{8F@YEF;BLRSxnTwh{0AB_Nk=P_YTAeBmaS%{<&reU%^b(pUQ zbTW!Xz_u7+yNinpQC?o|kv}>*64lk!Vcd<^)r{2N-)|QK=z%EmAunMe+uq*x)sUc3 zX&5sa1QL;g6W~FsN-7Mj={g^cJ}CjJ%K2m>FAm%>QNaknnvH-J4PV-XbtQ3ibrqUQ z!-8EJpwI+NaxsAm1I^|1Bm@u;dZDzm)F)*;uMVpZ4h}?3O^vT!jE;`V%55xYh4z3B zC}pOmrY5nov*Tf-?54^th``v`n7lty3^c!M7JvT!u}&VkU`4R|`}?A981pFDU-x1PX|{O#-CW+h6x&AzaT`Ha`s78VvhN~sYDS4y}w p { + margin-block-start: 0px; + text-align: center; + font-style: italic; + color: #ccc; +} diff --git a/build_website.sh b/build_website.sh deleted file mode 100755 index 414c0c7..0000000 --- a/build_website.sh +++ /dev/null @@ -1 +0,0 @@ -bundle exec jekyll serve diff --git a/content/_index.md b/content/_index.md new file mode 100644 index 0000000..0f68743 --- /dev/null +++ b/content/_index.md @@ -0,0 +1,26 @@ +--- +title: "about" +menu: "main" +weight: 1 +--- + +# Hi there! + +My name is Avinash Mallya (pronounced Uh-vin-aash Muh-ll-yeah), and I'm a data scientist by profession. This website is a creative outlet, and my piece of the internet where I show off. + +# What's here? + +You'll find the following: + +* A few posts where I show up some creative ways that I've solved complex problems. +* Links to projects that I've worked on, or have contributed to. +* An assortment of random things I've found interesting. + +# Contact + +You can find me on: + +* [LinkedIn](https://www.linkedin.com/in/avinash-mallya) +* [Github](https://github.com/avimallu) + +Please reach out via one of the above if you want to talk. diff --git a/content/blog/001_overlap_joins/index.md b/content/blog/001_overlap_joins/index.md new file mode 100644 index 0000000..2cd619a --- /dev/null +++ b/content/blog/001_overlap_joins/index.md @@ -0,0 +1,495 @@ ++++ +date = '2023-06-22' +draft = false +title = 'Overlap Joins: Number of docker trucks in an interval' ++++ + +# Premise + +I stumbled upon an interesting [Stackoverflow question](https://stackoverflow.com/questions/76488314/polars-count-unique-values-over-a-time-period) that was linked [via an issue](https://github.com/pola-rs/polars/issues/9467) on Polars github repo. The OP asked for a pure Polars solution. At the time of answering the question Polars did not have support for non-equi joins, and any solution using it would be pretty cumbersome. + +I'm more of a right-tool-for-the-job person, so I tried to find a better solution. + +# Problem Statement + +Suppose we have a dataset that captures the arrival and departure times of trucks at a station, along with the truck's ID. + +```py +import polars as pl # if you don't have polars, run + # pip install 'polars[all]' +data = pl.from_repr(""" +┌─────────────────────┬─────────────────────┬─────┐ +│ arrival_time ┆ departure_time ┆ ID │ +│ --- ┆ --- ┆ --- │ +│ datetime[μs] ┆ datetime[μs] ┆ str │ +╞═════════════════════╪═════════════════════╪═════╡ +│ 2023-01-01 06:23:47 ┆ 2023-01-01 06:25:08 ┆ A1 │ +│ 2023-01-01 06:26:42 ┆ 2023-01-01 06:28:02 ┆ A1 │ +│ 2023-01-01 06:30:20 ┆ 2023-01-01 06:35:01 ┆ A5 │ +│ 2023-01-01 06:32:06 ┆ 2023-01-01 06:33:48 ┆ A6 │ +│ 2023-01-01 06:33:09 ┆ 2023-01-01 06:36:01 ┆ B3 │ +│ 2023-01-01 06:34:08 ┆ 2023-01-01 06:39:49 ┆ C3 │ +│ 2023-01-01 06:36:40 ┆ 2023-01-01 06:38:34 ┆ A6 │ +│ 2023-01-01 06:37:43 ┆ 2023-01-01 06:40:48 ┆ A5 │ +│ 2023-01-01 06:39:48 ┆ 2023-01-01 06:46:10 ┆ A6 │ +└─────────────────────┴─────────────────────┴─────┘ +""") +``` + +We want to identify the number of trucks docked at any given time within a threshold of 1 minute *prior* to the arrival time of a truck, and 1 minute *after* the departure of a truck. Equivalently, this means that we need to calculate the number of trucks within a specific window for each row of the data. + +# Finding a solution to the problem + +## Evaluate for a specific row + +Before we find a general solution to this problem, let's consider a specific row to understand the problem better: + +```py +""" +┌─────────────────────┬─────────────────────┬─────┐ +│ arrival_time ┆ departure_time ┆ ID │ +│ --- ┆ --- ┆ --- │ +│ datetime[μs] ┆ datetime[μs] ┆ str │ +╞═════════════════════╪═════════════════════╪═════╡ +│ 2023-01-01 06:32:06 ┆ 2023-01-01 06:33:48 ┆ A6 │ +└─────────────────────┴─────────────────────┴─────┘ +""" +``` + +For this row, we need to find the number of trucks that are there between `2023-01-01 06:31:06` (1 minute prior to the `arrival_time` and `2023-01-01 06:34:48` (1 minute post the `departure_time`). Manually going through the original dataset, we see that `B3`, `C3`, `A6` and `A5` are the truck IDs that qualify - they all are at the station in a duration that is between `2023-01-01 06:31:06` and `2023-01-01 06:34:48`. + +## Visually deriving an algorithm + +There are many cases that will qualify a truck to be present in the overlap window defined by a particular row. Specifically for the example above, we have (this visualization is generalizable, because for each row we can calculate without much difficulty the overlap *window* relative to the arrival and departure times): + +![The five different ways a period can overlap.](overlap_algorithm.png) + +Take some time to absorb these cases - it's important for the part where we write the code for the solution. Note that we need to actually tell our algorithm to filter only for Cases 2, 3 and 4, since Cases 1 and 5 will not satisfy our requirements. + +## Writing an SQL query based on the algorithm + +In theory, we can use any language that has the capability to define rules that meet our algorithmic requirements outlined in the above section to find the solution. Why choose SQL? It's often able to convey elegantly the logic that was used to execute the algorithm; and while it does come with excessive verbosity at times, it doesn't quite in this case. + +Note here that we run SQL in Python with almost no setup or boilerplate code - so this is a Python based solution as well (although not quite Pythonic!). + +### Introducing the DuckDB package + +Once again, in theory, any SQL package or language can be used. Far too few however meet the ease-of-use that [DuckDB](https://duckdb.org/) provides: + +1. no expensive set-up time (meaning no need for setting up databases, even temporary ones), +2. no dependencies (other than DuckDB itself, just `pip install duckdb`), +3. some very [friendly SQL extensions](https://duckdb.org/2022/05/04/friendlier-sql.html), and +4. ability to work directly on Polars and Pandas DataFrames without conversions + +all with [mind-blowing speed](https://duckdblabs.github.io/db-benchmark/) that stands shoulder-to-shoulder with Polars. We'll also use a few advanced SQL concepts noted below. + +#### Self-joins + +This should be a familiar, albeit not often used concept - a join of a table with itself is a self join. There are few cases where such an operation would make sense, and this happens to be one of them. + +#### A bullet train recap of non-equi joins + +A key concept that we'll use is the idea of joining on a *range* of values rather than a specific value. That is, instead of the usual `LEFT JOIN ON A.column = B.column`, we can do `LEFT JOIN ON A.column <= B.column` for one row in table `A` to match to multiple rows in `B`. DuckDB has a [blog post](https://duckdb.org/2022/05/27/iejoin.html) that outlines this join in detail, including fast implementation. + +#### The concept of `LIST` columns + +DuckDB has first class support for `LIST` columns - that is, each row in a `LIST` column can have a varying length (much like a Python `list`), but must have the exact same datatype (like R's `vector`). Using list columns allow us to eschew the use of an additional `GROUP BY` operation on top of a `WHERE` filter or `SELECT DISTINCT` operation, since we can directly perform those on the `LIST` column itself. + +#### Date algebra + +Dates can be rather difficult to handle well in most tools and languages, with several packages purpose built to make handling them easier - [lubridate](https://lubridate.tidyverse.org/) from the [tidyverse](https://www.tidyverse.org/) is a stellar example. Thankfully, DuckDB provides a similar swiss-knife set of tools to deal with it, including specifying `INTERVAL`s (a special data type that represent a period of time independent of specific time values) to modify `TIMESTAMP` values using addition or subtraction. + +### Tell me the query, PLEASE! + +Okay - had a lot of background. Let's have at it! The query by itself in SQL is (see immediately below for runnable code in Python): + +```sql +SELECT + A.arrival_time + ,A.departure_time + ,A.window_open + ,A.window_close + ,LIST_DISTINCT(LIST(B.ID)) AS docked_trucks + ,LIST_UNIQUE(LIST(B.ID)) AS docked_truck_count + +FROM ( + SELECT * + ,arrival_time - (INTERVAL 1 MINUTE) AS window_open + ,departure_time + (INTERVAL 1 MINUTE) AS window_close + FROM data) A + +LEFT JOIN ( + SELECT * + ,DATEDIFF('seconds', arrival_time, departure_time) AS duration + FROM data) B + +ON ((B.arrival_time <= A.window_open AND + (B.arrival_time + TO_SECONDS(B.duration)) >= A.window_open) OR + (B.arrival_time >= A.window_open AND + B.departure_time <= A.window_close) OR + (B.arrival_time >= A.window_open AND + (B.departure_time - TO_SECONDS(B.duration)) <= A.window_close)) +GROUP BY 1, 2, 3, 4 +``` + +A small, succinct query such as this will need a bit of explanation to take it all in. Here's one below, reproducible in Python (make sure to install `duckdb` first!). Expand it to view. + +
SQL with explanation. + +```py +import duckdb as db +db.query(""" + SELECT + A.arrival_time + ,A.departure_time + ,A.window_open + ,A.window_close + -- LIST aggregates the values into a LIST column + -- and LIST_DISTINCT finds the unique values in it + ,LIST_DISTINCT(LIST(B.ID)) AS docked_trucks + -- finally, LIST_UNIQUE calculates the unique number of values in it + ,LIST_UNIQUE(LIST(B.ID)) AS docked_truck_count + + FROM ( + SELECT + * + ,arrival_time - (INTERVAL 1 MINUTE) AS window_open + ,departure_time + (INTERVAL 1 MINUTE) AS window_close + FROM data -- remember we defined data as the Polars DataFrame with our truck station data + ) A + + LEFT JOIN ( + SELECT + * + -- This is the time, in seconds between the arrival and departure of + -- each truck PER ROW in the original data-frame + ,DATEDIFF('seconds', arrival_time, departure_time) AS duration + FROM data -- this is where we perform a self-join + ) B + + ON ( + -- Case 2 in the diagram; + (B.arrival_time <= A.window_open AND + -- Adding the duration here makes sure that the second interval + -- is at least ENDING AFTER the start of the overlap window + (B.arrival_time + TO_SECONDS(B.duration)) >= A.window_open) OR + + -- Case 3 in the diagram - the simplest of all five cases + (B.arrival_time >= A.window_open AND + B.departure_time <= A.window_close) OR + + -- Case 4 in the digram; + (B.arrival_time >= A.window_open AND + -- Subtracting the duration here makes sure that the second interval + -- STARTS BEFORE the end of the overlap window. + (B.departure_time - TO_SECONDS(B.duration)) <= A.window_close) + ) + GROUP BY 1, 2, 3, 4 +""") +``` + +
+ +The output of this query is: + +``` +""" +┌─────────────────────┬─────────────────────┬─────────────────────┬───┬──────────────────┬────────────────────┐ +│ arrival_time │ departure_time │ window_open │ … │ docked_trucks │ docked_truck_count │ +│ timestamp │ timestamp │ timestamp │ │ varchar[] │ uint64 │ +├─────────────────────┼─────────────────────┼─────────────────────┼───┼──────────────────┼────────────────────┤ +│ 2023-01-01 06:23:47 │ 2023-01-01 06:25:08 │ 2023-01-01 06:22:47 │ … │ [A1] │ 1 │ +│ 2023-01-01 06:26:42 │ 2023-01-01 06:28:02 │ 2023-01-01 06:25:42 │ … │ [A1] │ 1 │ +│ 2023-01-01 06:30:20 │ 2023-01-01 06:35:01 │ 2023-01-01 06:29:20 │ … │ [B3, C3, A6, A5] │ 4 │ +│ 2023-01-01 06:32:06 │ 2023-01-01 06:33:48 │ 2023-01-01 06:31:06 │ … │ [B3, C3, A6, A5] │ 4 │ +│ 2023-01-01 06:33:09 │ 2023-01-01 06:36:01 │ 2023-01-01 06:32:09 │ … │ [B3, C3, A6, A5] │ 4 │ +│ 2023-01-01 06:34:08 │ 2023-01-01 06:39:49 │ 2023-01-01 06:33:08 │ … │ [B3, C3, A6, A5] │ 4 │ +│ 2023-01-01 06:36:40 │ 2023-01-01 06:38:34 │ 2023-01-01 06:35:40 │ … │ [A5, A6, C3, B3] │ 4 │ +│ 2023-01-01 06:37:43 │ 2023-01-01 06:40:48 │ 2023-01-01 06:36:43 │ … │ [A5, A6, C3] │ 3 │ +│ 2023-01-01 06:39:48 │ 2023-01-01 06:46:10 │ 2023-01-01 06:38:48 │ … │ [A6, A5, C3] │ 3 │ +├─────────────────────┴─────────────────────┴─────────────────────┴───┴──────────────────┴────────────────────┤ +│ 9 rows 6 columns (5 shown) │ +└─────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ +""" +``` + +We clearly see the strengths of DuckDB in how succintly we were able to express this operation. We also find how DuckDB is able to seamlessly integrate with an existing Pandas or Polars pipeline with zero-conversion costs. In fact, we can convert this back to a Polars or Pandas dataframe by appending the ending bracket with `db.query(...).pl()` and `db.query(...).pd()` respectively. + +## Can we make the SQL simpler? + +Now that we've understood the logic that goes into the query, let's try to optimize the algorithm. We have the three conditions: + +```sql +-- Case 2 in the diagram +(B.arrival_time <= A.window_open AND + (B.arrival_time + TO_SECONDS(B.duration)) >= A.window_open) OR +-- Case 3 in the diagram +(B.arrival_time >= A.window_open AND + B.departure_time <= A.window_close) OR +-- Case 4 in the diagram +(B.arrival_time >= A.window_open AND + (B.departure_time - TO_SECONDS(B.duration)) <= A.window_close) +``` + +What is common between these three conditions? It takes a while to see it; but it becomes clear that all these cases require the start of the overlap to be *before* the window ends, and the end of the overlap to be *after* the window starts. This can be simplified to just: + +```sql +B.arrival_time <= A.window_close AND +B.departure_time >= A.window_open +``` + +making our query much simpler! + +### Simplified SQL: Part 1 + +We've removed the need for the `duration` calculation algother now. Therefore, we can write: + +```sql +SELECT + A.arrival_time + ,A.departure_time + ,A.window_open + ,A.window_close + ,LIST_DISTINCT(LIST(B.ID)) AS docked_trucks + ,LIST_UNIQUE(LIST(B.ID)) AS docked_truck_count + +FROM ( + SELECT * + ,arrival_time - (INTERVAL 1 MINUTE) AS window_open + ,departure_time + (INTERVAL 1 MINUTE) AS window_close + FROM data) A + +LEFT JOIN data B + +ON ( + B.arrival_time <= A.window_close AND + B.departure_time >= A.window_open +) +GROUP BY 1, 2, 3, 4 +``` + +Can we simplify this even further? + +### Simplification: Part 2 + +I think the SQL query in the above section is very easy to ready already. However, it is a little clunky overall, and there is a way that we can leverage DuckDB's extensive optimizations to simplify our **legibility** by rewriting the query as a cross join: + +```sql +SELECT + A.arrival_time + ,A.departure_time + ,A.arrival_time - (INTERVAL 1 MINUTE) AS window_open + ,A.departure_time + (INTERVAL 1 MINUTE) AS window_close + ,LIST_DISTINCT(LIST(B.ID)) AS docked_trucks + ,LIST_UNIQUE(LIST(B.ID)) AS docked_truck_count +FROM data A, data B +WHERE B.arrival_time <= window_close +AND B.departure_time >= window_open +GROUP BY 1, 2, 3, 4 +``` + +Why does this work? Before optimization on DuckDB, this is what the query plan looks like: + +
DuckDB query plan before optimization + +```py +""" +┌───────────────────────────┐ +│ PROJECTION │ +│ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ │ +│ 0 │ +│ 1 │ +│ 2 │ +│ 3 │ +│ docked_trucks │ +│ docked_truck_count │ +└─────────────┬─────────────┘ +┌─────────────┴─────────────┐ +│ AGGREGATE │ +│ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ │ +│ arrival_time │ +│ departure_time │ +│ window_open │ +│ window_close │ +│ list(ID) │ +└─────────────┬─────────────┘ +┌─────────────┴─────────────┐ +│ FILTER │ +│ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ │ +│ (arrival_time <= │ +│(departure_time + to_m... │ +│ AS BIGINT)))) │ +│ (departure_time >= │ +│(arrival_time - to_min... │ +│ AS BIGINT)))) │ +└─────────────┬─────────────┘ +┌─────────────┴─────────────┐ +│ CROSS_PRODUCT ├──────────────┐ +└─────────────┬─────────────┘ │ +┌─────────────┴─────────────┐┌─────────────┴─────────────┐ +│ ARROW_SCAN ││ ARROW_SCAN │ +└───────────────────────────┘└───────────────────────────┘ +""" +``` + +
+ +After optimization, the `CROSS_PRODUCT` is **automatically** optimized to an **interval join**! + +
DuckDB query after before optimization + +```py +""" +┌───────────────────────────┐ +│ PROJECTION │ +│ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ │ +│ 0 │ +│ 1 │ +│ 2 │ +│ 3 │ +│ docked_trucks │ +│ docked_truck_count │ +└─────────────┬─────────────┘ +┌─────────────┴─────────────┐ +│ AGGREGATE │ +│ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ │ +│ arrival_time │ +│ departure_time │ +│ window_open │ +│ window_close │ +│ list(ID) │ +└─────────────┬─────────────┘ +┌─────────────┴─────────────┐ +│ COMPARISON_JOIN │ +│ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ │ +│ INNER │ +│ ((departure_time + '00:01 │ +│ :00'::INTERVAL) >= ├──────────────┐ +│ arrival_time) │ │ +│((arrival_time - '00:01:00'│ │ +│ ::INTERVAL) <= │ │ +│ departure_time) │ │ +└─────────────┬─────────────┘ │ +┌─────────────┴─────────────┐┌─────────────┴─────────────┐ +│ ARROW_SCAN ││ ARROW_SCAN │ +└───────────────────────────┘└───────────────────────────┘ +""" +``` + +
+ +So in effect, we're actually exploiting a feature of DuckDB to allow us to write our queries in a suboptimal manner for greater readability, and allowing the optmizer to do a good chunk of our work for us. I wouldn't recommend using this generally, because not all SQL engine optmizers will be able to find an efficient route to these calculations for large datasets. + +### How to get query plans? + +I'm glad you asked. Here's the DuckDB [page explaining `EXPLAIN`](https://duckdb.org/docs/guides/meta/explain.html) (heh). Here's the code I used: + +```py +import duckdb as db +db.sql("SET EXPLAIN_OUTPUT='all';") +print(db.query(""" +EXPLAIN +SELECT + A.arrival_time + ,A.departure_time + ,A.arrival_time - (INTERVAL 1 MINUTE) AS window_open + ,A.departure_time + (INTERVAL 1 MINUTE) AS window_close + ,LIST_DISTINCT(LIST(B.ID)) AS docked_trucks + ,LIST_UNIQUE(LIST(B.ID)) AS docked_truck_count +FROM data A, data B +WHERE B.arrival_time <= window_close +AND B.departure_time >= window_open +GROUP BY 1, 2, 3, 4 +""").pl()[1, 1]) +``` + +# What are the alternatives? + +## The `data.table` way + +[`data.table`](https://github.com/Rdatatable/data.table) is a package that has historically been ahead of its time - in both speed and features that it has had. Developement has taken a hit recently, but will likely [pick back up](https://github.com/Rdatatable/data.table/issues/5656). It's my favourite package on all fronts for data manipulation, but suffers simply from the lack of broader R support across the ML and DL space. + +### The `foverlaps` function + +If this kind of overlapping join is common, shouldn't someone have developed a package for it? Turns out, `data.table` has, and with very specific constraints that make it the perfect solution to our problem (if you don't mind switching over to R, that is). + +The `foverlaps` function has these requirements: + +1. The input `data.table` objects have to be keyed for automatic recognition of columns. +2. The default match type is that it matches all three cases from the image above. Side note: it also has matches for `within` overlap, matching `start` and `end` windows, +3. The last two matching columns in the join condition in `by` must specify the `start` and `end` points of the overlapping window. This isn't a problem for us now, but does restrict for future uses where we may want non-equi joins on other cases. + +### The code, _si_, the code! + +Without further ado: + +```r +library(data.table) +library(lubridate) + +######### BOILERPLATE CODE, NO LOGIC HERE #################### +arrival_time = as_datetime(c( + '2023-01-01 06:23:47.000000', '2023-01-01 06:26:42.000000', + '2023-01-01 06:30:20.000000', '2023-01-01 06:32:06.000000', + '2023-01-01 06:33:09.000000', '2023-01-01 06:34:08.000000', + '2023-01-01 06:36:40.000000', '2023-01-01 06:37:43.000000', + '2023-01-01 06:39:48.000000')) +departure_time = as_datetime(c( + '2023-01-01 06:25:08.000000', '2023-01-01 06:28:02.000000', + '2023-01-01 06:35:01.000000', '2023-01-01 06:33:48.000000', + '2023-01-01 06:36:01.000000', '2023-01-01 06:39:49.000000', + '2023-01-01 06:38:34.000000', '2023-01-01 06:40:48.000000', + '2023-01-01 06:46:10.000000')) +ID = c('A1', 'A1', 'A5', 'A6', 'B3', 'C3', 'A6', 'A5', 'A6') + +DT = data.table( + arrival_time = arrival_time, + departure_time = departure_time, + ID = ID) +######### BOILERPLATE CODE, NO LOGIC HERE #################### + +# A copy(DT) creates a copy of a data.table that isn't linked +# to the original one, so that changes in it don't reflect in +# the original DT object. +# The `:=` allow assignment by reference (i.e. "in place"). +DT_with_windows = copy(DT)[, `:=`( + window_start = arrival_time - minutes(1), + window_end = departure_time + minutes(1))] + +# This step is necessary for the second table, but not the first, but we +# key both data.tables to make the foverlap code very succinct. +setkeyv(DT, c("arrival_time", "departure_time")) +setkeyv(DT_with_windows, c("window_start", "window_end")) + +# The foverlap function returns a data.table, so we can simply apply +# the usual data.table syntax on it! +# Since we have the same name of some columns in both data.tables, +# the latter table's columns are prefixed with "i." to avoid conflicts. +foverlaps(DT, DT_with_windows)[ + , .(docked_trucks = list(unique(i.ID)), + docked_truck_count = uniqueN(i.ID)) + , .(arrival_time, departure_time)] +``` + +provides us the output: + +```r + arrival_time departure_time docked_trucks docked_truck_count + +1: 2023-01-01 06:23:47 2023-01-01 06:25:08 A1 1 +2: 2023-01-01 06:26:42 2023-01-01 06:28:02 A1 1 +3: 2023-01-01 06:30:20 2023-01-01 06:35:01 A5,A6,B3,C3 4 +4: 2023-01-01 06:32:06 2023-01-01 06:33:48 A5,A6,B3,C3 4 +5: 2023-01-01 06:33:09 2023-01-01 06:36:01 A5,A6,B3,C3 4 +6: 2023-01-01 06:34:08 2023-01-01 06:39:49 A5,A6,B3,C3 4 +7: 2023-01-01 06:36:40 2023-01-01 06:38:34 B3,C3,A6,A5 4 +8: 2023-01-01 06:37:43 2023-01-01 06:40:48 C3,A6,A5 3 +9: 2023-01-01 06:39:48 2023-01-01 06:46:10 C3,A5,A6 3 +``` + +### Considerations for using `data.table` + +The package offers a wonderful, nearly one-stop solution that doesn't require you to write the logic out for the query or command yourself, but has a major problem for a lot of users - it requires you to switch your codebase to R, and a lot of your tasks may be on Python or in an SQL pipeline. So, what do you do? + +Consider the effort in maintaining an additional dependency for your analytics pipeline (i.e. R), and the effort that you'll need to invest to run R from Python, or run an R script in your pipeline and pull the output from it back into the pipeline, and make your call. + diff --git a/assets/001_overlap_joins/overlap_algorithm.png b/content/blog/001_overlap_joins/overlap_algorithm.png similarity index 100% rename from assets/001_overlap_joins/overlap_algorithm.png rename to content/blog/001_overlap_joins/overlap_algorithm.png diff --git a/assets/003_representative_samples/001_Network_Cluster_1.png b/content/blog/002_representative_samples/001_Network_Cluster_1.png similarity index 100% rename from assets/003_representative_samples/001_Network_Cluster_1.png rename to content/blog/002_representative_samples/001_Network_Cluster_1.png diff --git a/assets/003_representative_samples/002_Network_Cluster_2.png b/content/blog/002_representative_samples/002_Network_Cluster_2.png similarity index 100% rename from assets/003_representative_samples/002_Network_Cluster_2.png rename to content/blog/002_representative_samples/002_Network_Cluster_2.png diff --git a/_posts/2023-10-19-Finding_Rep_Samples.md b/content/blog/002_representative_samples/index.md similarity index 98% rename from _posts/2023-10-19-Finding_Rep_Samples.md rename to content/blog/002_representative_samples/index.md index c606f2e..36a93ef 100644 --- a/_posts/2023-10-19-Finding_Rep_Samples.md +++ b/content/blog/002_representative_samples/index.md @@ -1,7 +1,7 @@ --- title: Finding representative samples efficiently for large datasets -permalink: /RepresentativeSample author: Avinash Mallya +date: 2023-10-19 tags: [representative, samples, faiss, approximate, nearest, neighbor, network, graph, networkx, polars, category] --- @@ -234,11 +234,11 @@ The next step in the process is to create a network graph using the edge-list. B Remember that we have identified the (k=5) nearest neighbors of **each** data point. Let's say that we have a point A that has a nearest neighbor B. C is **not** a nearest neighbor of A, but it is a nearest neighbor of B. In a network graph, if A and C are sufficiently similar enough to B within a particular *minimum thershold*, then A will be connected to C through B! Hopefully a small visual below would help. -![How a network component is formed.](./assets/003_representative_samples/001_Network_Cluster_1.png) +![How a network component is formed.](001_Network_Cluster_1.png) What happens when such a concept is extended for many data points? Not all of them would be connected - because we're applying a *minimum* threshold that they have to meet. This is the only hueristic part of the rather fast process. Here's one more helpful visual: -![How a network cluster is formed.](./assets/003_representative_samples/002_Network_Cluster_2.png) +![How a network cluster is formed.](002_Network_Cluster_2.png) Very starry night-eque vibes here. Let's get to the code. @@ -407,4 +407,4 @@ If you want to write down an algorithmic way of looking at this approach, 2. Create an ANN database (based on a package such as `faiss`) that allows you fast nearest neighbor searches. Use cosine similarity for an easy threshold determination step. 3. Obtain an edge-list of k (from 5 to 100) nearest neighbors for **all** (or a sample of data points in case your dataset is incredibly HUGE) data points in the ANN database. 4. Apply a minimum threshold on similarity (completely based on heuristics), and obtain the connected components of the network graph from the filtered edge-list you just created. -5. Map all indices back to their source data-points that make sense, and pick any number of items from each cluster (usually, I end up picking one element from each cluster), and you now have your representative sample! \ No newline at end of file +5. Map all indices back to their source data-points that make sense, and pick any number of items from each cluster (usually, I end up picking one element from each cluster), and you now have your representative sample! diff --git a/assets/002_power_point_snap/01_Shapes.png b/content/blog/003_powerpointsnap/01_Shapes.png similarity index 100% rename from assets/002_power_point_snap/01_Shapes.png rename to content/blog/003_powerpointsnap/01_Shapes.png diff --git a/assets/002_power_point_snap/02_Charts.png b/content/blog/003_powerpointsnap/02_Charts.png similarity index 100% rename from assets/002_power_point_snap/02_Charts.png rename to content/blog/003_powerpointsnap/02_Charts.png diff --git a/assets/002_power_point_snap/03_Tables.png b/content/blog/003_powerpointsnap/03_Tables.png similarity index 100% rename from assets/002_power_point_snap/03_Tables.png rename to content/blog/003_powerpointsnap/03_Tables.png diff --git a/assets/002_power_point_snap/DataLabelsScreenshot.JPG b/content/blog/003_powerpointsnap/DataLabelsScreenshot.JPG similarity index 100% rename from assets/002_power_point_snap/DataLabelsScreenshot.JPG rename to content/blog/003_powerpointsnap/DataLabelsScreenshot.JPG diff --git a/assets/002_power_point_snap/Revenue_Presentation_1.png b/content/blog/003_powerpointsnap/Revenue_Presentation_1.png similarity index 100% rename from assets/002_power_point_snap/Revenue_Presentation_1.png rename to content/blog/003_powerpointsnap/Revenue_Presentation_1.png diff --git a/assets/002_power_point_snap/Revenue_Presentation_2.png b/content/blog/003_powerpointsnap/Revenue_Presentation_2.png similarity index 100% rename from assets/002_power_point_snap/Revenue_Presentation_2.png rename to content/blog/003_powerpointsnap/Revenue_Presentation_2.png diff --git a/assets/002_power_point_snap/SnapScreenshot.JPG b/content/blog/003_powerpointsnap/SnapScreenshot.JPG similarity index 100% rename from assets/002_power_point_snap/SnapScreenshot.JPG rename to content/blog/003_powerpointsnap/SnapScreenshot.JPG diff --git a/assets/002_power_point_snap/Table_Presentation_1.png b/content/blog/003_powerpointsnap/Table_Presentation_1.png similarity index 100% rename from assets/002_power_point_snap/Table_Presentation_1.png rename to content/blog/003_powerpointsnap/Table_Presentation_1.png diff --git a/assets/002_power_point_snap/Table_Presentation_2.png b/content/blog/003_powerpointsnap/Table_Presentation_2.png similarity index 100% rename from assets/002_power_point_snap/Table_Presentation_2.png rename to content/blog/003_powerpointsnap/Table_Presentation_2.png diff --git a/_posts/2023-10-20-PowerPointSnap.md b/content/blog/003_powerpointsnap/index.md similarity index 89% rename from _posts/2023-10-20-PowerPointSnap.md rename to content/blog/003_powerpointsnap/index.md index dff11bc..d4ac5a1 100644 --- a/_posts/2023-10-20-PowerPointSnap.md +++ b/content/blog/003_powerpointsnap/index.md @@ -1,7 +1,7 @@ --- title: Quick hacks to make client-ready presentations -permalink: /PowerPointSnap author: Avinash Mallya +date: 2023-10-20 tags: [powerpoint, ppt, vba] --- @@ -40,7 +40,7 @@ Here's a non-exhaustive list of all the options available. This is the part of the interface that can be used for shapes (which include charts and tables). -![The UI for copying *shape* properties](./assets/002_power_point_snap/01_Shapes.png) +![The UI for copying *shape* properties](01_Shapes.png) To use, first select a *shape* object, click on "Set". Then, choose the object you want to *Snap* its properties to (see how I got the inspiration for the name?). You should be able to copy all compatible properties - if something is not copy-able, the tool will show an error, and then let you exit. @@ -50,7 +50,7 @@ Note that it's probably not to apply a property of a shape to a table - if you w Charts are also supported, with dedicated features for it. -![The UI for copying *chart* properties](./assets/002_power_point_snap/02_Charts.png) +![The UI for copying *chart* properties](02_Charts.png) What do these features do? You should be able to hover over the option and get a tooltip that shows what it's capable of, but here's another summary just in case: @@ -67,7 +67,7 @@ Your immediate senior in a consulting environment would frown at your chart, and It's **never** a one time affair. But don't worry, we have this nice feature to help us. If you click on the *Customize Label* option, you will get this (without the "Set" option): -![The UI for customizing labels.](./assets/002_power_point_snap/DataLabelsScreenshot.JPG) +![The UI for customizing labels.](DataLabelsScreenshot.JPG) Never mind the rather unfriendly legend entries. They're just here to demonstrate that you can do the following kinds of whacky abilities with your own chart! @@ -75,7 +75,7 @@ Never mind the rather unfriendly legend entries. They're just here to demonstrat Of course, visuals will do it more justice. For example, look at this image: -![There's a lot wrong with this image. But primarily, the charts are of different sizes, the axes are different, the labels are too clustered, and the titles aren't centered.](./assets/002_power_point_snap/Revenue_Presentation_1.png) +![There's a lot wrong with this image. But primarily, the charts are of different sizes, the axes are different, the labels are too clustered, and the titles aren't centered.](Revenue_Presentation_1.png) Here's what you can do: @@ -95,7 +95,7 @@ Here's what you can do: This is what your results should look like: -![Everything almost consistent. Your senior rests their eyes, and secretly wonder how you managed to do it quickly... maybe they should change some requirements...](./assets/002_power_point_snap/Revenue_Presentation_2.png) +![Everything almost consistent. Your senior rests their eyes, and secretly wonder how you managed to do it quickly... maybe they should change some requirements...](Revenue_Presentation_2.png) Of course, getting those calculations right is a whole different thing that will need some work. @@ -103,11 +103,11 @@ Of course, getting those calculations right is a whole different thing that will Oftentimes, you have two tables that show similar values... you know the drill. Here's what you can do in a scenario such as this: -![Similar data, but vastly different tables.](./assets/002_power_point_snap/Table_Presentation_1.png) +![Similar data, but vastly different tables.](Table_Presentation_1.png) This is what the *Tables* section of the tool looks like: -![The UI for *Tables*](./assets/002_power_point_snap/03_Tables.png) +![The UI for *Tables*](03_Tables.png) To align these tables together, @@ -119,7 +119,7 @@ To align these tables together, Here's what you'll end up with: -![Similar data, and similar enough tables.](./assets/002_power_point_snap/Table_Presentation_2.png) +![Similar data, and similar enough tables.](Table_Presentation_2.png) Pretty neat, eh? diff --git a/content/blog/_index.md b/content/blog/_index.md new file mode 100644 index 0000000..af4757a --- /dev/null +++ b/content/blog/_index.md @@ -0,0 +1,5 @@ +--- +title: "blog" +menu: "main" +weight: 2 +--- diff --git a/content/projects.md b/content/projects.md new file mode 100644 index 0000000..729331a --- /dev/null +++ b/content/projects.md @@ -0,0 +1,18 @@ +--- +title: "projects" +menu: "main" +weight: 3 +--- + +Most of my work is on private repositories, but I do find some time to learn new topics, contribute back to some of the open source packages I frequently use, or to create interesting tools. + +# Featured projects + +1. [BorrowChecker](https://avimallu.github.io/BorrowChecker/): A play on the same concept in Rust, this is a simple web-app that allows you to split complex receipts with multiple people in a simple manner. Runs entirely in-browser. Made with Dioxus and Rust. [Repository link](https://github.com/avimallu/BorrowChecker). +2. [PowerPointSnap](https://github.com/avimallu/PowerPointSnap): A mostly feature complete tool for PowerPoint on VBA that is filled with a lot of tricks to make it easy to consistently format presentations to impress clients - from my consulting days. Written in VBA. See accompanying [blog post]({{< ref "blog/003_powerpointsnap">}}). + +# Other work or contributions + +1. [IntelligentReceiptSplitter](https://github.com/avimallu/IntelligentReceiptSplitter): A relatively simple predecessor to [BorrowChecker](https://avimallu.github.io/BorrowChecker/) that focussed on using an OCR framework followed by an LLM based parser to read receipts that could be further split manually. This combination significantly reduced hallucinations from LLMs but was still very computationally intensive to run. +2. [r.data.table.funs](https://github.com/avimallu/r.data.table.funs): A very small set of R functions that use `data.table`, that I found very useful earlier in my career to quicky churn out analyses. It is not ground-breaking, but rather something that anybody with sufficient basic skills in R and understand, and save an immense amount of time. +3. I [wrote](https://github.com/pola-rs/polars-book/pull/364) [several](https://github.com/pola-rs/polars-book/pull/358) [chapters](https://github.com/pola-rs/polars-book/pull/365/files) of the Polars Book, which have since been moved to the main Polars repository. Polars was a breadth of fresh air in terms of speed and ergonomics, which I had been sorely missing after switching to Python from R (where projects like `data.table` and `dplyr` dominated), so I was eager to make it better for everybody making the switch. diff --git a/favicon.ico b/favicon.ico deleted file mode 100644 index 1de88d55b6fcbe624464a94235abafd2a1550271..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1415 zcmV;21$g?2P)dGov^0T=GO4K&L7bwk#8*iCGqZS{@!qbz_HleH!QI(w?|UGJJo3pMcBn9mlEC zwJY>F=>Hh{_znGMudlCvWV2cP?K>Rx#K6G77dSWmT%b)xamjpJTwI*yZ9D>K_2S~< z3;_RFXv^mFd?51c=H{l4yx|c5%l~}o;E6br08f0v-;w};p91hGomX=JiD@7)<+#$> z;hNvv+>}J1k^F;y0{(l4Jm((wckrD>62GRi2K3_(Lie|W4`G+69e&dH_V#v;;TWXU z=z#SxV88OGuCA_n;0aL9Cj%Y^+T>PFh69$;V8H2nS67$sQPA&%GdMW-3(kJvS5{V5 z1X`Bt?s>xX3e#eaC(h5$MOj&yC@Ly4%F*Zr@&^0l#Jan?)n~4u2aeQ~xxBpmARR6v z2HqzjCMRrvdwc7%p0wtJNplII`ilOa*U5%^qNk@vea0?&fXiDpSXx>N1+U6Rm6&Q} zwP&AvnEr!EXb1=+0iA4AkmMl_j@pC~pnIakL2qwwju*8Aph$#zK+Q~QTwn~?2Dg!f zD>0H$Bm%Y`;3jEpZ53NvTk_QK@UWPhn==M-pri~z3@P8v1DQ-F+yfeDXJ==kqM|}x z+1uL_4Gj&}1Rmnt9ME_z5`iEOm{8F@YEF;BLRSxnTwh{0AB_Nk=P_YTAeBmaS%{<&reU%^b(pUQ zbTW!Xz_u7+yNinpQC?o|kv}>*64lk!Vcd<^)r{2N-)|QK=z%EmAunMe+uq*x)sUc3 zX&5sa1QL;g6W~FsN-7Mj={g^cJ}CjJ%K2m>FAm%>QNaknnvH-J4PV-XbtQ3ibrqUQ z!-8EJpwI+NaxsAm1I^|1Bm@u;dZDzm)F)*;uMVpZ4h}?3O^vT!jE;`V%55xYh4z3B zC}pOmrY5nov*Tf-?54^th``v`n7lty3^c!M7JvT!u}&VkU`4R|`}?A981pFDU-x1PX|{O#-CW+h6x&AzaT`Ha`s78VvhN~sYDS4y}w{{ .Name }} +{{ end }} +rss + + +{{ $translations := dict }} +{{ range .Translations }} + {{ $translations = merge $translations (dict .Language.Lang .) }} +{{ end }} + + +{{ range where .Site.Languages "Lang" "!=" .Page.Lang }} + {{ with (index $translations .Lang) }} + {{ .Language.LanguageName }} + {{ else }} + + {{ if not .Params.hideUntranslated }} + {{ .LanguageName }} + {{ end }} + {{ end }} +{{ end }} diff --git a/public/404.html b/public/404.html new file mode 100644 index 0000000..c67b78d --- /dev/null +++ b/public/404.html @@ -0,0 +1,5 @@ +404
+

Avinash's Blog

404

ʕノ•ᴥ•ʔノ ︵ ┻━┻

© Avinash Mallya | Design via Bear Cub.
\ No newline at end of file diff --git a/public/blog/001_overlap_joins/001_overlap_joins/index.html b/public/blog/001_overlap_joins/001_overlap_joins/index.html new file mode 100644 index 0000000..20ba1cb --- /dev/null +++ b/public/blog/001_overlap_joins/001_overlap_joins/index.html @@ -0,0 +1,569 @@ + + + + + + + +Overlap Joins: Number of docker trucks in an interval | Avinash's Blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +

Avinash's Blog

+ +
+
+ +

Overlap Joins: Number of docker trucks in an interval

+ + + +

Premise

+

I stumbled upon an interesting Stackoverflow question that was linked via an issue on Polars github repo. The OP asked for a pure Polars solution. At the time of answering the question Polars did not have support for non-equi joins, and any solution using it would be pretty cumbersome.

+

I’m more of a right-tool-for-the-job person, so I tried to find a better solution.

+

Problem Statement

+

Suppose we have a dataset that captures the arrival and departure times of trucks at a station, along with the truck’s ID.

+ + + + + +
 1import polars as pl # if you don't have polars, run 
+ 2                    # pip install 'polars[all]'
+ 3data = pl.from_repr("""
+ 4┌─────────────────────┬─────────────────────┬─────┐
+ 5│ arrival_time        ┆ departure_time      ┆ ID  │
+ 6│ ---                 ┆ ---                 ┆ --- │
+ 7│ datetime[μs]        ┆ datetime[μs]        ┆ str │
+ 8╞═════════════════════╪═════════════════════╪═════╡
+ 9│ 2023-01-01 06:23:47 ┆ 2023-01-01 06:25:08 ┆ A1  │
+10│ 2023-01-01 06:26:42 ┆ 2023-01-01 06:28:02 ┆ A1  │
+11│ 2023-01-01 06:30:20 ┆ 2023-01-01 06:35:01 ┆ A5  │
+12│ 2023-01-01 06:32:06 ┆ 2023-01-01 06:33:48 ┆ A6  │
+13│ 2023-01-01 06:33:09 ┆ 2023-01-01 06:36:01 ┆ B3  │
+14│ 2023-01-01 06:34:08 ┆ 2023-01-01 06:39:49 ┆ C3  │
+15│ 2023-01-01 06:36:40 ┆ 2023-01-01 06:38:34 ┆ A6  │
+16│ 2023-01-01 06:37:43 ┆ 2023-01-01 06:40:48 ┆ A5  │
+17│ 2023-01-01 06:39:48 ┆ 2023-01-01 06:46:10 ┆ A6  │
+18└─────────────────────┴─────────────────────┴─────┘
+19""")

We want to identify the number of trucks docked at any given time within a threshold of 1 minute prior to the arrival time of a truck, and 1 minute after the departure of a truck. Equivalently, this means that we need to calculate the number of trucks within a specific window for each row of the data.

+

Finding a solution to the problem

+

Evaluate for a specific row

+

Before we find a general solution to this problem, let’s consider a specific row to understand the problem better:

+ + + + + +
1"""
+2┌─────────────────────┬─────────────────────┬─────┐
+3│ arrival_time        ┆ departure_time      ┆ ID  │
+4│ ---                 ┆ ---                 ┆ --- │
+5│ datetime[μs]        ┆ datetime[μs]        ┆ str │
+6╞═════════════════════╪═════════════════════╪═════╡
+7│ 2023-01-01 06:32:06 ┆ 2023-01-01 06:33:48 ┆ A6  │
+8└─────────────────────┴─────────────────────┴─────┘
+9"""

For this row, we need to find the number of trucks that are there between 2023-01-01 06:31:06 (1 minute prior to the arrival_time and 2023-01-01 06:34:48 (1 minute post the departure_time). Manually going through the original dataset, we see that B3, C3, A6 and A5 are the truck IDs that qualify - they all are at the station in a duration that is between 2023-01-01 06:31:06 and 2023-01-01 06:34:48.

+

Visually deriving an algorithm

+

There are many cases that will qualify a truck to be present in the overlap window defined by a particular row. Specifically for the example above, we have (this visualization is generalizable, because for each row we can calculate without much difficulty the overlap window relative to the arrival and departure times):

+

The five different ways a period can overlap.

+

Take some time to absorb these cases - it’s important for the part where we write the code for the solution. Note that we need to actually tell our algorithm to filter only for Cases 2, 3 and 4, since Cases 1 and 5 will not satisfy our requirements.

+

Writing an SQL query based on the algorithm

+

In theory, we can use any language that has the capability to define rules that meet our algorithmic requirements outlined in the above section to find the solution. Why choose SQL? It’s often able to convey elegantly the logic that was used to execute the algorithm; and while it does come with excessive verbosity at times, it doesn’t quite in this case.

+

Note here that we run SQL in Python with almost no setup or boilerplate code - so this is a Python based solution as well (although not quite Pythonic!).

+

Introducing the DuckDB package

+

Once again, in theory, any SQL package or language can be used. Far too few however meet the ease-of-use that DuckDB provides:

+
    +
  1. no expensive set-up time (meaning no need for setting up databases, even temporary ones),
  2. +
  3. no dependencies (other than DuckDB itself, just pip install duckdb),
  4. +
  5. some very friendly SQL extensions, and
  6. +
  7. ability to work directly on Polars and Pandas DataFrames without conversions
  8. +
+

all with mind-blowing speed that stands shoulder-to-shoulder with Polars. We’ll also use a few advanced SQL concepts noted below.

+

Self-joins

+

This should be a familiar, albeit not often used concept - a join of a table with itself is a self join. There are few cases where such an operation would make sense, and this happens to be one of them.

+

A bullet train recap of non-equi joins

+

A key concept that we’ll use is the idea of joining on a range of values rather than a specific value. That is, instead of the usual LEFT JOIN ON A.column = B.column, we can do LEFT JOIN ON A.column <= B.column for one row in table A to match to multiple rows in B. DuckDB has a blog post that outlines this join in detail, including fast implementation.

+

The concept of LIST columns

+

DuckDB has first class support for LIST columns - that is, each row in a LIST column can have a varying length (much like a Python list), but must have the exact same datatype (like R’s vector). Using list columns allow us to eschew the use of an additional GROUP BY operation on top of a WHERE filter or SELECT DISTINCT operation, since we can directly perform those on the LIST column itself.

+

Date algebra

+

Dates can be rather difficult to handle well in most tools and languages, with several packages purpose built to make handling them easier - lubridate from the tidyverse is a stellar example. Thankfully, DuckDB provides a similar swiss-knife set of tools to deal with it, including specifying INTERVALs (a special data type that represent a period of time independent of specific time values) to modify TIMESTAMP values using addition or subtraction.

+

Tell me the query, PLEASE!

+

Okay - had a lot of background. Let’s have at it! The query by itself in SQL is (see immediately below for runnable code in Python):

+ + + + + +
 1SELECT
+ 2     A.arrival_time
+ 3    ,A.departure_time
+ 4    ,A.window_open
+ 5    ,A.window_close
+ 6    ,LIST_DISTINCT(LIST(B.ID)) AS docked_trucks
+ 7    ,LIST_UNIQUE(LIST(B.ID))   AS docked_truck_count
+ 8
+ 9FROM (
+10    SELECT *
+11        ,arrival_time   - (INTERVAL 1 MINUTE) AS window_open
+12        ,departure_time + (INTERVAL 1 MINUTE) AS window_close
+13    FROM data) A
+14
+15LEFT JOIN (
+16    SELECT *
+17        ,DATEDIFF('seconds', arrival_time, departure_time) AS duration
+18    FROM data) B
+19
+20ON ((B.arrival_time <= A.window_open AND 
+21    	(B.arrival_time   + TO_SECONDS(B.duration)) >=  A.window_open) OR
+22    (B.arrival_time >= A.window_open AND 
+23                                  B.departure_time  <= A.window_close) OR
+24    (B.arrival_time >= A.window_open AND
+25    	(B.departure_time - TO_SECONDS(B.duration)) <= A.window_close))
+26GROUP BY 1, 2, 3, 4

A small, succinct query such as this will need a bit of explanation to take it all in. Here’s one below, reproducible in Python (make sure to install duckdb first!). Expand it to view.

+
SQL with explanation. + + + + + +
 1import duckdb as db
+ 2db.query("""
+ 3    SELECT
+ 4        A.arrival_time
+ 5        ,A.departure_time
+ 6        ,A.window_open
+ 7        ,A.window_close
+ 8        -- LIST aggregates the values into a LIST column
+ 9        -- and LIST_DISTINCT finds the unique values in it
+10        ,LIST_DISTINCT(LIST(B.ID)) AS docked_trucks
+11        -- finally, LIST_UNIQUE calculates the unique number of values in it
+12        ,LIST_UNIQUE(LIST(B.ID))   AS docked_truck_count
+13
+14    FROM (
+15        SELECT
+16            *
+17            ,arrival_time   - (INTERVAL 1 MINUTE) AS window_open
+18            ,departure_time + (INTERVAL 1 MINUTE) AS window_close
+19        FROM data -- remember we defined data as the Polars DataFrame with our truck station data
+20    ) A
+21
+22    LEFT JOIN (
+23        SELECT
+24            *
+25            -- This is the time, in seconds between the arrival and departure of
+26            -- each truck PER ROW in the original data-frame 
+27            ,DATEDIFF('seconds', arrival_time, departure_time) AS duration
+28        FROM data -- this is where we perform a self-join
+29    ) B
+30
+31    ON (
+32        -- Case 2 in the diagram;
+33        (B.arrival_time <= A.window_open AND 
+34            -- Adding the duration here makes sure that the second interval
+35            -- is at least ENDING AFTER the start of the overlap window
+36            (B.arrival_time   + TO_SECONDS(B.duration)) >=  A.window_open) OR
+37
+38        -- Case 3 in the diagram - the simplest of all five cases
+39        (B.arrival_time >= A.window_open AND 
+40                                      B.departure_time  <= A.window_close) OR
+41
+42        -- Case 4 in the digram;
+43        (B.arrival_time >= A.window_open AND
+44            -- Subtracting the duration here makes sure that the second interval
+45            -- STARTS BEFORE the end of the overlap window.
+46            (B.departure_time - TO_SECONDS(B.duration)) <= A.window_close)
+47    )
+48    GROUP BY 1, 2, 3, 4
+49""")
+

The output of this query is:

+ + + + + +
"""
+┌─────────────────────┬─────────────────────┬─────────────────────┬───┬──────────────────┬────────────────────┐
+│    arrival_time     │   departure_time    │     window_open     │ … │  docked_trucks   │ docked_truck_count │
+│      timestamp      │      timestamp      │      timestamp      │   │    varchar[]     │       uint64       │
+├─────────────────────┼─────────────────────┼─────────────────────┼───┼──────────────────┼────────────────────┤
+│ 2023-01-01 06:23:47 │ 2023-01-01 06:25:08 │ 2023-01-01 06:22:47 │ … │ [A1]             │                  1 │
+│ 2023-01-01 06:26:42 │ 2023-01-01 06:28:02 │ 2023-01-01 06:25:42 │ … │ [A1]             │                  1 │
+│ 2023-01-01 06:30:20 │ 2023-01-01 06:35:01 │ 2023-01-01 06:29:20 │ … │ [B3, C3, A6, A5] │                  4 │
+│ 2023-01-01 06:32:06 │ 2023-01-01 06:33:48 │ 2023-01-01 06:31:06 │ … │ [B3, C3, A6, A5] │                  4 │
+│ 2023-01-01 06:33:09 │ 2023-01-01 06:36:01 │ 2023-01-01 06:32:09 │ … │ [B3, C3, A6, A5] │                  4 │
+│ 2023-01-01 06:34:08 │ 2023-01-01 06:39:49 │ 2023-01-01 06:33:08 │ … │ [B3, C3, A6, A5] │                  4 │
+│ 2023-01-01 06:36:40 │ 2023-01-01 06:38:34 │ 2023-01-01 06:35:40 │ … │ [A5, A6, C3, B3] │                  4 │
+│ 2023-01-01 06:37:43 │ 2023-01-01 06:40:48 │ 2023-01-01 06:36:43 │ … │ [A5, A6, C3]     │                  3 │
+│ 2023-01-01 06:39:48 │ 2023-01-01 06:46:10 │ 2023-01-01 06:38:48 │ … │ [A6, A5, C3]     │                  3 │
+├─────────────────────┴─────────────────────┴─────────────────────┴───┴──────────────────┴────────────────────┤
+│ 9 rows                                                                                  6 columns (5 shown) │
+└─────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
+"""

We clearly see the strengths of DuckDB in how succintly we were able to express this operation. We also find how DuckDB is able to seamlessly integrate with an existing Pandas or Polars pipeline with zero-conversion costs. In fact, we can convert this back to a Polars or Pandas dataframe by appending the ending bracket with db.query(...).pl() and db.query(...).pd() respectively.

+

Can we make the SQL simpler?

+

Now that we’ve understood the logic that goes into the query, let’s try to optimize the algorithm. We have the three conditions:

+ + + + + +
1-- Case 2 in the diagram
+2(B.arrival_time <= A.window_open AND 
+3    (B.arrival_time   + TO_SECONDS(B.duration)) >=  A.window_open) OR
+4-- Case 3 in the diagram
+5(B.arrival_time >= A.window_open AND 
+6                              B.departure_time  <= A.window_close) OR
+7-- Case 4 in the diagram
+8(B.arrival_time >= A.window_open AND
+9    (B.departure_time - TO_SECONDS(B.duration)) <= A.window_close)

What is common between these three conditions? It takes a while to see it; but it becomes clear that all these cases require the start of the overlap to be before the window ends, and the end of the overlap to be after the window starts. This can be simplified to just:

+ + + + + +
1B.arrival_time   <= A.window_close AND
+2B.departure_time >= A.window_open

making our query much simpler!

+

Simplified SQL: Part 1

+

We’ve removed the need for the duration calculation algother now. Therefore, we can write:

+ + + + + +
 1SELECT
+ 2     A.arrival_time
+ 3    ,A.departure_time
+ 4    ,A.window_open
+ 5    ,A.window_close
+ 6    ,LIST_DISTINCT(LIST(B.ID)) AS docked_trucks
+ 7    ,LIST_UNIQUE(LIST(B.ID))   AS docked_truck_count
+ 8
+ 9FROM (
+10    SELECT *
+11        ,arrival_time   - (INTERVAL 1 MINUTE) AS window_open
+12        ,departure_time + (INTERVAL 1 MINUTE) AS window_close
+13    FROM data) A
+14
+15LEFT JOIN data B
+16
+17ON (
+18    B.arrival_time   <= A.window_close AND
+19    B.departure_time >= A.window_open
+20)
+21GROUP BY 1, 2, 3, 4

Can we simplify this even further?

+

Simplification: Part 2

+

I think the SQL query in the above section is very easy to ready already. However, it is a little clunky overall, and there is a way that we can leverage DuckDB’s extensive optimizations to simplify our legibility by rewriting the query as a cross join:

+ + + + + +
 1SELECT
+ 2    A.arrival_time
+ 3    ,A.departure_time
+ 4    ,A.arrival_time - (INTERVAL 1 MINUTE)   AS window_open
+ 5    ,A.departure_time + (INTERVAL 1 MINUTE) AS window_close
+ 6    ,LIST_DISTINCT(LIST(B.ID)) AS docked_trucks
+ 7    ,LIST_UNIQUE(LIST(B.ID))   AS docked_truck_count
+ 8FROM  data A, data B
+ 9WHERE B.arrival_time   <= window_close
+10AND   B.departure_time >= window_open
+11GROUP BY 1, 2, 3, 4

Why does this work? Before optimization on DuckDB, this is what the query plan looks like:

+
DuckDB query plan before optimization + + + + + +
 1"""
+ 2┌───────────────────────────┐                             
+ 3│         PROJECTION        │                             
+ 4│   ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─   │                             
+ 5│             0             │                             
+ 6│             1             │                             
+ 7│             2             │                             
+ 8│             3             │                             
+ 9│       docked_trucks       │                             
+10│     docked_truck_count    │                             
+11└─────────────┬─────────────┘                                                          
+12┌─────────────┴─────────────┐                             
+13│         AGGREGATE         │                             
+14│   ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─   │                             
+15│        arrival_time       │                             
+16│       departure_time      │                             
+17│        window_open        │                             
+18│        window_close       │                             
+19│          list(ID)         │                             
+20└─────────────┬─────────────┘                                                          
+21┌─────────────┴─────────────┐                             
+22│           FILTER          │                             
+23│   ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─   │                             
+24│     (arrival_time <=      │                             
+25│(departure_time + to_m...  │                             
+26│        AS BIGINT))))      │                             
+27│    (departure_time >=     │                             
+28│(arrival_time - to_min...  │                             
+29│        AS BIGINT))))      │                             
+30└─────────────┬─────────────┘                                                          
+31┌─────────────┴─────────────┐                             
+32│       CROSS_PRODUCT       ├──────────────┐              
+33└─────────────┬─────────────┘              │                                           
+34┌─────────────┴─────────────┐┌─────────────┴─────────────┐
+35│         ARROW_SCAN        ││         ARROW_SCAN        │
+36└───────────────────────────┘└───────────────────────────┘ 
+37"""                            
+

After optimization, the CROSS_PRODUCT is automatically optimized to an interval join!

+
DuckDB query after before optimization + + + + + +
 1"""
+ 2┌───────────────────────────┐                             
+ 3│         PROJECTION        │                             
+ 4│   ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─   │                             
+ 5│             0             │                             
+ 6│             1             │                             
+ 7│             2             │                             
+ 8│             3             │                             
+ 9│       docked_trucks       │                             
+10│     docked_truck_count    │                             
+11└─────────────┬─────────────┘                                                          
+12┌─────────────┴─────────────┐                             
+13│         AGGREGATE         │                             
+14│   ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─   │                             
+15│        arrival_time       │                             
+16│       departure_time      │                             
+17│        window_open        │                             
+18│        window_close       │                             
+19│          list(ID)         │                             
+20└─────────────┬─────────────┘                                                          
+21┌─────────────┴─────────────┐                             
+22│      COMPARISON_JOIN      │                             
+23│   ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─   │                             
+24│           INNER           │                             
+25│ ((departure_time + '00:01 │                             
+26│     :00'::INTERVAL) >=    ├──────────────┐              
+27│        arrival_time)      │              │              
+28│((arrival_time - '00:01:00'│              │              
+29│       ::INTERVAL) <=      │              │              
+30│       departure_time)     │              │              
+31└─────────────┬─────────────┘              │                                           
+32┌─────────────┴─────────────┐┌─────────────┴─────────────┐
+33│         ARROW_SCAN        ││         ARROW_SCAN        │
+34└───────────────────────────┘└───────────────────────────┘
+35"""                      
+

So in effect, we’re actually exploiting a feature of DuckDB to allow us to write our queries in a suboptimal manner for greater readability, and allowing the optmizer to do a good chunk of our work for us. I wouldn’t recommend using this generally, because not all SQL engine optmizers will be able to find an efficient route to these calculations for large datasets.

+

How to get query plans?

+

I’m glad you asked. Here’s the DuckDB page explaining EXPLAIN (heh). Here’s the code I used:

+ + + + + +
 1import duckdb as db
+ 2db.sql("SET EXPLAIN_OUTPUT='all';")
+ 3print(db.query("""
+ 4EXPLAIN
+ 5SELECT
+ 6    A.arrival_time
+ 7    ,A.departure_time
+ 8    ,A.arrival_time - (INTERVAL 1 MINUTE) AS window_open
+ 9    ,A.departure_time + (INTERVAL 1 MINUTE) AS window_close
+10    ,LIST_DISTINCT(LIST(B.ID)) AS docked_trucks
+11    ,LIST_UNIQUE(LIST(B.ID))   AS docked_truck_count
+12FROM  data A, data B
+13WHERE B.arrival_time   <= window_close
+14AND   B.departure_time >= window_open
+15GROUP BY 1, 2, 3, 4
+16""").pl()[1, 1])

What are the alternatives?

+

The data.table way

+

data.table is a package that has historically been ahead of its time - in both speed and features that it has had. Developement has taken a hit recently, but will likely pick back up. It’s my favourite package on all fronts for data manipulation, but suffers simply from the lack of broader R support across the ML and DL space.

+

The foverlaps function

+

If this kind of overlapping join is common, shouldn’t someone have developed a package for it? Turns out, data.table has, and with very specific constraints that make it the perfect solution to our problem (if you don’t mind switching over to R, that is).

+

The foverlaps function has these requirements:

+
    +
  1. The input data.table objects have to be keyed for automatic recognition of columns.
  2. +
  3. The default match type is that it matches all three cases from the image above. Side note: it also has matches for within overlap, matching start and end windows,
  4. +
  5. The last two matching columns in the join condition in by must specify the start and end points of the overlapping window. This isn’t a problem for us now, but does restrict for future uses where we may want non-equi joins on other cases.
  6. +
+

The code, si, the code!

+

Without further ado:

+ + + + + +
 1library(data.table)
+ 2library(lubridate)
+ 3
+ 4######### BOILERPLATE CODE, NO LOGIC HERE ####################
+ 5arrival_time = as_datetime(c(
+ 6  '2023-01-01 06:23:47.000000', '2023-01-01 06:26:42.000000',
+ 7  '2023-01-01 06:30:20.000000', '2023-01-01 06:32:06.000000',
+ 8  '2023-01-01 06:33:09.000000', '2023-01-01 06:34:08.000000',
+ 9  '2023-01-01 06:36:40.000000', '2023-01-01 06:37:43.000000',
+10  '2023-01-01 06:39:48.000000'))
+11departure_time = as_datetime(c(
+12  '2023-01-01 06:25:08.000000', '2023-01-01 06:28:02.000000',
+13  '2023-01-01 06:35:01.000000', '2023-01-01 06:33:48.000000',
+14  '2023-01-01 06:36:01.000000', '2023-01-01 06:39:49.000000',
+15  '2023-01-01 06:38:34.000000', '2023-01-01 06:40:48.000000',
+16  '2023-01-01 06:46:10.000000'))
+17ID = c('A1', 'A1', 'A5', 'A6', 'B3', 'C3', 'A6', 'A5', 'A6')
+18
+19DT = data.table(
+20  arrival_time = arrival_time,
+21  departure_time = departure_time,
+22  ID = ID)
+23######### BOILERPLATE CODE, NO LOGIC HERE ####################
+24
+25# A copy(DT) creates a copy of a data.table that isn't linked
+26# to the original one, so that changes in it don't reflect in
+27# the original DT object.
+28# The `:=` allow assignment by reference (i.e. "in place").
+29DT_with_windows = copy(DT)[, `:=`(
+30  window_start   = arrival_time   - minutes(1),
+31  window_end = departure_time + minutes(1))]
+32
+33# This step is necessary for the second table, but not the first, but we
+34# key both data.tables to make the foverlap code very succinct.
+35setkeyv(DT, c("arrival_time", "departure_time"))
+36setkeyv(DT_with_windows, c("window_start", "window_end"))
+37
+38# The foverlap function returns a data.table, so we can simply apply
+39# the usual data.table syntax on it!
+40# Since we have the same name of some columns in both data.tables,
+41# the latter table's columns are prefixed with "i." to avoid conflicts.
+42foverlaps(DT, DT_with_windows)[
+43  , .(docked_trucks = list(unique(i.ID)),
+44      docked_truck_count = uniqueN(i.ID))
+45  , .(arrival_time, departure_time)]

provides us the output:

+ + + + + +
 1          arrival_time      departure_time docked_trucks docked_truck_count
+ 2                <POSc>              <POSc>        <list>              <int>
+ 31: 2023-01-01 06:23:47 2023-01-01 06:25:08            A1                  1
+ 42: 2023-01-01 06:26:42 2023-01-01 06:28:02            A1                  1
+ 53: 2023-01-01 06:30:20 2023-01-01 06:35:01   A5,A6,B3,C3                  4
+ 64: 2023-01-01 06:32:06 2023-01-01 06:33:48   A5,A6,B3,C3                  4
+ 75: 2023-01-01 06:33:09 2023-01-01 06:36:01   A5,A6,B3,C3                  4
+ 86: 2023-01-01 06:34:08 2023-01-01 06:39:49   A5,A6,B3,C3                  4
+ 97: 2023-01-01 06:36:40 2023-01-01 06:38:34   B3,C3,A6,A5                  4
+108: 2023-01-01 06:37:43 2023-01-01 06:40:48      C3,A6,A5                  3
+119: 2023-01-01 06:39:48 2023-01-01 06:46:10      C3,A5,A6                  3

Considerations for using data.table

+

The package offers a wonderful, nearly one-stop solution that doesn’t require you to write the logic out for the query or command yourself, but has a major problem for a lot of users - it requires you to switch your codebase to R, and a lot of your tasks may be on Python or in an SQL pipeline. So, what do you do?

+

Consider the effort in maintaining an additional dependency for your analytics pipeline (i.e. R), and the effort that you’ll need to invest to run R from Python, or run an R script in your pipeline and pull the output from it back into the pipeline, and make your call.

+ +
+

+ +

+ + +

+ + Reply to this post by email ↪ + +

+ + + +
+
+ © Avinash Mallya | Design via Bear Cub. +
+ + + + + diff --git a/public/blog/001_overlap_joins/index.html b/public/blog/001_overlap_joins/index.html new file mode 100644 index 0000000..e4c8e5e --- /dev/null +++ b/public/blog/001_overlap_joins/index.html @@ -0,0 +1,309 @@ +Overlap Joins: Number of docker trucks in an interval | Avinash's Blog
+

Avinash's Blog

Overlap Joins: Number of docker trucks in an interval

Premise

I stumbled upon an interesting Stackoverflow question that was linked via an issue on Polars github repo. The OP asked for a pure Polars solution. At the time of answering the question Polars did not have support for non-equi joins, and any solution using it would be pretty cumbersome.

I’m more of a right-tool-for-the-job person, so I tried to find a better solution.

Problem Statement

Suppose we have a dataset that captures the arrival and departure times of trucks at a station, along with the truck’s ID.

 1import polars as pl # if you don't have polars, run 
+ 2                    # pip install 'polars[all]'
+ 3data = pl.from_repr("""
+ 4┌─────────────────────┬─────────────────────┬─────┐
+ 5│ arrival_time        ┆ departure_time      ┆ ID  │
+ 6│ ---                 ┆ ---                 ┆ --- │
+ 7│ datetime[μs]        ┆ datetime[μs]        ┆ str │
+ 8╞═════════════════════╪═════════════════════╪═════╡
+ 9│ 2023-01-01 06:23:47 ┆ 2023-01-01 06:25:08 ┆ A1  │
+10│ 2023-01-01 06:26:42 ┆ 2023-01-01 06:28:02 ┆ A1  │
+11│ 2023-01-01 06:30:20 ┆ 2023-01-01 06:35:01 ┆ A5  │
+12│ 2023-01-01 06:32:06 ┆ 2023-01-01 06:33:48 ┆ A6  │
+13│ 2023-01-01 06:33:09 ┆ 2023-01-01 06:36:01 ┆ B3  │
+14│ 2023-01-01 06:34:08 ┆ 2023-01-01 06:39:49 ┆ C3  │
+15│ 2023-01-01 06:36:40 ┆ 2023-01-01 06:38:34 ┆ A6  │
+16│ 2023-01-01 06:37:43 ┆ 2023-01-01 06:40:48 ┆ A5  │
+17│ 2023-01-01 06:39:48 ┆ 2023-01-01 06:46:10 ┆ A6  │
+18└─────────────────────┴─────────────────────┴─────┘
+19""")

We want to identify the number of trucks docked at any given time within a threshold of 1 minute prior to the arrival time of a truck, and 1 minute after the departure of a truck. Equivalently, this means that we need to calculate the number of trucks within a specific window for each row of the data.

Finding a solution to the problem

Evaluate for a specific row

Before we find a general solution to this problem, let’s consider a specific row to understand the problem better:

1"""
+2┌─────────────────────┬─────────────────────┬─────┐
+3│ arrival_time        ┆ departure_time      ┆ ID  │
+4│ ---                 ┆ ---                 ┆ --- │
+5│ datetime[μs]        ┆ datetime[μs]        ┆ str │
+6╞═════════════════════╪═════════════════════╪═════╡
+7│ 2023-01-01 06:32:06 ┆ 2023-01-01 06:33:48 ┆ A6  │
+8└─────────────────────┴─────────────────────┴─────┘
+9"""

For this row, we need to find the number of trucks that are there between 2023-01-01 06:31:06 (1 minute prior to the arrival_time and 2023-01-01 06:34:48 (1 minute post the departure_time). Manually going through the original dataset, we see that B3, C3, A6 and A5 are the truck IDs that qualify - they all are at the station in a duration that is between 2023-01-01 06:31:06 and 2023-01-01 06:34:48.

Visually deriving an algorithm

There are many cases that will qualify a truck to be present in the overlap window defined by a particular row. Specifically for the example above, we have (this visualization is generalizable, because for each row we can calculate without much difficulty the overlap window relative to the arrival and departure times):

The five different ways a period can overlap.

Take some time to absorb these cases - it’s important for the part where we write the code for the solution. Note that we need to actually tell our algorithm to filter only for Cases 2, 3 and 4, since Cases 1 and 5 will not satisfy our requirements.

Writing an SQL query based on the algorithm

In theory, we can use any language that has the capability to define rules that meet our algorithmic requirements outlined in the above section to find the solution. Why choose SQL? It’s often able to convey elegantly the logic that was used to execute the algorithm; and while it does come with excessive verbosity at times, it doesn’t quite in this case.

Note here that we run SQL in Python with almost no setup or boilerplate code - so this is a Python based solution as well (although not quite Pythonic!).

Introducing the DuckDB package

Once again, in theory, any SQL package or language can be used. Far too few however meet the ease-of-use that DuckDB provides:

  1. no expensive set-up time (meaning no need for setting up databases, even temporary ones),
  2. no dependencies (other than DuckDB itself, just pip install duckdb),
  3. some very friendly SQL extensions, and
  4. ability to work directly on Polars and Pandas DataFrames without conversions

all with mind-blowing speed that stands shoulder-to-shoulder with Polars. We’ll also use a few advanced SQL concepts noted below.

Self-joins

This should be a familiar, albeit not often used concept - a join of a table with itself is a self join. There are few cases where such an operation would make sense, and this happens to be one of them.

A bullet train recap of non-equi joins

A key concept that we’ll use is the idea of joining on a range of values rather than a specific value. That is, instead of the usual LEFT JOIN ON A.column = B.column, we can do LEFT JOIN ON A.column <= B.column for one row in table A to match to multiple rows in B. DuckDB has a blog post that outlines this join in detail, including fast implementation.

The concept of LIST columns

DuckDB has first class support for LIST columns - that is, each row in a LIST column can have a varying length (much like a Python list), but must have the exact same datatype (like R’s vector). Using list columns allow us to eschew the use of an additional GROUP BY operation on top of a WHERE filter or SELECT DISTINCT operation, since we can directly perform those on the LIST column itself.

Date algebra

Dates can be rather difficult to handle well in most tools and languages, with several packages purpose built to make handling them easier - lubridate from the tidyverse is a stellar example. Thankfully, DuckDB provides a similar swiss-knife set of tools to deal with it, including specifying INTERVALs (a special data type that represent a period of time independent of specific time values) to modify TIMESTAMP values using addition or subtraction.

Tell me the query, PLEASE!

Okay - had a lot of background. Let’s have at it! The query by itself in SQL is (see immediately below for runnable code in Python):

 1SELECT
+ 2     A.arrival_time
+ 3    ,A.departure_time
+ 4    ,A.window_open
+ 5    ,A.window_close
+ 6    ,LIST_DISTINCT(LIST(B.ID)) AS docked_trucks
+ 7    ,LIST_UNIQUE(LIST(B.ID))   AS docked_truck_count
+ 8
+ 9FROM (
+10    SELECT *
+11        ,arrival_time   - (INTERVAL 1 MINUTE) AS window_open
+12        ,departure_time + (INTERVAL 1 MINUTE) AS window_close
+13    FROM data) A
+14
+15LEFT JOIN (
+16    SELECT *
+17        ,DATEDIFF('seconds', arrival_time, departure_time) AS duration
+18    FROM data) B
+19
+20ON ((B.arrival_time <= A.window_open AND 
+21    	(B.arrival_time   + TO_SECONDS(B.duration)) >=  A.window_open) OR
+22    (B.arrival_time >= A.window_open AND 
+23                                  B.departure_time  <= A.window_close) OR
+24    (B.arrival_time >= A.window_open AND
+25    	(B.departure_time - TO_SECONDS(B.duration)) <= A.window_close))
+26GROUP BY 1, 2, 3, 4

A small, succinct query such as this will need a bit of explanation to take it all in. Here’s one below, reproducible in Python (make sure to install duckdb first!). Expand it to view.

SQL with explanation.
 1import duckdb as db
+ 2db.query("""
+ 3    SELECT
+ 4        A.arrival_time
+ 5        ,A.departure_time
+ 6        ,A.window_open
+ 7        ,A.window_close
+ 8        -- LIST aggregates the values into a LIST column
+ 9        -- and LIST_DISTINCT finds the unique values in it
+10        ,LIST_DISTINCT(LIST(B.ID)) AS docked_trucks
+11        -- finally, LIST_UNIQUE calculates the unique number of values in it
+12        ,LIST_UNIQUE(LIST(B.ID))   AS docked_truck_count
+13
+14    FROM (
+15        SELECT
+16            *
+17            ,arrival_time   - (INTERVAL 1 MINUTE) AS window_open
+18            ,departure_time + (INTERVAL 1 MINUTE) AS window_close
+19        FROM data -- remember we defined data as the Polars DataFrame with our truck station data
+20    ) A
+21
+22    LEFT JOIN (
+23        SELECT
+24            *
+25            -- This is the time, in seconds between the arrival and departure of
+26            -- each truck PER ROW in the original data-frame 
+27            ,DATEDIFF('seconds', arrival_time, departure_time) AS duration
+28        FROM data -- this is where we perform a self-join
+29    ) B
+30
+31    ON (
+32        -- Case 2 in the diagram;
+33        (B.arrival_time <= A.window_open AND 
+34            -- Adding the duration here makes sure that the second interval
+35            -- is at least ENDING AFTER the start of the overlap window
+36            (B.arrival_time   + TO_SECONDS(B.duration)) >=  A.window_open) OR
+37
+38        -- Case 3 in the diagram - the simplest of all five cases
+39        (B.arrival_time >= A.window_open AND 
+40                                      B.departure_time  <= A.window_close) OR
+41
+42        -- Case 4 in the digram;
+43        (B.arrival_time >= A.window_open AND
+44            -- Subtracting the duration here makes sure that the second interval
+45            -- STARTS BEFORE the end of the overlap window.
+46            (B.departure_time - TO_SECONDS(B.duration)) <= A.window_close)
+47    )
+48    GROUP BY 1, 2, 3, 4
+49""")

The output of this query is:

"""
+┌─────────────────────┬─────────────────────┬─────────────────────┬───┬──────────────────┬────────────────────┐
+│    arrival_time     │   departure_time    │     window_open     │ … │  docked_trucks   │ docked_truck_count │
+│      timestamp      │      timestamp      │      timestamp      │   │    varchar[]     │       uint64       │
+├─────────────────────┼─────────────────────┼─────────────────────┼───┼──────────────────┼────────────────────┤
+│ 2023-01-01 06:23:47 │ 2023-01-01 06:25:08 │ 2023-01-01 06:22:47 │ … │ [A1]             │                  1 │
+│ 2023-01-01 06:26:42 │ 2023-01-01 06:28:02 │ 2023-01-01 06:25:42 │ … │ [A1]             │                  1 │
+│ 2023-01-01 06:30:20 │ 2023-01-01 06:35:01 │ 2023-01-01 06:29:20 │ … │ [B3, C3, A6, A5] │                  4 │
+│ 2023-01-01 06:32:06 │ 2023-01-01 06:33:48 │ 2023-01-01 06:31:06 │ … │ [B3, C3, A6, A5] │                  4 │
+│ 2023-01-01 06:33:09 │ 2023-01-01 06:36:01 │ 2023-01-01 06:32:09 │ … │ [B3, C3, A6, A5] │                  4 │
+│ 2023-01-01 06:34:08 │ 2023-01-01 06:39:49 │ 2023-01-01 06:33:08 │ … │ [B3, C3, A6, A5] │                  4 │
+│ 2023-01-01 06:36:40 │ 2023-01-01 06:38:34 │ 2023-01-01 06:35:40 │ … │ [A5, A6, C3, B3] │                  4 │
+│ 2023-01-01 06:37:43 │ 2023-01-01 06:40:48 │ 2023-01-01 06:36:43 │ … │ [A5, A6, C3]     │                  3 │
+│ 2023-01-01 06:39:48 │ 2023-01-01 06:46:10 │ 2023-01-01 06:38:48 │ … │ [A6, A5, C3]     │                  3 │
+├─────────────────────┴─────────────────────┴─────────────────────┴───┴──────────────────┴────────────────────┤
+│ 9 rows                                                                                  6 columns (5 shown) │
+└─────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
+"""

We clearly see the strengths of DuckDB in how succintly we were able to express this operation. We also find how DuckDB is able to seamlessly integrate with an existing Pandas or Polars pipeline with zero-conversion costs. In fact, we can convert this back to a Polars or Pandas dataframe by appending the ending bracket with db.query(...).pl() and db.query(...).pd() respectively.

Can we make the SQL simpler?

Now that we’ve understood the logic that goes into the query, let’s try to optimize the algorithm. We have the three conditions:

1-- Case 2 in the diagram
+2(B.arrival_time <= A.window_open AND 
+3    (B.arrival_time   + TO_SECONDS(B.duration)) >=  A.window_open) OR
+4-- Case 3 in the diagram
+5(B.arrival_time >= A.window_open AND 
+6                              B.departure_time  <= A.window_close) OR
+7-- Case 4 in the diagram
+8(B.arrival_time >= A.window_open AND
+9    (B.departure_time - TO_SECONDS(B.duration)) <= A.window_close)

What is common between these three conditions? It takes a while to see it; but it becomes clear that all these cases require the start of the overlap to be before the window ends, and the end of the overlap to be after the window starts. This can be simplified to just:

1B.arrival_time   <= A.window_close AND
+2B.departure_time >= A.window_open

making our query much simpler!

Simplified SQL: Part 1

We’ve removed the need for the duration calculation algother now. Therefore, we can write:

 1SELECT
+ 2     A.arrival_time
+ 3    ,A.departure_time
+ 4    ,A.window_open
+ 5    ,A.window_close
+ 6    ,LIST_DISTINCT(LIST(B.ID)) AS docked_trucks
+ 7    ,LIST_UNIQUE(LIST(B.ID))   AS docked_truck_count
+ 8
+ 9FROM (
+10    SELECT *
+11        ,arrival_time   - (INTERVAL 1 MINUTE) AS window_open
+12        ,departure_time + (INTERVAL 1 MINUTE) AS window_close
+13    FROM data) A
+14
+15LEFT JOIN data B
+16
+17ON (
+18    B.arrival_time   <= A.window_close AND
+19    B.departure_time >= A.window_open
+20)
+21GROUP BY 1, 2, 3, 4

Can we simplify this even further?

Simplification: Part 2

I think the SQL query in the above section is very easy to ready already. However, it is a little clunky overall, and there is a way that we can leverage DuckDB’s extensive optimizations to simplify our legibility by rewriting the query as a cross join:

 1SELECT
+ 2    A.arrival_time
+ 3    ,A.departure_time
+ 4    ,A.arrival_time - (INTERVAL 1 MINUTE)   AS window_open
+ 5    ,A.departure_time + (INTERVAL 1 MINUTE) AS window_close
+ 6    ,LIST_DISTINCT(LIST(B.ID)) AS docked_trucks
+ 7    ,LIST_UNIQUE(LIST(B.ID))   AS docked_truck_count
+ 8FROM  data A, data B
+ 9WHERE B.arrival_time   <= window_close
+10AND   B.departure_time >= window_open
+11GROUP BY 1, 2, 3, 4

Why does this work? Before optimization on DuckDB, this is what the query plan looks like:

DuckDB query plan before optimization
 1"""
+ 2┌───────────────────────────┐                             
+ 3│         PROJECTION        │                             
+ 4│   ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─   │                             
+ 5│             0             │                             
+ 6│             1             │                             
+ 7│             2             │                             
+ 8│             3             │                             
+ 9│       docked_trucks       │                             
+10│     docked_truck_count    │                             
+11└─────────────┬─────────────┘                                                          
+12┌─────────────┴─────────────┐                             
+13│         AGGREGATE         │                             
+14│   ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─   │                             
+15│        arrival_time       │                             
+16│       departure_time      │                             
+17│        window_open        │                             
+18│        window_close       │                             
+19│          list(ID)         │                             
+20└─────────────┬─────────────┘                                                          
+21┌─────────────┴─────────────┐                             
+22│           FILTER          │                             
+23│   ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─   │                             
+24│     (arrival_time <=      │                             
+25│(departure_time + to_m...  │                             
+26│        AS BIGINT))))      │                             
+27│    (departure_time >=     │                             
+28│(arrival_time - to_min...  │                             
+29│        AS BIGINT))))      │                             
+30└─────────────┬─────────────┘                                                          
+31┌─────────────┴─────────────┐                             
+32│       CROSS_PRODUCT       ├──────────────┐              
+33└─────────────┬─────────────┘              │                                           
+34┌─────────────┴─────────────┐┌─────────────┴─────────────┐
+35│         ARROW_SCAN        ││         ARROW_SCAN        │
+36└───────────────────────────┘└───────────────────────────┘ 
+37"""                            

After optimization, the CROSS_PRODUCT is automatically optimized to an interval join!

DuckDB query after before optimization
 1"""
+ 2┌───────────────────────────┐                             
+ 3│         PROJECTION        │                             
+ 4│   ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─   │                             
+ 5│             0             │                             
+ 6│             1             │                             
+ 7│             2             │                             
+ 8│             3             │                             
+ 9│       docked_trucks       │                             
+10│     docked_truck_count    │                             
+11└─────────────┬─────────────┘                                                          
+12┌─────────────┴─────────────┐                             
+13│         AGGREGATE         │                             
+14│   ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─   │                             
+15│        arrival_time       │                             
+16│       departure_time      │                             
+17│        window_open        │                             
+18│        window_close       │                             
+19│          list(ID)         │                             
+20└─────────────┬─────────────┘                                                          
+21┌─────────────┴─────────────┐                             
+22│      COMPARISON_JOIN      │                             
+23│   ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─   │                             
+24│           INNER           │                             
+25│ ((departure_time + '00:01 │                             
+26│     :00'::INTERVAL) >=    ├──────────────┐              
+27│        arrival_time)      │              │              
+28│((arrival_time - '00:01:00'│              │              
+29│       ::INTERVAL) <=      │              │              
+30│       departure_time)     │              │              
+31└─────────────┬─────────────┘              │                                           
+32┌─────────────┴─────────────┐┌─────────────┴─────────────┐
+33│         ARROW_SCAN        ││         ARROW_SCAN        │
+34└───────────────────────────┘└───────────────────────────┘
+35"""                      

So in effect, we’re actually exploiting a feature of DuckDB to allow us to write our queries in a suboptimal manner for greater readability, and allowing the optmizer to do a good chunk of our work for us. I wouldn’t recommend using this generally, because not all SQL engine optmizers will be able to find an efficient route to these calculations for large datasets.

How to get query plans?

I’m glad you asked. Here’s the DuckDB page explaining EXPLAIN (heh). Here’s the code I used:

 1import duckdb as db
+ 2db.sql("SET EXPLAIN_OUTPUT='all';")
+ 3print(db.query("""
+ 4EXPLAIN
+ 5SELECT
+ 6    A.arrival_time
+ 7    ,A.departure_time
+ 8    ,A.arrival_time - (INTERVAL 1 MINUTE) AS window_open
+ 9    ,A.departure_time + (INTERVAL 1 MINUTE) AS window_close
+10    ,LIST_DISTINCT(LIST(B.ID)) AS docked_trucks
+11    ,LIST_UNIQUE(LIST(B.ID))   AS docked_truck_count
+12FROM  data A, data B
+13WHERE B.arrival_time   <= window_close
+14AND   B.departure_time >= window_open
+15GROUP BY 1, 2, 3, 4
+16""").pl()[1, 1])

What are the alternatives?

The data.table way

data.table is a package that has historically been ahead of its time - in both speed and features that it has had. Developement has taken a hit recently, but will likely pick back up. It’s my favourite package on all fronts for data manipulation, but suffers simply from the lack of broader R support across the ML and DL space.

The foverlaps function

If this kind of overlapping join is common, shouldn’t someone have developed a package for it? Turns out, data.table has, and with very specific constraints that make it the perfect solution to our problem (if you don’t mind switching over to R, that is).

The foverlaps function has these requirements:

  1. The input data.table objects have to be keyed for automatic recognition of columns.
  2. The default match type is that it matches all three cases from the image above. Side note: it also has matches for within overlap, matching start and end windows,
  3. The last two matching columns in the join condition in by must specify the start and end points of the overlapping window. This isn’t a problem for us now, but does restrict for future uses where we may want non-equi joins on other cases.

The code, si, the code!

Without further ado:

 1library(data.table)
+ 2library(lubridate)
+ 3
+ 4######### BOILERPLATE CODE, NO LOGIC HERE ####################
+ 5arrival_time = as_datetime(c(
+ 6  '2023-01-01 06:23:47.000000', '2023-01-01 06:26:42.000000',
+ 7  '2023-01-01 06:30:20.000000', '2023-01-01 06:32:06.000000',
+ 8  '2023-01-01 06:33:09.000000', '2023-01-01 06:34:08.000000',
+ 9  '2023-01-01 06:36:40.000000', '2023-01-01 06:37:43.000000',
+10  '2023-01-01 06:39:48.000000'))
+11departure_time = as_datetime(c(
+12  '2023-01-01 06:25:08.000000', '2023-01-01 06:28:02.000000',
+13  '2023-01-01 06:35:01.000000', '2023-01-01 06:33:48.000000',
+14  '2023-01-01 06:36:01.000000', '2023-01-01 06:39:49.000000',
+15  '2023-01-01 06:38:34.000000', '2023-01-01 06:40:48.000000',
+16  '2023-01-01 06:46:10.000000'))
+17ID = c('A1', 'A1', 'A5', 'A6', 'B3', 'C3', 'A6', 'A5', 'A6')
+18
+19DT = data.table(
+20  arrival_time = arrival_time,
+21  departure_time = departure_time,
+22  ID = ID)
+23######### BOILERPLATE CODE, NO LOGIC HERE ####################
+24
+25# A copy(DT) creates a copy of a data.table that isn't linked
+26# to the original one, so that changes in it don't reflect in
+27# the original DT object.
+28# The `:=` allow assignment by reference (i.e. "in place").
+29DT_with_windows = copy(DT)[, `:=`(
+30  window_start   = arrival_time   - minutes(1),
+31  window_end = departure_time + minutes(1))]
+32
+33# This step is necessary for the second table, but not the first, but we
+34# key both data.tables to make the foverlap code very succinct.
+35setkeyv(DT, c("arrival_time", "departure_time"))
+36setkeyv(DT_with_windows, c("window_start", "window_end"))
+37
+38# The foverlap function returns a data.table, so we can simply apply
+39# the usual data.table syntax on it!
+40# Since we have the same name of some columns in both data.tables,
+41# the latter table's columns are prefixed with "i." to avoid conflicts.
+42foverlaps(DT, DT_with_windows)[
+43  , .(docked_trucks = list(unique(i.ID)),
+44      docked_truck_count = uniqueN(i.ID))
+45  , .(arrival_time, departure_time)]

provides us the output:

 1          arrival_time      departure_time docked_trucks docked_truck_count
+ 2                <POSc>              <POSc>        <list>              <int>
+ 31: 2023-01-01 06:23:47 2023-01-01 06:25:08            A1                  1
+ 42: 2023-01-01 06:26:42 2023-01-01 06:28:02            A1                  1
+ 53: 2023-01-01 06:30:20 2023-01-01 06:35:01   A5,A6,B3,C3                  4
+ 64: 2023-01-01 06:32:06 2023-01-01 06:33:48   A5,A6,B3,C3                  4
+ 75: 2023-01-01 06:33:09 2023-01-01 06:36:01   A5,A6,B3,C3                  4
+ 86: 2023-01-01 06:34:08 2023-01-01 06:39:49   A5,A6,B3,C3                  4
+ 97: 2023-01-01 06:36:40 2023-01-01 06:38:34   B3,C3,A6,A5                  4
+108: 2023-01-01 06:37:43 2023-01-01 06:40:48      C3,A6,A5                  3
+119: 2023-01-01 06:39:48 2023-01-01 06:46:10      C3,A5,A6                  3

Considerations for using data.table

The package offers a wonderful, nearly one-stop solution that doesn’t require you to write the logic out for the query or command yourself, but has a major problem for a lot of users - it requires you to switch your codebase to R, and a lot of your tasks may be on Python or in an SQL pipeline. So, what do you do?

Consider the effort in maintaining an additional dependency for your analytics pipeline (i.e. R), and the effort that you’ll need to invest to run R from Python, or run an R script in your pipeline and pull the output from it back into the pipeline, and make your call.

© Avinash Mallya | Design via Bear Cub.
\ No newline at end of file diff --git a/public/blog/001_overlap_joins/overlap_algorithm.png b/public/blog/001_overlap_joins/overlap_algorithm.png new file mode 100644 index 0000000000000000000000000000000000000000..a9e3b35ac36917d06fde96e8815661c2acafdf33 GIT binary patch literal 140393 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⋘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
gzw-(7fM0 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
$by>_rTquOnKii}M6b1lAb{oZKT@P+}P|`%#2B; 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 Z{^d4>rTN$1aKEloRn$12b@tl5{{qojJFEZz literal 0 HcmV?d00001 diff --git a/public/blog/002_representative_samples/002_Network_Cluster_2.png b/public/blog/002_representative_samples/002_Network_Cluster_2.png new file mode 100644 index 0000000000000000000000000000000000000000..9dd73e5e9eb0efc488097795cbe1abec50b6cd83 GIT binary patch literal 302590 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:%q-GE!dk%*Tkw-s}F^zJcFs< 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 z zy4FgwZe@O^|CPHn{0HB|O(?Q-@et?6(7if6uFGjY-Abh%adz@3>+T@kA5U9PFFv|) z^6Avi8%1d*#9uogmXALi`|$CEv}H9uZQjJxOr#E!>QFH8Tvb|cJu9))$UbMw4`haR z6fX#G3WkLT9j(?OeQMGtqUnvL?HKj<3Ep9ltc$4ilu}3tnEx6&hl4Vb_qf)n1ZnnR zWXOKU0R|boT~tLjF|4NEHm;xWrf?JqX-B^3Auy3#|0489TgQtD|2a&w%8LMjOCAbf zo-z}Wt;1?xPRk;zb{@R~3CoQ|@zAs~^K)FH(pjA{gt{H()4dFHGK1#*D&0yw_}VGo zK4%M|;!>t?0qvQ{Q%YZ+7SZ%o6;7h5yq+DG$|>>TJ8niHXPVvAz=^H~S9Fsix3!mb5++cn|!$?m}U(}z9X?!;NW^h(PmK$FE1Zw;mV>Yan9RWGbfomrCJ2z4AUdCI-t?-)$9L>Wnv=>QMT31nB(N2-wQY z^@x;5mxmiDj^@~_O#=-9WATP1R^2|t%}5r^wvGbWFN#@d<$)NF0Qx#5HxAkuq5-9K z%Nb0D+_AUb1lWhp;w+F6mR(7c-;0|P32FhD0lYd`s7)*BbL+1*tD0y2L2GpVg!NAw z7hc0B-=WjO-D=5m_N1-#*-(Yy`$FHqhd1O~Tv}uP7)VmI5uXHc)ycAK{OV1Md1M{_ zpmS4}kfjlug|I!qPRKN#YA33;eEAS6;h0MQcSs1dtaw-h+2}K9tb!daijp@20_6PE ziv+2ONgwSfuJa!8DUhirE#oipKoNN+zaz{36!6 zE~t~s*~p?Rh54E0;_;0JNntloqe&}I9=k7310_V9(z~FZstrDCcI4p>skmmHSHnK7 zvR9>e@k8p~SRkN@>=PefWtW>^;jp8fjTdGw0L3=27si($+F6+(xq^Dor?z<#;ON_5 z@-_AgH!-v5yp1amyRHOXEB=7xauXTbnbKjUm|4%LUR4L zhC+(9I*sz-9Amk%uT14sE{~h^EzhXfr6$-wWW+1S_~23xgoi0XjDYIGxS?n7c3D1m zz9WMObFNGlas7TfK{IKm?EL&(rTyG^I)6oLh#U<7aAycrB)M5>4gYuHOzy>Gz6B_! zj)8dzk28PVdRoW0bTeZuP>lHKCYSeCFV=pV-sWg6z2I@zJqzE*U2PB_63`68w*ZE* zn)W+HlFfbjQkfWUz%C%qK2PP?&l->RuE4bYzgG^(4NxJ~YOT!JI{eBW@-CjCXn)1? zP%GtSMqo@e>!!OnMNt0P!37aKHJG zWAB@e#&03Y5|iE_b}@HuJ`D|YCakf8yGtuia$5uFZgHZ-4n6;-IH|9>mm(&N z6Zx)?hny-M`pR5{n)MV)7XXyussc?rA-^Fy;u77I<$xw-=@b9 zU{lDEVgQ}U7bYq*GKAZe=z7~l-R98wWtjW>FoD6VPuF zkO3(Et#(ZbE*4lu)Ax@jp0)M@L0+iF!FtRy@5Z%Lo&%H7u5wnQ8lCshti~0H)9u=y z=fykyQfco|^BM3$ZN~?KG$2{?5nz7>Bs7%kT;8`*~*xx((IwaIugD@~1I&wkJeT}WguZ%>extZb(mI-yAnHmL& zX2)oWPI&54N{KY?r}~h2-Pzw9f3+bcVll$o-0cXRypY}T>9N+YRcpJojaCzZsU!Mc z>8&f+VQN(k+LQ_KxKTExRQd6a3m&}yK3EtTmn?5RV$J^V&3dNF0wDKXJR~W(m94t>oWz zYj@q$?ePDKC=`Y}n7Cw+9SU{XOzAkvFpp}SVQk{og0NTAP$HJN8+;GOwl5c15+$Ob zB}OW`LW;HX5hZM)U;-Ri?=K3wL0?=40*QzqHblyvFe6_5^_7{C%R5jJioO@$7U+8s zSf^rjOxQz)vha#GU%MSz*3@poyuXYsv_$ZUSnivCKpdX8(9ml2M(;3@`}PrfGj`mN@3HfH*240pTJ(zu*Z((jy z(UnGd+awlEUtH%>%ftsiR~lVbaD2=$H^uO5fMayLJnGt#Xrb4*X^nn-NF_gKEj0j> z!9HEJ_j?Op8ICcQN|y+c8`lJNh=HHr3ua#0HFeu*aAB5Kyt}=}pwcxX)+V?kyZ$&y zr$epOmz{vUx2+sXPr4t-1caA5mWHBAIr9~y8vg&LiLTz37pH~(3^|}>#id!o?8%r} zJa;I%W+FDJtSn$-SmotUBx^4FXI+N6O_@D0Z<8z!d<`l#=WtFv=3xBjl;H8MvP0|*9U6Qrfb zD|py@TrO_R@*gTOW${)bQ;rMUFn^59I++{u$%s0~Cj`J7GZ&!CQB3v7)brvS0W(EW z@b+pcS^9!HW5lK$%R?Iqn5Zae&)ql>z=p$QBe@|`d!OoXZjJIM(Z~<_YdWjNS63>M z9Z`weXfOLI8D4lhgW5FH?YBqvU|!OiBbrmpOIjFjicA}jfAar|h$yNt|GuCx#quOM z@$kV?`N4Or${`K(DnMk67e60hl50c$)QnNy9F8*(Tn-JCgB}mG_aVdI(baBTe!F&a zsB6v2S3Pimsp!sm6@*Qwtc^$Pg2DjjuZ&V^#N96iGOnqM=&I!#{$QvbnXN)4v5Yc) zCnXma>~lDZN>LkD0m?ou_14dPg53Ta7Qf>}@mi2HK&UzIc6po6z6Gk27}ToHKeila zZGKu7wT4d?6jiT*)04(?KLmPEn1zA--Q*V576AY1Sj{t0+d9CF;T$`Pdve0X{if~l zFFZ>@@9?38U1PZ?rZqvH1HN0}@e)+wznT#eX&olC5aT|t=L)5Z!>`58>9MH@5JK_`t)IGXk{?XW32%045X zn9fS3hZ80KDAj&&FYnfIB$+~Um3{&@; z?XxD~oLPoyugjP=MWj(uA8vY!58wheqobyq{-uk|=vAH8`qbR%H?`eEQ0}4M>avE& zVn$RzdtGF$?|(aPDV3AlxCsF|pdvb;5sEwf_QkRSWj{|#whi*;%fJHC>vr{IvxXH7 z4p#R6lTjuEBKNEs7-P=xPtR}}dsYtY9@sv`@sk&?3B<1P+Q(|&RSRHjtO_|I&}9zP zYfgigD|a7X4XI7*TlOG&$Co(}rHI|jnq0hk^?{*#I6<`)DNt}9)~_Id5dI~sg%496 z>3fho_rHY_8-mJ()T}QTKV3D@Uf_c!xOr!9XxSZkNxN9RP{YmHlfCt9d);fBLG3X5BA3my1-T zOy+e|;Zz4t_!wPx8hQ872>|$d)3;6Uih7^`f&6j1ZpBG*jfBl2Lh^?6BuaCDzKGzeYLX0Oi5!-xk17hw`A#tl7J)$peEotBUy6Lgqo6YTWQ{CBCGzuov4iiG@ z*#MYZRJ!zF%8vS#o3Q!wwwpv~dIY)A2zTSaG;W3LF29Yia_^67O1MbyvBDeGPuKP^ zU^KM1T6|e#&-5uzs4ma=v}CtGY`~x)69#Y7N*Udab*#@zX@-+k6IQo%a65~@4YC+k z-~%Uz)!l&eW|F63|zo^`PN;76Py`rUe_4=Mzp0(DG-#v5j z7<0|cQ9&5<=i8n6^2{d1DYQx8=~JVpv;?ES?5wn&ZmnHWFi`%7H8jsWe+5f`c<9%q znC6rT@cxszMUG!$eg{{2{%?PZjMn@va4`Nhwc|$)L-51`{W8E4xtLs(BLE)f{oyZV z%?JL~;1I)4fYCD#6n1tx5JK;}A7dKfpItcdIMd1F*t^}N-+n)oq&Up~!{(anm^0vH zF-2~_{m=DdKYmHS33FeWiBqcQKb_Qnf1S5D*y-a_xS03uzyHfWofY^n!E(0TJaMrf zINg{Z1~`NN&maHyG5$|DjT;KM{y$C>%Gk6OT+$3HSe4~IsfhY|3)Sn6+S-3Q z4_{8E<|>CUhnElFr*nMMwwII)kz33;Z|ACAPaK3S)sXzSXLOGBTzmAX{>@bR{Wd5d z>vmCci@lQ$m2;}~EW>I zuIG^%NQEg_x4!6to;^JKNJj$F2dGG6 zjr4&4CMMw_z^m@w%QuX=xHRa*UxSqbgHOC^Qgw%C_1nx5 z2d`seBEi6dRA_4DGc@s79XQRt`wQWQ&O7#Zd1>;Pa?;LWNdAO~l1BessU4c3l*MOX zx1E*WX)CchBn7uAjz(hW93WtSuZ1mAGRTPy-(8+Qy%5`6UITE^`zN+Dh166C)8jwd ztXzC-i+=YOR<^-e(joxikA<_y)`9Tn#Tcc0b@nd-EY80$4?=C#K2Qol8{_3T>1A&9FZ`>~ax;nqp-ls{{R zdXkv{>qVgb`OcIbGquHUo0gCvrf%w;t(U@i(2p9+p1k|}fkWBVl`uP#fN~S`paCNO zm&pbng2;+&Ytq^qU3fs^2$PH}v`JA05_}8OcCBHU1i{?4zU%STxNz%c>1zGG5%z{6 z!>epkBfwVsk#;AJr4$NjyLc-B1(=Tm**z06~s5aDmg)nK0Gzl;bDHEFU_q%oZ906IMNS*LFYJ-oCL7jcdngm z{{74Mft$>N;RiP>>CoAedCI2vLjj*bmD!v;ZZZVj!xn)C-cc9Xng_NFykGCJBiCppuy0C*cNo}iZZX8 zcW88%4pnOR69>|AL0c=)?$#dsHE-zzG=wqg@DS{^=9YznJq1%m-q@cKy?cQ=&S$y2 z-E?j|=nsu^cbJ#`oXvl|?92?W$*yJ$z#~`XjQl4`%=HY^s%|6^aOI! zgi!-*gF^sFaIN4R?!n+Ua=V(`-*z<6R2cc5A&p-n+^|lojOG@CAJR#)g1mmQ@+d3dquEA6=S%b&9_^o{btQ)cJD>EdwH@DIq8*0lsObIC)W?HRXGj_mfQHdJ+jX@S1-MP zTllVe%7T*`%lU}6HG_rI=$%L$uYHq$xI0! zA!38iNT&~})6RMGere*N_Dr3r|H@X1v@dN{rhwO~!)s^lvQ|np&10+>j_ugwO@RSL z#M`T|TBwJC)oqR+hQCPkkt_Kwi8O#T>$u5w1}rR5{`TA0ra5DAHLHqr;__hM_~))3 z8gu=F{yx)I7graTVi@q?OTgtnT3!!lZmL!rs#IHM_)A{4s8+<;NjT$HimXAA5(+tcwYv-%;GhzlnMyOd_`vyn_3KgQVK9RY8 z3wOu;hws)d<_JP0&$-~FW(=R&$5lEoPMoGQC*c%G3n1HufM~JXMadU=WMhxkClQog zThYt3<4A!eA&(J6E=8AQbKrqA$x;vcxH_BVzbFoX5_gkftU@`{(tNPLD-krWZ;+*K z)#+Sf+uw}72X=kj*y?%-U@G~*l~$n`=$SGO41&34qv<5Sx+N1*{<@T&qY4ZU@w*NA zb@JVwoddw)aUp5EP7QEli@>2;oDwcrdTXlte$yw!0exj0jstFrhX;ALQqYSEhHjaZ z>f20}|ER$-NLU=E&L!nx=0Mu?G1(v3cn5(p`NEv0;uxTpTHtlbzsvy@!Q8#YhA9E; zsf$XFA0(Fz9)fKnh2-mfu$x!yn+vy8AxaW88r5TFyd@tT{LF$mHw=sgQKS!&$ zd+Xj6yQ>5A#ebnM4y)PzHIK>Jb;&8Yn*{!k3e*&CW|!Cxo6%n+o9wITOn=D?kC4Jh zv%@fy(@cCcnaB?PNGs-9^9|}KuLMgtia^Wwyxn3oYw2NkwjNJdPq)3ibJ2-BaeENe|0F@&2+dKi{f)I+ z4{{e`cCvZ1bCc8WUEeb;QbwbDO5beLoIc5FxXeysae~87GIk3X2wVpNtJty@O5G3s z`26_SP3U;lx8%Mv?V?#xoiZD$dmEZ{d;E`sGIVp?ax<1( z9Ss^>kF6kms!#~FX^%=+1iT`=r#Zx6jG+|MTq%rGl6x6Z=k*6)d!bcQ)qoiuncAe! z3t)5SI4kVCkH0MfBB1zc{I00)zKJ?>mj3VA>`~lL%}!41&aK`;F`$P&W&)~T^%tgi zE_Z69CADaUzPoaC^1GH%3$=e^&2LJX>hh0eY_TDow&>#Do4YwMY9^>?tX9KKe*N(b$r=HEAP|S&E~_P*W8W9l+QUfZJ-dd z{-jVlz=r)ZU=0W9XYUi*P2}9arU7=UaR0m@`HdWJ6dlMkeWos?LOZv*<@zFBcKbEi zMWz_Q2JCD*4kikjiqZrle;kqRzTi^599X3Qf6f2+W=%Ei^1vC^)h|mjy1`$?vHCJC zz~XxGo3@X_K+;G}4Etn%48`-b9ZLD$k}%%Uxz&Zjl4tVCZF%yU8zM1Omo}qmmHGMYXhl8{icdI z3E_dE{Uz-iq{d=bNb;XA7d%8$}+T7;c3%}TAUEg5L^Tl+HM)yL*7 z6oh>7*R%~&dN1~>6nfbEO0L+)uwz!qXA<2#zrODY)E$hScF94u+MoA@!f(>iIVVfv z_xE023j1O0u!6Gu`qY&5>8hRBD&p=k6(|7lo}mlQ$X#<=wfajXAsO)6JAb(dV+)E* z4kT+QWYLU7ID+$UVV)fW)OMb;Fr&@O=e{A!#)=2ihntJo$o93;Mh%d#F94P)t;g-Z z!LHwmGetW%ei39Z0ZdT=8Eoc>u5D_2-&1)&dAQv2xL!G6@Q#iaS6wSb>+qHGll4y= zLi|~P@K>N&Q-x=l;?_7sLb9Up75$hjaIQVOPYILx^16d+1FflB#Au1)gTK54qP}wR=6GbStd9F3 zC>5LWwkm7)y$GW7Ge93A92=HQ5A*l2$IOGxHM-shvb%$7;m4@2+YMVXrKokQ{&>?7@Q#LG{7Htjb%gsdjA-bY-G}?S0cNY>ioWa^^|5`W*tQ!mmW4uHKNJ#1 z=viZ~W`MOF9J3*ZO55XstJ##u)CXGgpWCWYAmpsarLjAHpJB+_499RUk!($J@8u-! z{dvu`&j{_e(5c0Dwa!kF=9UR|DxGUw#Rk)hm7;GFHUTt0Qe_a_eZN`s&6OU&8&t0{ zRyA!F)H)}wB_bOXWpypv=!3IU4=@`mtQYd2T531t7WCD*9G?reSIEDUTacGEbb9w$ zoBI=AC4S@ps9vXT;{&&0_tuE<#+L35_^KefWHj8$$0T*qv~)?aWMie#DVytrQ=)_c zPG6lGt$-X|v|?X=J1miwBmK8EUq%+tDehM0t}9;N+(6Y5bVG>^^h6N@|LVow`;;IA?bB;_Gu5Qh0H@K>IcnU%1(a%3%@MkF3pc)yd|X}9f6R} z1F)dPL|tyFgH7D=vJDX})#l7bw29ekFhG2u19@_`(-0W7>(EI+uR}?^SIx5URmZ>Q z2`CJqfG>pm@5Zezt&n&LI#r^!0d-G!AA4ta8rjAQFYt-qq11xjUV|-cpH*jOXguZUdH;i|a{%O6|}yy62g#hTR+4O(c1A1Pk+l{$9{sQ)k!bl`kJU$)s0vRRC8D%l-+K`)1>| zXmb_DD@|3mg>_p@#>{=1QDfF+x0XNUeY$+ktEbY1+5q#5^{SW0qiLA*X%RlAHs=Y_ zMjY$7j(eM1z^t12h`^y;ro`4P`V#WwZrQOO74}y)DOCCYYzJue(gWK89^gY$%bSXP z0Vb5_^%{HCm&;-N9<4mJ*M2 z(HN@A9lux>H)^W>f))&qA^6?jG|6SsuR@|VMz{qavmTkWyXHJx@}1teyVe}CwK(Um z_F2^NB6&5(6en6Z&~%9SJzuc*IKE=!f?1ypeG#sX#jqAe%tot91+tYj1(P<93cb{v zUaF@AB&eOE`z7Jnk;`Q8yUP=Ns0YE~8uoGgA3LgVgIx}%sD2UkhF$lg2{|Y`wN?Fp zrqZo{B8v)$HCz&gd?#1y0t@3W#h7NGxE@I}&dU|Mu%I|Th2Y|^W4i~|rY(1P;4Wgn(gX#^4b>K$6!kUwZ6E(7=OQmFi|RJDR6_)i_qP0Kgj7RT-09Zsrf*pvG^qL1vdEwO|$tWu-GfLZopZjp_x?G=%y0Hyd+im^^DK!$0>vMp=z)HIm`3CT?-%)bHM!&qjo17$_gzPkJ zbUn_l6Z2jftug^xctxyQtQ}bD(QCmgVaDegiSLg1rpq~hF)bh0r^R^NrB|Q08d_c^ zz$636E)s!D8*|AX_R$uT4y6;mG7cEu1#x>K)r(Nyc&*Zp-j=&B{TFcOl(2Nyk4Dx7 zaO3r#f2goz*jxiido5MlD*j@+mwIksw?chOs`18zh3cDH6N(YZGy(Ev+nSRSR-16K zUlun+soMQBy-n?joLqb|FF5n1H81YQWX5mHe1X?z3uW7xDyfGYd4)N~8`_B`Sra%@ z%L||B$%`|)`iaTVrV?u45^Um(Fk;$oZ2Swa@#%?)|=+`7KHH{_bG+w=z&e zs37L*zb*G(E#otQZgf|VLF=UiDF>k;Z690wv0=!UrJby;LN5>|?V04~ZtddJ10_D& z?r2AFZslj4wRktpwCTxo6lfgf#Ec?*=WnItbf)~ka;$-M@K9VHc(8n!8(=PaW5Tvf z9x2qlq3?0fD{Oy2;{qD{uL|t9_Myyd-xSr00AziV_M&s;rev!ofmMA~qd1q!!tP+K zv74hlqtJVT&CGa>bdNCX5A~pllJR-{nmE9`bA& zDF-EyV#F?lvLVR^FS8uo?sW1<^u4wwQqPo^SDt*oc()LLLO_2^Ytrk#Y-5%;{6a6= zwd+8p}cvnywy?xUow`O-$v)W-w&wwXlLGSZn0Ow`d)I3UmYRH=J z8X#N0>Ctb=tfD!x*UA`_NF6|r4$?DcxmXL|n9#3`0pZXQgHL5X*{AHq9&0Kl69JZ4 zhfM?4pDc>KXwu_MSa_JLdUmq}Ko`N_H;ibhz2cMm@`rLUAv>yhNYP<{_<324mBbhu z&4>QntzdHF1j5{QOxL_gPG8V>DmV(pG?rN0QpP^M491!WUuU5@mjc3o)}?fSvtsMC z?9_bZzeS^D40I zjVb}v=7{TC=%~L$#>&Y64-NoDHwWD2K zD*P_z#E5b@(9mETjiZvDdLcWia-q1e@Y7Oogf?7w^+e!(`6I8`zIck57T5%__!`|o zF7-d#{BN#+H_X-V-97!=D}YH~KzaCdc7w%m+aHUz!QqKmQ`b4VBUA0H-E`OBE)Y5O zGEiNpg|MN-*9vcj-eu`yhYf?8IbG|*Q&h}f(TNeQ?J?JC#8V`(_5@0grSpcyNs%Ki zItbPJ5;}9%cbL-m@xL28*8PmT7PCR6`;z16{RzOZS4R2>ra$NGfgKG`}q zmf)XZ*=t&vT(!(`VV}P@wka&vG4y4@@Vq9$TZlw$_m2`g{+-{ah~J9YqfMIpSF4?h-r`G~o>Z|Y8LK-kFTYkes!i5C%1*Kq;~VITvR49aY*mc}v8Iao!@uUGG4@DrlU&zqk1{ahmg{FxLNa#%0ACTEQ8|QWssrnt#aiGZHWa%EH=!Hsx02ma@X5B_1u?hcrg9#=GJ7 zoR@ndz0+xH5*NuM=TJ0kgWcQCpd(s_5;dw(e)tCmn{ z_U995Bzis&>5(GKK0?9VZA-KH^=L5TE}K;BI4gPMDMj=?1Ou%vdTXQi9rty{WZgzP zd64A=H7QVqA1FoA@@?hmHz+Ep0WA&D*kXJE?B(of845M-fr(M`U``}>FbXdwiXtd| zaDM|RcH5$|@$K{Y8KQoiy85evh!NZKXj8!d>3J|Bpr|CmNEjrv;VfbL$bFyBNfN`I zqiCqiz5wpwy~spwwSn(_U!myxc6FJx4M3#c8MPIA#qAv9zGSPsrnx?mvy46e!e>se zckpsw0{YY$VOyo}U9*-Zh5U%E{dNDL+^s;EWz3GoBiiJg3)o_EI6wRg+;~{%lgby} z+EKgMlkz8VYHPV7m72dUuv?poZ6|yvW}4xL6i&y{#O-%h#(=`YxljT>(`2 za#8e3W5u zYP)ZyJV5@W`Nk)+34!T8m5@vJ0BsR3bpR?H)?wqHV_#Id=-EMAV8EsY^tiR*!|Q0z zivYsrKz*P0hXhW?fzI^@${VlWBDBT;!SZs3`DraEM+=W0T#Ce_?zQrYbPrJ}o^^G$ z+I3-HJ7{2tyM2Qf+q_h$FM#1 zPYo&vy#K?Pziz{5r;8r{ko{TG0=uk4%A#)AYz)FEQ6<+X*Enn{<^K z%FsKkMr68rw&J`u1#t7O#~I}#I))?3VJ|nUO8QDm4jlS-tftkI=}@Pf37qnlCp!sQ zYX3u22ONC^X+IkGpoJc@n<9v~POCeyW!2SM&NeNjC(BiRB*uYIsbK+8AG7-mDkUiS z(uo2MFF#sM#O}OdtckiEb+XB~Mula+J$uuhrbZt5KA=R()_hO%>H8QP7&$?q(DO=E zz+`4i)gX2fs~s)+dx=eAZBh5uAa>12#u#W8O)74yIdjx9H}d2a`h>|n7PBKbniE|E zJ@<#LHZ(kInvXCpa*RJWrjPJ)(=bHE6cWrBn?54wCxVy(X0m4zPNWwhY`-^wkLime z59Q##&!W<#p!?onnSBjKH{vr!=QgO{+HHZ`x{$|f4!;mpAx?RzyS@;6CC1j0 z)Wd22Ncqp59`r7wkDdqFzlkB!s@>b(oVu}t&(|5>BG{yOpnefH+Zfa8e=E{`gg^{yA&+c9z{pHiG8QM+Dmpr?V^4xej8!38wcF-btF5X0u@kl6p0pe4tt#(Z4{A)E8B)8_zs^bF;Uf%#moX*Q z@nvxTFB_^o;BN)jz;)|Y#e6mGZg~Pe8}`-#V0A=9E7-DBi1*^=S{|w0C7~|4^?G(2 zbP^-o-Q^;2oIx$|!n}g!@siYG8c}Q6gGJp}Y8{MmE>2J0-5Pus6JN~7gXnnY!p1XV zevFd85Me9x1!2Xjd`{=|>Xj@SvB+J3KI*$$MIv?p7Hem- zKm15tl;Ptypu?A^BZOD5e}?DS-1#nH;@c;ZdDm9klGfWLdXZ0^W%t9Z7$3!r0G1~x#=M56xNHM?pU_d3>Z`>J!+A9zY<@)kG@At2 z@hR`~p_Ea9QI*KgZ=V64TY3!nEk0XfKEm%{>$7cb(Vo)UC$2NBwqf?}}#qnk@2 z0&MNyNA_DZzI@C0Agk>J>a8}3nKmcDNNVHQFhx&*0^rF0pj@s!1DhyAajP}xQk8rM z*^e1jRC=UX-o{Cpjy}ohHRMCL5zzm4*GzX&`ayziWx3y^RBs~-ap~s%{?dSSp`FgN zU=s8-&8w{}pzi&ZHExc`Zf=H@Dj;#&5KSetWf)1}pl2_doIYA-C>se!4M;Ftt{iMj67mlYV>7BtBXzP>Zpi)o`fCt0TOc%y|@6K<*sV(I~;c601 zt;P;Ttyfu{f*g{~uzEJV(VJM&ehM{V*g+ZvwBr$=aMs~O;>uAjpMgO92m*LyANZH z!9Dsx9CS3zN2jJNA25`50Anvms#ruB`%~Nlpgx|JUz?$-@f?cAD1#Y#gBXS`=Lh+h z7f%C-UtF+!2=A-GZJPzbX$wMn0ZVtIb`)*ee=tAhB&96n(yh49d)v9y5t(9a7S0V~ zV5wO@j6v4I8Bm^-oXps|2y0II0k~+tqT?Tz^F=ifYrC7IH>?B5NI^tIdg;ESiWP%E zc@Xnsn+q_tpuEtQ`)f^xP5xIvbQ(F2ikGodVgYL7CPjppoPlPfm3GW8@N`E2C)q**@vq;Jv#O~Dnj(72i1Ph|do8k9< zv^d z^1%(%TfcWi;t#W%{X1ipjiN)c2oik>4A4F2hh`)4cs?<`X*#6&4o zB)ZB*lrDnN9!WTsMeroQs;*GESS7_#VyYJctt^(V#WR-AM8>C~+35x&pb=A)|D>52 zJ1jeMVqCG|mrwQ?W4%QUPptz`a8R)JMk&1*U2F+0!=AB-ey=UN6X9>(gDNphNFc{S z&T^3q3_t)}a~V6ASd&2H?ib09P9aLFk8AHmmb2IL2TKDWnQslSiuKmshw1bqOry%* zGTc?$)HV!jI%^8-iX617h4QNAM5;ed4Q-4oH>bM9nq6N}w*s>mrEh*EF;}BVz%LQv zPA``Ntl}YEP;(rv_cD()yh*M7ZY$0wm6(f}oNb#-_t^a`kh41OUEK2~26=Jz zfO8(_2byO?%V*2I_CC&i?j~TYgWz`oi5{0`*+`uHkvEOd_dU~aPpomX8my$j&`QFn@y&ELvWR+M@Qo+iU3Ffyjr(ZG!WcN? z8qKu{_7&E4lhM)pkvcDfu28xw2I8VlMdc0X_+{m^$Eb}@iB>yGik~50qUfj)TpM0t zKYH0;r&3C|AQkGv2GUnfU(I(sRK}%o#lF z5;zXrw7IL+N1$*sR#xrNtk}&(SgJ8CEOAfIJsWBqIfyTRV9XOOb~K{ybM15r#LbF2 z#W)J20MI#W$W{{EVTE?}NUVWbkfP+5!{@G!NpZ%z-vUke<99Fi z<+zJ1Yk&I4+ythY|vpH_O*4^ZT>Qg z*Vn&lL3Ctr>XT-xG@S)J0Qb?zzgR?E{Z#AgrJMF{_s7Z`P6$q>4%ai@HD4R6KfY?L zZ%1vNA*w5Zf5PKNdS|WQ?I4+`CDn8a$NwO8CV!CXrV8s}?VvJerU@6Q{KXA^ixXab zk~sBS-qqyZPtV{-u6E6JCurI565jCk$?0?WxXK^(OlKfl^n3i67Oj!tJrBaZ;^*^1 zltkYHo;3GgT4KNHo)#U0WvW?70BC9NNoW2bZprLOOCxM6@#HJ?;?9zWnvlIGk{wTA z>M<93R;nuQER?*`my-s0h#C-vl0LR3mzc~tVr!P-eBVAF=%ZffUFqb zx8hd63J%`lNB<7#{lF8evzZ%mpBYVa#%T1^B(p&|JS&6np;DSn$d}wNZlG4-(~Er5 z0wy0!x<;V7Rn)0l+r9 zM!n>2^gwB!o0D5ud^Iq5-C+QO#FmY=-dsY#rPx|V%v(Cnr-zroO~vTiqbBSK>Z@)) zdEQe}RtE|kMusU>D>*2yfpE3Sr{E_9%IlvASXHDMAhy4_Y5Ic9-ITq5d=&j!xMnGJ z@S&o*|HEZ)fFKPIA7mrSSY&?nKK;3dDz=+$6HoEM0;0eOSdgMf)oUj3lcLuudU|xD z+gCfj^*<_a&2_K8!dKy;bTWg6qVIZ?1A)UzUb|drD6Z4zF%(F(z|h*>U3Iaf+G>2U zRVAiQ7!U~zzZjf?fT_%(U;&I`nQ1Eez31H)l1P9Rp6HKi0hNPFoo3RO*Uw z7}*5aC{?gJgTBVmgyO4Rm%WP0+QJ;eZ_>-jW4l)d&)z?Nd-Ue2HaYJcgU4qLYp{X0 zrgdpU>U|jemODMBoob!#Ev{RO0mh3h-;L=w6MI<3$TE_qn1I=Fc0TG#`qLea6TA(c zo5;8-cJYBq+KIIb*RH9qZD}u{D5z06Ux9p8+3d67Wa=aua$C1dhDh}vMZne{g?U*? zO0ew!(E-Pr8r3xrw^V1CXY9czA}#CvN)%kxDJ-~=*`3~ZTMGr|JlT6qbRo}@ zcp~2`^U#Ptd-kaba5pkl4R&GLc}XYUBad~-HkNErO+%r54D6PoBL{&A)VQ9IsR*Ho zoTDg&SB5K4vM77n--e|-W92JCxE#io+|N%jxED=lafjk`cb|Nbh2kel2BpxPe)qBj zblpbJyH@VqEsz=RxY>xr*xr&pE8E}#T&axzZb=)<8+v&wNTC54z91g13TxEx$AR8NcRi@N*NEFYd%=qv# z`C9eDg#!p7y?q0eE16%T2r*%w)U!og&Won@l9Y z-Q^TY8P}La6ziNCr*bJ0?S^2g>!GGzy$m$LIQf2Crydu3t;A*bIQS57o!f33GZz4! z$hzqwU=f7x>siF83auG_Vck#Iv`X-uQ8pe-JO+|!mXoCCc&H(Bcerz(+_o317^y5q zg-|gLq}4*}RdeETCZ|4^s7PxIRJlE*vDWs0nu*ok%mkunO1I~<-GV?yQ27{F&R(p6?FX|J@fz@T)ftWdzf{H8hcx-R%;ri zQx}tOg&q`GR!^dzr)%Q2rY{!9nbOBw5NxdMHU>+Az zYA}Cn50?8xb)Hw}b+w0k6FTk-i7~e@cmlogE1}w1v^(|6JWu*}z<2?=FbDS}Rx6}S z;;c#DBacpGOnM!VtrsLt*I5DjloX0ttoyOc1Hcgu)x|$?>YR9Tt~6_W5La1~X}hi3 z{$pj-!q`2@ZcTG_B4-7=$#NSjXDzYeE6wOvYF5-eD|m$#C0H+Wcw_sQ19iqrj$47O z`%;jXNnS;)2CRk$tiS0NT5Cq^`N{K>LR5Er)4vsEI=Q@4U#hx!@ki=qA9LJ1eCBgR z;UpAAd?XXjEs3*y0>TD*A_}^zkX;?TL9ZeFi|)&+`ooVCEham)}fGSg9o+SO%w{WuG;CMpGh3vuu-__@}DW2O7k}- zsa)GEM$5Q~V)84V2i)Kxm{t1B+??tT10xEZeIx;UM-q_{co!w}bCA_~2sFKLu2^0f zh!6w{o_8R+mD`I&TnH6tKYpUQrg&Nbj5M|CnIatHGpK-)B{l_ioNYMQALp!Wy3S$6w1Gi77pQndU8vRGH zzc5=(EdNia5T$sb{T}NBfXy&rKdZKkp&@6G|Fg+@BtE{5?BI+Qak`(u;J* ze$LtHw4QT63%&lb7lOa+#c*n7-}BM+ugd|14{5!p>av-4wyBhS=dF(;^vB-4=UZfI zz;X_zaXx|;1FzknPlDJ?5#5Qnf}3Yg?We_=7=Z}O2B4|Q>tjz4?<0FzoW97yN{i!o z2{8q6u`Mk~Ps=|KI$OuMt}!p9+O~f+;nffER;O^`zM5)(c&uis6oO*>cnlVDJ&*IN zWZ%RWKa!+8)@S*NeU=<|z7{K-_vdA}nc>`%ZTD|g%vE_vUW|X298CS1GRgir?zf># zlj+r&6lZ{@xM|KO_SmQ(Mdg zSf8|~o8|aCUxde>1{$~7utE^ecccSJtLhN_xsVLlHd8ehbkpAH>&RW(LQjQzR*3z*{twVNbIcW!xVIX3-TC@*GM6A%a@pdBv8?u3BtCO7VE| zHP!=;a+_%3yGBVJRdWesH1Po!&)1q>FMzRXcRWHjLOP4<#vVQPb$Ds&aRtKkyX#)U z1WB=t_nvsnNsVUEu7_*&B_2y^o;3O_i%0Qi+LVLVNu`?TQml)pIn83nA>BCXOqp*B zPSx+58+CErgLfoHR)h*X>31nX>Ab=Ub*D*tNOaKn^VH-|1K8}|MU?z*xZ{LX_R*Dn zoT(1p-V`ETRfYU|tL5t*#d|N_c}E*Hd+7*OC4R{rQEvwK*q~1c2-94+1E<=x&W7B= zC@}e@Ax4%T9p$51d_gq5M)VjZ1E2hRS}nv|N6h5i$%SP3tE-@9pE}IxwK}Rj0Da0> zp*m!`w=t-r^zWz`-f|ZhG+=f%^?2+ZK`e>C7J7d`VaeG+eK2#;Onm|3jM<2ZD$^oO zOfyGRDYROw+~xg7>ygLxdP7<9Damdk0R&>&*x7AY2|^b!zG*Q&esPA6B97E1x70)B z)CgWAvbB7u*f&^0>UpeXesaTgnip*7;^?&S=*eMWw@fImmCL*LPX^zQ6{PunOtH`+YDbGBF*>GIBQMs z;%GDcv;$}Xb3k^;;E!52)3iIiA`#=g2{fBC*KfC+-l9-@s3$-&)Gq3YzBx1H3etOj z`=%hb!j=eM!g@{c)AWt$z8hxWUZLvxhUO81Q}2uq8LzleSXMPfsdBp@fpoX94KFtA zp9UXT7RP=P9yx?%)3ddZbFNd#p736C8t>s%0vWIGAUOPm3)TgHU|bEtpSL1gGg!A2 z{P3;~3Gt4mTBP$(RaZCD*8NDYN40PdJzZ&v)GswIPRN_p0T&49)ge)-YxV0xCL8H} zz54m6hhxME_g|+qXXYEu=slX!b+j*4iTvsSa0a0)?-&mE0MyN8--$I2AnK>>>aUL9 zS;9L!&|vGb)n^j-DuW-Oktxp)12i&ppWw@{W7Pq z6Cvm_6KH87VL$tQaObP(Tir^L>xhFLLBg`c z&+w}cWGr<`)4VA>OE{Q>GoG6fPh%*Trwcou=)L*Zvb!JTAtB~&qUaN);VJ{!Z?aY% zi5UZ|o$r=1C1&c&@GwS_bUrY|)ttXvyZD_Uzg7DpCt>N#0u)Fuka-2u-q9%po$RPu z{?k&J-*@&M?U-kR>^OfG_rpoipe?(MEVVLmHv5Bw7IM(m%?W`1_ys1-y-*72!@$gu z?hAadOd9rAH=u_F(}Os0Ia-e%=^$6V!bN%Jw7T@5$_{*Rr-j z>9(A?c?Au9IAx`g(fRG)O^js{bY|>cmRZree|~xJ8Gp4oycwY#B6rvnJahOt7}b|) zbL6r2k4A1GGQS7TL4O$18T}8-ON)g5sn+}1%i@sKPLD-PCzt#vyRU-J^p^w7)msfK-PnG4WYk( z^7q%1KxcWb))9kur=;E4qd-db3}24kq%XepTa+KOb}1CQOrm8e@BC!VF2xlcF-*_` zlQiy8l=X*bk6_`l*9Z|k8~wruXRmWbMA?~@hX1hxrjXe$-Qq(*jlKSVwu7G9F*%&C zWq+>(%o$s=C!hhh4Tfeop3L~xCrNo%qb73GN?>KSztK+z15&1Gfv#kn#i@j>-}!-r z!ArIGf7wg}CZmj5KW0F0+JAPLC~lysFY*;hDj(w3Y6sD}UBOwU7W?Mqk8$Pb3yU0w zaph9W9$u(Uq*rQudGH=8rGHUi?5Plqc#Y3o?xo*DzOT-Vx5S)QRxnDp$Uu;Al*u1d za{sAoStvbfnf$B5Z`gJ29Sg)io7??+-Q*)1@Hh)*0Xs&z3QY4L6c`1Kwsll#(to0K zU|7NL{NB+R@*eE3W*9FeF^um8{};SxjQ`OdgB5$4%@S+2A>=um2o>QBCikJ99D@j+ z19vMav4PV5th{WN$0_pIgA7d~9Pn#~qS}Qdd-^>&ShsMIjH2O_bHy;3u1nl!R&^vn zrBda&eFxFZdlV5-PxP|>IDWT6Zft+7p;o1sq6z)$JYb;b7nHueKmlz)U5{EA!1m-B zjexSnc4{D@6DSMtP>on-x|5@=_tku__y`{Tk7xF;3ce8rcgA;*RQZoSpNu6YI$CyH z^In)DI!ROH3Wkyokt~w!M#P$fJa(ecO{X|xm z1T!VFhE8eJ3HEQYNGarHE=h4~r;XRGvmL&hF073(B0DRIT7H1~yaW}<><^CDe8zuo zL9#F8E?~RbfoQ=MReCW5jRV?27@i~;Znq8UfA4%zBvw=xINA4xW1A6i>a|Poo8Z6y zJya$IatXHYk9)YH8eF6x-n7l`%k+NLy#CK0{oT*>XMp+Xb~pvY!iH;3wJqp|gWtdy z&S4LgWMRMcl7mZ(wL%)rst_vjtDKNWNF0`HyrLSx-MubD=-_+uRDo#{MkL$0b`XpS z`|-2KlX3V*%_5Ej;WADddidDj!yXD@I$RvSZtG;FTw?eS3;DNh>VLlQ$CZN>+v73Q zFkQ0mutD8rrgI^Z=E)uDm?=SrOp7qvNtSSC*wz&Ato9G55rrk(dKp2m+$_0IGV6_; zj!FuQ>W2gtL8$@{Yamuh%v>!nCc-tFV-f6@(reY0T`H-%2n2C{1M-iP%>bE=`yt*R zB-0E3&m;J^q09V-X`t3GhRnYK8_z%5M{ZaVQ;SFnDG7ZgbK~u_FEaj?pUf^A9CF4$ zqjFFX5u1t0H2gpfhKq&fMcX^34P~%TWuXnWl2Z|^77~QA|HDK5w;e`f{Oj3c z@X%_6;y5vHD*-4{s2B_jYhI1{3T97$nHqb^lmY8i>43xV%14?TMs?;_nUKNS-0yF? ze)i-0{}-r-8nz1WS}XVY zw8DN+{PCzkz_L5V`ygn~$Nu-n`ftDS?|df%o0R(zfhda#Kqu}9l{WY??U&&L;Uwwz z5|l;u#n&j}@qb3L5xYAPpEr(oU>HEW#Vp()hS4jZ@XpFU9xi3E6xCoT;S@E(f9ySB zxT7F9B!5HpLrX9wX{S`-%DNl_3q*3ITQE|pzYecN45xTDZ!Kb%`=jzl-Qwu96N9_c#a?&3pN9H zt+h83se3?Fr2k&57inATYS(%)DAb~KpQ@Ndi_x|t=s4C_yqdT-v75n z{^vI_B!3ujNuXF%Kuplaf8pB@RLtRSbj6lkTUv z-^>GZYcUz31I2itDk!(d37O?qHtT=lpB(r{knsO;v6pY7!)C_EMbEG^Xk#y=k*_2) zahU0#Zs;X!M^MsQOm{QnEvBGMbsQ}X7^eU5LhTKP0!5kIh_unK`!Wz&?<0`oh0BlxNDR^kMY}O$ zKH!J$6TGD;A;7KOBKt`HjuTCBztvP6c)&VoUCr{h+j zR;k8|^ex%nQGTRth<&&W4=3}{0CVAo%hgC3tE=yot43Xds}aOD51(P~7N*6iFOg+z z{$nZ)Q0QuD)T-9-Sc6f@x9Z!+f&`qm{_Si0w-?n+(D3Ae<25GvwgC-&5!iy;U?j0W zhZd6UQjSCe2GOtHzl~W0AAED)Tb+4ON(NnaMp>xoR8fW9_u7rG^DX~VA=ZLmhWzIS z<(M5JFPP}5lse#vZG2{0w`(rh;q1}=LE{VPa777>+%eeEZPHMgb-ouMR@B;ucHu3; zpojp1<=T!n@CxQxPEWrmlTL#Z%~;*74?^X4bT$q2UN$~t1QAO^W!QuSrEUm6@jqXH zNiMZGjom`$kI;-fwd2|Aru(xZT9nrnjT!K^$%hRJ7TIa$;zJ* zh_EIR`-j1A%+OeGwLId~w zHem&lG5_NR{?}U=Lqa3&C5n2t)a=QjtIc<|d!C_vXpaf(q6_GG1d7YpBjZ-&MC1vaW$M&zy7rNw@y|oF?Zj1WOSNt*iRNq%B{O606At>f zq+_PZ5Wbb8SE>w$3MibyLk-1(I#f2mxxdQcmnLizZi)`(cm(BYYwlUzg6TIi8>Be5 z2Po^V-#k~$^w6?qwb7}z{#h=UD|8UrkRfwphS_=}Lk|xR{?GMKK<;nRjFijgo4B`- z^))ZHWnzOZ*y!^o`trO8lZhIQ`nbm`88<1}(Erb6aFKzH3#Whh$~dQ;0lTC9Ig$h$@|xYo$Ww+NYzfimKNyF{kDR6$HlGNj4~ydeoD41W=3$2|%G1zcHN(T)jrC5U$d z8>6~JGyySFcy0j0_EKAReEIExP4|s-gFXwZm^-XX43!tvm1F8+8^n)y@m*gU?SGcN zGSK0Q5`LZt>3NK~tC|+_V}xaP_Mh+9;6Mza_Mi7jOIrCCazxLCT5K(?R zSN*{KZjQclD>l6HvD`$mt^%fzfBx}b5BPuC2Nk;6LilsFul|e#Ei@EzOX{^4cO2Vq zxpUaV$tXJ_32m6LaN#c=D#EYXOJpEg{Lp#apX`+Q=A#x6S)B?)9vc>MR{T!9@?U^*c$l_a7A4`1*x5d}l9(hHBM zL*cmufWOmFC*rzZQAol$dgz9mESyMMmN3HUqPN@sZFgM(;H7NOnqb||3YJ@&%=rc zAE7t$gHc;unDpp;B&6TtOT4bSgMQs(OT~W-?thFdG%y2HA7OlblQpOJ0FMM6QS2rG zhgi@ZoMQCJgyz3atwLtI^uXgs*Hk8um6j*iUu0634ItRhel+M-Dj`;YXx7}7N=xY|?;s_LaeesNN9!oOdTTnKZ0k7hp6K19y8S^9v1XkZ z{p4BtIE6%=XBE#M`#%1#JQ7_lHxk6h$V(1w5DuaeCHJErMbcl+;`{w9uy*dOP~f8{26Cx$Ocp*>AW9WHH@Nlq1mE9Q7nJ}iEEJtO9;t* zS)r3wbAPbZT<>0tPFU9u4)@08Jonvsri#b!0!g)7gQwDi=#XCMb2xG^QH~xZ4>cH0 zulu&XiJe7S#=}~yJ0%@40h=BC9kb6$q4yyB)*793D?&?*6%|#pBZ+NCV;mLNirTIm zI(m2dPK?TarhA~Z30-*iV%yswg<7c290v)n&dXP9)Y9rkEEF-9vC(Pk2%YbfM*ieM zhha#v*{u!Q0KuhgPzO@|O7XX&;w55&3ZZxUq*j29o8-!4m#Svl^2-_s6PNT+ zD4knlTRED;r~|(3g?V9Hahr$23wmn0TQ15$*BHkHl zc(PS&tFz<0Zr68c>9K*o59~2V2EhnK8E_wGr1ls>J7kry(a}03h)rvdI!@3Ag^3`7 zH0-z)@|L!2nvSwmFDdUpN|P7uYrjs``#rD&|t=qPx7mzblNmncpZC_%;Vh~-nhqB_1bZ9qmEnAbq|B|xa13h7>E-zFn1%;ZmY2` zHdDWpI%|J*{L)c3{s}WS%Tr$EKM(K$FZx_sy~i<;^ATmas$8Y&gYl=@)Oclm!VIfo zw2Jc#AC^Dsc;yT#K0J#~5C|aRUsV516l{7cw66Hhp{{}SVhevpp)r-}zSk|E|1);q zt&vMDwalteXTovULY|OjII>`eMF{LcgWQw}sFKtru!GH8+Z?$f1otG`io8KM%(zRI^Js`2p#7DVV^88UDMAknc{gtlz`~d&aZA^7( zdA!p84!A!7=4Yq`UT%A85C!QVmm5K8o$QmXdKe_^A?q9A3v4UF9OfOVxlXObyBZ{_ zhL!I1mTybJ*oi4$^c4b- z#|SCM5fZ6)DRNKIp$(Nm6T)aR2r~#tpu9iF1xOrGk$opZ<_KxhNwv?+^hT!RJP}?|4K(ssz^}KN_)tPWZi8{LRc@ zp5Q&+BqB2JSVTVE$e?~++XjjELZwP5RKQ>L4r+va_^5~Ov-kaaM zIb=cveD!g0Vu=;K^n<7MT_@@KmF^_b=;1UEU8JlOGtjuYrz(moQN`}>rO%FZB)b`~huE7YHbw(@Dk zMBp;=a$t7NglI;z`G_+XgV~!^fYrerCw;z}ZU-1L@7A<}T2e_kdYJw+a`#(kza2~_ z^q$s{>9-3JCWaA_c3DDfl0r3vU&1DYvy|w6QbZ4bX@0|c^+uwneZ`$VSMqX&8dIs= zsbzq|wal1Z<)EB~Da}6CkVaL2xC_Y>|LiewN}u{a+06g64a<(0T1j~b>Q2T9*+?B|$HkuRIa(;yz`XI0G^)tMUnJx}M7G zx5V8PaEkD(#)@?eFV;VU21B#uQ`^Oo45#00tvWXG3sLXe?m#A9% zJVxQ`)08px`Rj3EiY0Gxd`+^ePLs|1)N@S3BkUkQ_^f37xQl|ALJa-XT4OSV(B?O7 z-R3hMXO!5_%Tq8d{5#NWXm`0IYo>uqw)|%T*HH7uPpb0`jz`j`J{9`&tAqN*_6T&L zI4RpC{8+0e!fB>MPu+j`Fa*{Wrf4V(QBXho){j6erJQfl(-##}%0wKi2H4Tf%QLuA zzFRjEqDqUHu}I~>-bFZ%$hRTF`q-7p244F7kD=Y4kq)SQ@G#w=&hG6~cuIX#q4hPG zDoml~GAA1rbnt)#_;*YmxGVubIAT5j zg(sIi_R;a+w%~o*akKKzUe?UxPU2C4hl;#V?#GBJAMy;sK*RyQtPf zC51V?l3^Q-XA6R7uqUCfQ~ELE*JVSF%F?`(O>7oF(9+tx;iq3;S1=-Yrf4X-9&$dR zoBeI{WMTFzRbRGC4W_tYX1hzpbjKU+gxXqC1>>BRt%EF1rMma&S=>n`-z!{$L+jWh z5@rd)8v2PFgn9F(`aLb*M1b~24xe_xUmm896LU9*Q5O=eIIei!Wc?`YCdPGT1Q!(} z1~rmdeF#|fVDFuEUE6^-tON1JtM}v%VD97X<~m-dV~XXPyU(;JlW;F5U~z2B3|#l$ z=+n{7$a>=o<}T#kfagIG`h3wUy#jwlmH*~<{&{ggfZpgvX`ArA_8tiry1N1{Jhu`i zDnwxH*A{ex^nOdTqnY`f2%pJq)Xmxwdn04|jYm{~)`c}G|NWUUf1}rJO)6CnZW~Rj zrj!I3zDRrUD*&InKrWMy@^vKC1tcK=_?YYfL^yLi*E`=#Eg-I&CC^$g8n@rtiT`}S zd6BDUgK?I_l$lKJ2u~e94NdJ^d zh+sa~Cv~^)V$AnG-6wsvPrkWtov%LVI80ELT9KcL zo?-XBB(ay9TS2MAto9y$gigPTYdmNV!#Izr7ZTqQ`JP#mAc#3l6){8J-lz*6E=`ja z)3ap8z8OMo`1er>_nT3SrCYoT^pPFy6uRv*WST*bZ@Zv59y`H$UzjOaHDnpXro&=^ z>KOiGF^a>E9ht3e5F8P#Q`#$A1l_ul$E5WT{<=#2N!L`6`>o4U6GBZc{RhbIcmHQy z&z%r$T-H`gO6#Y#CN_1>C2m-IjC)OXYL_9B*gv2Wc=N>Ditsz4>~svz>E2|_C?4kg zG-~~l$7t#$=hc-Fo;Km}$+OXn^BYT?K`+oeeK+ML`*8ilLoHN{NYdqv=c>QqFLT7y zMv_93)im|Xf{t60`PiofLce;Pk!+Y@lDc8=WExC$xO0!WhJ+TubU-+%1zk`$&ElkI zH1W%3e+Sad+Gmqrl(E;A_sK@NxJ|-C)y}@H8K^;;5^X-LJs=qJvhQn0cx=0-mGf5XE)PIh_&ptTsa<|$-{R&nL1nJiz@LN(Q-aX}}5;Y)UYJ?)+yG74!gs68Jk z`V%waGVtIR;4P`Y2HGy)QOwexH%APH?;q9zz_Il&KoT+3YoWVU(4I7N`Mk1=BY)Km zpv?on&j#QJnO?fo2Hq_PfV`@kLgNjEKn8Rh0C1hho;XJ&3EISY0)lF3;uQ@ke8?R)u)K&gCKPF(CX`mcd6eNH#V3j*isDgIx-ke`mH{1_Q{3HZed(Ko#NGT ztH~FlWR1b49E<~r**_(Ze_YN#=~IJ5(2dOxLbP99o65p2Tcq-m0|w1oS}>5&eiLEv zYZ1Oq#B@-`r{Rbe*tkW+i`ekAfQIe7`GhB$BDYAIth~Z9EvuK}Oxk-BO57d`{TPo? zm)g8OL)iSfe=;-g`L<%R%zRug>NYhnXn{#P*=gL0NkxLDJ=3skm>a=cW(F4QqkSso zMaGhw`QBqMTg1M^W2L}h5kGz*itQZFyjpl@=lcZ}+3BhF(xUs3qtfG>Dz7|aFZk&V zs-Yp*kMl46Olx?B(5p1GO{|T6a@;z8<(D)uYJ2l7!)T`qS~c;@!&QX^_lXUS5$O#6 zT3MR-&c#Q3wn`y#PZc2@V~u6Dijt*CZ4j^Jdnt|pouIdHp7RY5@~Z5Cj@d-kExy(3 zi=Eeijf0p3vcyw>d_E6EV;U~k)P0@k&pH5}?)8)==SJK(*yUfsb$d5iFu6)Q7;PWJ zr_KQXVF&csbx#1fr}F(tl0Qxin7BFoQxEV011=hHq*ASVw#?}-5)7R>SthHo?yLha zcfbV@)%mIOoN|?#KR_c0-zkvb5P*MMuK*DH6&Q{d@c$6@mO*i~ZI?Dd8*kj9aR^Ru zZybUKhu}o;;7$S!0fG|<1a~J$a0?bBNN{&|cl~zX^FH&<)Vy=gpH%TDP}RGyeO~Ka z>sUGy#{isJ&sm2<3m<|=#su%?Her9-{;L@`34p=(TY>LFWBmApu5kY}@K7!Qj=nc_ z0HmBPiaCM{NTf^j*yh{NRXO$7wsZXfEC#*P+@P{a;le*Ytxfv(6z}Pg$eu-izl`hh>WsA5T9r@Lzp(jS5_*4{uOp-U+>4~s3 z)~N{${MoWQNEVq+b7Cz0$mgU^^=uc%*F?<;|CzcmuYc~fjzwCI&~ zEV-C)&qI%pHRNk(+9w_7*k}-3s5POm*0paF17O+6evJ(hdRJ+G-013SZ$$@M@?{ZEyR`QjD8x!-R+ zOFOEEqgQtgih$tyvFv$VVsq}d79gfx4=_PBhIot%zb&yo!L>(E>i$kHOKZcu8 zZoC&$Vwmw!cr~_r=CmS_5rw&1Bd~?F2_F={A-K<5JKQ7)5OP6n(a658;>nt`J#0z7 zZTL9vCnq;s7`bNOWZ{?ax(gPmCj*uqkT+sR^IBCG;}aoqqM0}YmivwSoNpddf<%&oVw2g==r`N_ zxY=2zMiH=FT*iEBOpDpA)32Ziif6vIs&m~7WTM-+&pd(CF4O z0xGtJu0joS7cKPdV1BQQu;+fIRgoyvwG1Dl?o~?!NN(F`1S!ndNCe6KwTdXv?64|h zV|Zuen4EqIpWI}%%zrgnX||kuKi%EYalK6<7m1ho_umIn)<}f?RDowdt(A2vK6+EI z?B`TOl2@XwXWZDD1P+L5$f5Ff#9Xnjhe35{Cd+5^bwFeUPhMWx8YV)lDIXt$=Zi}m zcZt2)d6|xbf}^)WiGu>SC1*pL)>#1eWQc(*R9kMnB@b&H8_5T!FOl zK0Pmox&*Nx2Wo8Su$+;{pR*-cDMo~4Jxohv36rNy|JOTv|5ATmz{k7dr=AF{+pAG^ z2-0twlkTd_Xq!8A`>SES?TThh4Zl%j`N`_U-~D;hna=*d`MV9Xxl2j0{crxm0x03E z?n0Wh37?{KbWuMzIuP(KZJNN8JdLdNjnIk>_MMLos~oMVxwzy-8PWD1-;zWA3`1xo z8ZTTioAKa+o5tXY*Ks7wRhrx35F5XJpzyMW&jI6@6rP{7@mKp$r1K4VH-Hqd4B$5E zHLnsmY^8a)1Mm#9GIBBE2Ow8gxM6_Uvqj9p_pW8ZN3%=A-&gy4{q zvhSbYrMZ3cS)*9e@84q{v2_4`3&0kAdUOo=0Q?&Fr<;tYnN1~77julAv!jUWEo$W( z0KVV~CshCyypNj#v+wDNJ_4z#SJ4tXuPZo@t#!qyhsJ^5MmnWyK1gRzSR- z{C~Jguk?UOo1wtw2OtGd51((9BMgB_ROcOl%B<1HU5s6R!_xA(#T`Ia9i12QQ>+0D z-%-moHJ~R{oDLiLCons|a(lLzpa!^w1j-dUw>!Jx3!t{l$&tK5G(tqvf8lBfu@0@4WF2f%bV6vZ=|1Qr_Ju1T?hzAQmmJf7$n z3SWx!Xk%az+6=V*F{}c5Vegkn)z`?qg^$U&it5?|xjvMX-^dH6Jy7=B>aBCwwuv5krOw9NBfZI!224DE)S9u=jj ze8#nfN^sh1&>a(xJzYtpk-=5r2UtJ1Dw5edPvqP7r(OMFv`CpF74^VFSH%*0iRt^6 zG>LPH7E~pXUD9muFs4BtlfjJ6&*=VSZ^eh%Vn5@vKx3*)?}x9aijUCrx|zLbPySz8 zeeT*0a4PYq5`fYyjK^z|Q#cz@71u`C5rS&XZo>Mr;dGOMU zsApWSfG??uiV<>Ed&(&AG_S(@%lapQo7K38RUmv$00mT(fS`{Ejud)+^*!CAiqJ-$ zw$E(>RiPo+!EvxSPeq@)oZ1^ONkgLnwx5|+Ky^f>rOhv}@?%H0G*Yh9O;B_}#;Md1 zm)JV}XWW~gXnsK>CDHbr#e)I%gz>V)6dhkE*9EC|k~^ah-pzcc&D=bZ+ChYRHrgl z-b%7Dmm*UXlRU2}$iFmJzYgsJGorM=y-NiL+@F|(9yBe!`7_1qSkao&Ak$8NfMM$& zG-Q3OoSL+2FrmcbkY_>=EzQDSqc_QjdFSpr-fq)56eWfZJD_&UqAw<~$q701YT2>s z7o<9seNj|ym1)+Q_*nXyPJ~+8%GMA`6*B4n`vRqw<#O-K@cxbt%UQ$r6q5d%CG6D&EZjQP6S<)IJ$`Pguob7&x(Zam3GuS4)?n z+g~&8t=N$oP?2+YX^2gc|MD00WCLZZ9c7i>)?RAV4t1>pL& z#rXxN^@_&q87o-h`qnKHHz)cBQUzc~4PcG>Bo@{6&W)yWFc??! z@aa5}eOh0U{1@l2h9H?g(k}3ir8xx_HbDni07n_rfy%I;9W?kQDlY|H5+~?|moM3} zfbiaMk6*C3Nif#a5xW46ISelps=V9&mdg$!o;&xXq9N32&Ze-a1XYU?H7-v+Xzgg5^8&)A)@yJw*SSXawAcB z_Gyy|UCcQSs_SAEPh?t;cwq8GVjnhu_r_6 zoa2+ONRg|eB}G)wr6K67<}BEL#*~uz51F{rej`_u5wO<5Z&(en@1UV~sd)YtRAoLi zVeZbQ4iz(ZHEM2{PU;d`KCSpLl_~tWmR(gv8OPl8hnT5fXrLfEDur7aDnBlS28JKJ zQW5|Ms#hm*raVQyKgm#@yUb! z>+VoV>RLBlsOy3bHJ4}TEpNYtA~Grz!4%tO6w-^`Fjx@^MWg)iX%46z5>dW#e7bb> zX4f$^pLvsLPw(GGF~F2!hhIYFd)$5q=h&$v(m`rJEn7?h*QnASUxUVs3fV>B{ff?c zpyz9}CWSyC!E9=Zl zT(uIm1EAo;be#C~cGGqMU8>9nm@%mP@4~Qr4n9o*{Y$UT_)wx%m+ls?$iw*~B*<~Q z;n@)t9^?)!@6(Dyn)%p~)`r6QkX|SZ6vSSWtB!vA`;TK=>i?os1+WGp?58l~o{$?cN1tHT3A?iIenfPIRQwog!Ewzb zWtWC^gi2rT_m%+PtA(u0VCJrG4U-5h0k!LS@~6CpxE@@7VhP3 zmwdSh>jvZ@sI_@9yPR7d^hT-=rgB=4Z6Ffd)xYnu>wXkk^p@G(#drz%X;!2&JzDZ- z|4VU$D`A`R^0@l5O>|1OYToJIwdUy|FKXl5Bob=F`QeZ54E$8+8c(nwKp$Vb@PpC}UDD>lN zY9Jj$F8mfgS4#qM*4f=nGDcqF3IM6Mz9P-p>j9)8tmh@X`z$Y%S6C(wv%@)yW1Ek0 znZ%T-fWPa@OQk3=M^e9aKVDT}M%7k;h$Z!GxzJRid1H5W`pqLmtUNOnz-%0;P%T(e zxgKN@DDWbuh>Zyu40T}l)t@Wf&PPnailvV-`W;Z4SSEbv4-2?Gt$&l!&G&=iS^N!l zz-M!$LS)E{l^MaaK#er8_R{;@H?7gtl3^tNei~mnLbu;_E67A6N&buXx=mXK;Zo)6 zOfNpIcGEji^BfW70UxwiT+lNgT<93ER~MHUP=p?nTV3i*+n9fp`z5`ok^MQMfOb8! zL(w(a=rsshg27YRchOfiMp`hCN z-M|Opr?t*dii#=J?2s9k3?y^pAjq^siwES45SbTn23VMs?u9W`>;+l{R*?5}W1hYT zuO@twi3;Wqf4N1!D3HF5uWMkxi$8mt!b#fKvwzAnaBwwDwH*@^Y<49mt+}n>*53`H zb^T)%ptkaS_CV&lZedx$CaCK(YX|Z>V@o3>BTGj|G*-nvsdk5>gVW()DdN!z*n!Ec zY+CyrLLBT~`q-rduu{Ak_lQPM8PKMFpB)Nq+XmFh@wHAYE>F}(KyPQ?F*yz-sRtBM zzI?m}K%S>;o^@@~HSv0L1!wi>z5zDWwtFSISu)wOi`LSBW^6cR`q8gUkCO2-{qKG9 zTu0BdzO7$C&q@QZdFX09AniDyin8mhcZbt;o#2hJeCYQp8_X@4xW|g)NBqS#bAal( z02JEIFyZu?_Db#+=FATYF3szvzs1S{KJ;$jQ%>3i1sThMj=7`zskiyZ(XM=50#p$N z$RW4asxS|uaK6XlNV$s=q?wpiJ+7T@Iy>&%fFm?Z+NePkt9DY6Rt%JpV%Hd*7k)~i zo6*`5#!F^q>RZ6Q-$ifHjFe2#J$zM|I0ZWfb~-FTO01iLYe#*d_q=f?<|L;3b5*TZ z%^*$}ZdC{*zjJ`}-&eLo;7|5r>wFaNK(Ge_cO6f?5RPg(l=c@I&Ou4u*nwq4R+%Wl zb>*pyg5Gpa=wJv)7Z zw5WKjWPerl7UIpyqqu+GSX(j0T$rG|5Ak}Vr$*Rtjl%tF8Zo5<=C-5)=o8?;Oz zePE3>wf$U;foB_FGP(ijR^L<=HLO`6#Jm77CaL>-2-=07?%zE{%tL{Z(FLI3Izviw zr+k*~Ogu)Fn17c-Z~YhcOtyxA5pf!g4z9s>;#sNwxG$`Li=%!Awx(nGN8VFS^Q;A_ zul7*SJdfMaY`s+Rb6z*yC)H|G->8ZARw=~lDbM|pB<9VW26@QvZyGEfAl<8 zK0DkHP1;B3sbMv4{7_iX{MD#A7p?RWlS63pn~87ZoY^4be95HI&>-{T=Gb0rPr6ga z{iWRD3G;8Y*`AANpK_1{Wt`KC=ckIwA}5lkK?k*Oe?`*$R-{|w&aQRe?qA!vKzkX%_ow8dJGpM=AV-{9 z1ceILdJWEnWT3U6e}v-7RcZrr5tHT4zV=@g94;EGS0jPVhUHrd76l5%#(SS?x?_WD z1ezLylrb=@=@Dp=S9%mBEy~MjIEeQzaoT zzyail*WDUEHZcQfT~>6cE7KJ~*RlP))V$YL+94oRIyHM;jIBV{sm@JpuHaiAcr$_1 z^{X_K#ZYC1_$(UAgVA+F19U5zCU~8_2hbPz{uE&HW&!|_wNk~CSKsUgtf|R1W}*39 z{wLuM8Ge^VUa5cbM1e-s1pu{`pI&rYWquxe)dx2uXyE~hy2IatKA2BULyRJ>*@oEluF$SnU7sFB#t3^-2WF(_?Sc9kt_JM~+L+K*>J7Pw2H)h^; zB;Kg|m|bNpbt#F>y}wpPot-O(TD{0j!OT4%p_fLEtKWw_Fum#r%pe_~b4E}**98nz zA7g46Wd79{#KeQxuJ(PJ-TdiXK#$f1NI?KLH-m1}NFHl{Af$J8Wd^cx|&`d$Un{dQ&i0BlmrPuzh{;2t7rZ1%s2SX(b9 zXwE@?m0-LZ8F`yJ11W@GNz9vqROdZR(@-^ zzA}D{AjXHC#=F+MwTjJ{ek%ck7c(4vF(5u5UGODS3ESr9pI&g1N>^s2;Nr9~uqv-< zSS>6Bmf}s{rZ{+fF72*>e&AX7ie{nMjh!N>88!q|STzW6N&JVayQU92H>R66D+QS4 zrj<($c%H=4eogQtrw5=Q*;K9bya%XIuDIgoF*=TvYF)GKnB%}zW))Z^G1md_c;Yvr zz=OMRIp=7~F0;vfyFD$82^=&@h@jpz1z*l9JfDg>G(Vs19{CAJ)QYg<6qw?vQmE9( zMwy*FUQan@cMxf=xirQp1MT@&NA{S{?9=;F5(M12^u@GGUo8EJ!_@V7@ToU7)lWx5 ze8TrSCI5`7q6%P4L$oQd)N$el8BaU7uvfV>2l%ZINI13JQkda znvQ6ulqUYPQXDiE`H@^srZUjg8aS3;1Z4^Tdi6+8&AhWBm1Tr%ghm{=Qp;qE&Mw+L z4G*ehXqU@+sG?4A4WRJefHM>epgwf%Z1Nm&%OwWrJj}CWGA8yd<~_KQ>j`dSIbBlM zJafJkOMhA8U>(UJj}?p63wJteTid{#*H!KBnp3fr4pL#V0QXYgoR~sVUjqqk@hzTG z3|Nc@xBCuD8JsG+08k7ytD(05XRBrb;NDW)Nm;?L1wH_cJ4-fRd0o<&9Jz}w=QM*F z<^U~VIHxY=HJs>o3tgPhOEmbK$HVSOH{}4Qfx}6X3&35sNIwaS*Z~k>4&n80jNvQX zw=C`hD!{=493MMKjnQ{^mQ@YIA>O~B7sy$cgT;@A3uckA;Pj_F z_45)-xjP>DiC7u%YUI1|5(|B^WXuY+o?{ zT&Oc^Qg42gA)y0~wLO0OgTNN*M#8(#QoUEsI;Y8{3C*D=!1M}k)05XJR(dl@MujNM zvkf@goFMV8O{lc>nZJNCTRrhw{iPJUsxY{xhrMV8&^%U&fwL~D4geI@1A+=qz5*4Q ztHaaL(}Uy{pnY?F3CU^ASI;<12fRy3f{IH(BkKo%nOpzV!+d@YlzGp?DOHtAYO#92 z3h}T5ldF`dyk^qy5U3^|7F)(@9(=Zpje<6;N>g zpF$#&f-c~=8y7r-Uouoc+h4ss%|c$wR{?ifv4J_5q(I`d#w;q4^&C4SUeZo&PJo0~ zU9eV{CIw>&_x9@Hw(@?nyPNL@d|S^Yh$Z6{lKZAk(m*HL@BsHXASOrs+H<%ECVtw{ zjY}cD0G?)Qm$rl4n{EjA`iHFwrnk=T(#t*(-##*GbzSm~TXkA#?<-#lNy`7XtCs&< zJd%Pyp%1*t+-xZ&vqI41PxjgeITZ=Fk`E(!_`>_s6;jA?fWsmY5)&jvdJ34z<@XNC z()m{J5{ArAuz6*n^N5%nyOXh&UAHZ_jHp>pGzS;Y>+WB@Sk<^%e9E1>Nx9H^WnmuO zTjQKM{Zm~sc|7nyx2)(i7LcU}b*7~{(9kdSZ}1A@px_~5E~tv`-a=5{7E*@ zs|rV-#PMCCNYR3cTic|`q`~Mel;!@@)KejeyU+NE`@=Q8>GXkhlR8Q82_EgI^3PM( zc-U>|g zA9MiW`J)qseYIvOZ0)bfbq7f|A6;JSyP?z_2Y}yg*di9ts{7jMcM>+P@^S9?-Yw8; zya|van)DBZ8+KstVp8L6uB$p><)l?lc6)j-rNJy7f!2pL%WnYr-4iirtY)&X7W)${~52l$(Ll!55u zVpdc?vxFKs&j2tfy`2XM4m4M=#jtsk&=Z|zaxyh|p1axO4Z!o+?Bk-396 zEfb4}=wdbndd9p9$6cAqdSYbn?Fz{usZGRuiH|%9!6>)Y zQD^LD9&vwJXR2k|pE&6+WxH338O>jAcUg>NQ;vJ-9_iE6;vItj7wTTBpGQ!%Kz*WN zYJWK@INB!~Son_DUzHP7x?20U_iu29Y$nw+U%^72gL)OuAz-z)4kujC*2A$~Df}g8 z4T&)P*T54PC2{-y3V``lGvP+^F58;58nQzRb%CdETI_wKR+D2s0dc(qNs zpS^tdEon+N5^f!&vHmErZM*&)6tJauL1j0{Kjr$5GtzX(qGs=UE!qRVWoIv z-I>@E;u&882qg=e3RD}M4Y|%Rp}NUKfavQAIOs^$2$jzwf~n|KZxM+K26-TI&|~LYMsN&7rLnTm{<*dqmmOgPzQlJ0G!0vIJqgV>N-6}jG{{s| zgo0$#Di)S_9j-2T0@$p=g|lX6FLngUZZVPX@{}QDN(Ggs5qk@9-okv=(ILH6LfQWg zjY!G`g)+V%e=+!IBcS2<@dB_)s`ViD^$-ZGI$0=VoXXN>Y>9)49(4Mk@Asa@7s>5@ zh?gh$i2K#oRV5ir(CzcWGQKW(B3<;KLy0^I9SD@ zFb`H0kyKP7tocsd*9MIaD%6sffStpg^tlV^TT%c zsH0(JdxdH+E)Nx+P^@qYel zb~pGPq1zw-KD7=EHg2q#$Po3@`0Se=Ztfi)a*`|Yo7Am&&y|tBwyiaK%25SFyVTfZ zGlh4FdV3NGfteFlm$|JYZ&yp8j#a#e^@%ib!C&QEe*Z$5G>+!fJB??~FHf}C$EKu5 z^i!sc=Er7i$%Nk}@l$Lg?+GU+2DV)PMC3`t{dmVRTH576W4~6Bk`v`CJ11_p+j~{( zMt`Dxc_np@9z>&l+aa=6C=7;GT!LEcO*`LT9d)|XbQSNtOTtB>(*W+*sezXyHoUg$ zpkV-0(?1S|};x0oewlv3(w%$(r@WH@JIFWhtC0A~lT z4FI+bwnY4rVQSl}U@qThBei=#)qo2yIxBI|Fr)&L^2h?9k$!mqe9!qNf!_cYvHlT& z*{}bhG!WCvJ%zJQ{q?5x?$8BJt;NsEEcX;@8?guWJt6QmLoK}dJ(DXDMq64JQh;+9 zQp?jmE5HdXO&nqC48cyddueXHzA`FJLpAm8w3kSLfQQ-P zc?|u>#!4v`V84TcAML=q%G54^JN@3wh0Nc;!iv_8y%Uw*flmW94zD+Ub5U22n^Z6Y z1wBwq#F+5JNi%Etzo>!#nSuYeYg5HV6J^*^gHg&%WqahB~ji@dq!_E{2qDF{=V0?``B~#)RgLS zX|grvv;MR7=5qEqMxc=5F29W^vJCBYZ(ue~FtnpH-DjnLG!(DkilVkP2nt3TOyYfR zTy19IJ>xQ@k|X~`^|#ZVU&%i0J z!&Ub$3dd+Kd^}jOn5WNol?0)}B+*(Sq3c^kbIkf{o5OU{MQWK6hWe<=H!=*!4vRxu zJfSBZLyO&u-KCn8$R;LCQok1xJ2H98U6|{AqRE3U6M90PtsmNdxb|ZQE!UMK?evTi z9*OHBF9P6N23hpogHLUAwYKDiZFySe;2?o%RCwaN<@@;M{8{={a}Y-rs&ln>?PK*% zw>@1VEFed6_H=Aivrxnh%BHcK(~*C+JN^S0qB&ZCHcZvIT6%;j7|v&}nJ?$Bsa6+p88~D-ji;OG+y1*e4rS@# zZjR*8kq|ZO@YsBdC9fpw_cwDPJ?g8nS*GkvM(ZmRJOiv_A@=!QKaZ#K>g&-dftm{Q zG*D2Gkl()M%muyYd^=O1>oNrTjwRFmT$FCCu*;K!)Fy^R}U ztS>Q#VSEMEq*Rpd-%H@L5^vcvK2pw+kKC5>%=To#?QF88l)oPSDODXkfEWLoA zdAtm~T=@Z(opz7Ir|+^-g+pj*tc?wlEE?`{&*bEo`c$-}5Bgv@|;vpg*eT)bgb(kQv#S&;5jF=o>f4kQI@{ zXTv};6_0t*iS`mstVF*1+#8V_(14o3T*=j;I5Snr@^YYPy5?tk+ZP?>}#z{7Q(ejl&6 zd>a08-FO<5cTDSMQyXc$SYMitePSl-(xVz|q)oXm6$EYX>kd@Qb;BW6VY@|}`4Ua@ zih2Mr5Zg7Kvq|cIecZ4uLqe-=DlitOL$#l+XCK^dtyo~>*gLvkS$h6No{h`CEOtSM zdP8b$adYb%+xU2V*?5p@PvLIYEDnimAUtj?(;Q&6i>Ik1NPXDm(HiU3TpP3QSiq%` z_(M$8FD4!+SKYBdBUY~$h`XPOGv+M`nA) zFf`o!8r!MjZPe_TQ>pcMAj)n_M3=um^Rqx~ffv^a`;d(8BX@Ac`>7ws9Obrp!nTv8 zuJEpf2A3_HbK>(Rr?u`NMe)#0UQz{7^Woizk{YjN=ab(gwyt^D6aw%*mlk!Xw)K?M z2eu=wv$m7cpF^W3$vl>y9f(lH4gt1y?cC>ttE+Dc45`1vN%nLNz@N*E>eRNL(eYxh z3r$ucIkZt7sHBStA1pKp!iVVF_7^G2wI2PbIoRitZ~nxe12VaVrG^B@+I}KH81KTqi`_;e3QSmnCq}swll4K~av~si6`XX2NHMH_ zUc^~^RZhH8auc%`qP#ti{&h&1fO(Lp$3ppxpK5&na3-$S-cQJWsnJlkh_W|I=B(@k zM8lTz^L>uZ4e=^u0a1mLJg7)KE?DBwst}>K3z~O^j<)tb^z&;CWb;@N4lsGcwc?!~ zPaJuUKwEKz>e)RY)cxOA^vi@Y2x9M(w4EycgcH+6%bRN?hKjT`;E;U|{$2&f59f1( z<|^Pzx0t}>l8Jfpl}N2HBEP@}-@4|xaQS}UM;>Wzli;*Y6p+W7t+|uB?Q2QdI7%_L z-W(qr`##o_JCgI6f8lZCNIXvBYA_^u_s+;^xs7_JGKV=5uU)C2r%~ZhaZm3_TWD^Y zPTAAYK*c6pIJSpQ&5rH!xX|m|N`&#zFC~%Ne6ht;L$n??T6=rDE+|v3-E%LiS--QD zdHD?BX1w4HVOQ1=eixL}b5Dl6NKN23AN0Lr;jiji&)WLq3Ab)#gtnl28(?6a3<2?Wo! z+Ee?BhbTuz(ffu_W($Q$R>lj%={I!*ChXsY{p&(m3+dT$in)?Y7vwkxjEwTphO(5s zRyGI{iAYb$PKUyJWP?Z>4qUVBWdnFP1;Q0Fhx=BeDrm7{who_?=_GQhdgVt-jyK_=wr&p`kYudvk@GEm_anX0A7#;@t!RN@k|&5boo3)` zENwaLDqCJtO#jOu5X{$(ukyZVaIPQJJ5MEOuDhG=Rs;&{K7Xfp>vr(?Aa4DTN9NaHu{%ciF^0v2c$#ePAIxVcOuA_`{Raj<*00V4U&Rj<3g>MmWt&jG zB0@F)9bo(}7Wg}ZbU=;8S@@_r*^p_lz?;tffZvs*5*Dt>E|WSBCP1RHt76q^aCdIB z9jQv(%0Dc6a`nxkF_!RB^(lgyl+c&tj@TebFCEhFKS*xUojd2D(oV+qj9+Tsl~8mc z>GWi8zHa05vt2K-jKJ3d1d0FKEC0hT1U%2oZbOK=G7ly}HFwH)s(g;)OdBKTfa?VI zobm3;w1E~Zlq1q_Scsp7a}HopJb!e{mi7GZvYGJkxd=Y_KYsl9(Cj*~YF#6-cy`h> zCeBtnv3skff7W|oogy3aebz5_QJ`~darXKqTGAprvzb3$0oyqioQ-U5TdB;4EJ1=u zH^+++4&`?S%S!)2hlOL~g`QRQ42*P>t|-~1wqp#H@GsdPTs-W5uvo62q!!w_dpfAFocR6_F&dL^ zD5Q>LeNeOvR?e*zk^2qh$UzBP%ZmLx@V&-8$FF%8!u4>u`a0s9U-s6J&o?_-fhyP* zdGkvgs@V)`lZ&kiPf2O4e_Rdp{Z4qg!x9p2L z$%`oIli*92SyA$8IMiU(linO@q<;vIlcQNg2XLXfZ}P zx)_RmiF81(%h075#$J)S4iS}qrH;zqsQV~ye_U?(ltv*<4Xa0}Y=H3O|(N9%m4@)v@DopIM%enMY=EF)fh~)n~ z@TADd-Y(qi7BRs;YKWNJ6skEfMkk(sP>~^Ju&$AG5~^BMYf#QZ+On7rn%PkaBh0PE z>d?BXLoY?}lBGjCm~X9>LF)__ZPasO#gV4Y&XfkNcVzyl1UYG}m}OFVh|M`NZNvK-j^Hz)OpLS}5VTr?P!jKmi6IUDCBvC*WL{(?MKb|xiu{;Xl?s%5x9wLNRe zGQBJ{=WQt3H$B@zr+!Z-v>6LEIY58E>ZNN%+s?5Pn&EC4&ioJ3R#W;EH(htN)3X zaRW@iFSH>{-$E?$G-2cDkwlF8-&eD2Eq%D>L`uI9@>!8)Bg$F4r%YbfNH9t25C!J!mO^>>}>uJ)Sq|JejPa`{W0!I>&a8%Zj_MBPXlFW5fV?9a|+zV7n<$y|N3_P`sEWi3JUXPa;Y+C zL*lGi)jGR0GXSk?!rFSW)r4lgl*mzC>zfv$bLyUU_hnn2n|^2`3;)3fe|fuH<~8Jh zRrweUO-vVLZP|;wV39C=T%_M|S@JFXdT29MYUHCgTV?(IIExV%!=JDNqMlHI!fb1i z4t7dH0L_;iR~XzsgMx)-ohf*ZtJ_DsMO8a8>8)21%3oq;`1=jEc1v$b(`G=D^(Fq| zQAuXdBysW9GQ;Y6D9PP!bNP-^xAL>_%Zkfo@?9D|S91BReV;s#u5TWUMlX%4jP<#C z%*lT0u(f7f9?r~)(R?r+O9cgJ@Z>iN)vX`Cnb#pDKBE)5Q?xX>o^qMRR z7{VjVX7Or;qS3n%jl(^Zs-@aRK~m)1wS=f)S~l4bTm#H^)d$6}3Py@toZYG;f3ZkP z9(IbyvN>wiC(koj!@Ln{cDnknqhdY>m5n63g$BuoO`ngWbM`eZB%Dbx4$V;AuY^4> zOdb}`r#~x9d@n3M$djN{^VtbOg7AB7KtVyv8cAa@dO1Nz7z#N|IK@8(jpCs1a{+b6 zdKEIKj5T@9mcx`@9$^*r|9UXaGLrRM@%=ojiH%DQWX;N*s#-N%^xOM)1uTf6Ea9Qj zq=eZJd#zbq^O$^uj)U0wVe^7Kmp7u7Ssi=s-sgIx$U~O|NB;83Vvp7Hzb}pN#wZ^5 z3wDlIhHeHrJF+;9PbXZjHOQsa)Uu+g0^@t zc3f(b3q@nu?9~00c!t?nUnLp^f?7PI^N7V@=uLq5m3iGUc=TZWs3tBLDwJ0~P_iw?DZ&i*HoLr(@&# zm4vT?;m@oWczbSK5~3}q4evGuE~$i4O&-5F=5FBnYUSLm6C}q@@e2|3(kGBS-JhC< zlQXb^EE1Gn_Pn4RR$S319FhwsVx464o?H|^5mP%&JKj(G4-4Rbd8PlKGWIed6yj-c zT$w2!4wCrO6PSoCF^MAmr&Hjp>f(3u@*6ykUg6h4)?w}pC}=4S1}y5;K0n*BmB!wg zq~@zinue$OUg(hq37DRB{2VPwm#mw-50P;Bc-yy-V&m3ABp~7b(HoG#{&eb2q0k_BMklv*POpdY$*{is@D1sEP|3AXsGA! za{t1K+-y#65BmNZPZ}lb+bUvk_Lx0*k(k`l)yQm)=0j9k6}NySexmi zlkB?rg-Ew$3$9ih*}b=6n=I`s4tJ6ktI}tRH<#nH<4?*dgc($(IbIjL`#VtB9va&t4eRPXSMCmy`s48)`%UiR&g~Ub+RUqij?m6xDI;D&8?Bs- zk2XIdxoPk}7J^;Mb()JJLFs9d3Dn1pY*<`Igx)9&=)$!tZ}Yi7%=A|u-zU3}qkd66 z{;SnRMOk{lX?I$9eo|-r@|}h^yKVz(%dcG8^W7DY8^l=8=V|)6-st0+H7u{+s(k#3 zD6pc&Y8`i0#fHH}$$PCMi$j3Cu%E4l|90DM>|LcH{v0Dwu$*ro4F(gX)HizkJvrvX z>(T`8jAyS_rg-a{E$j20kOZTdg#blRTV%|Yy?7g~m~sYc!% zwgO{zFCDe89*wqx+3tICjM9wFJyS<~8NRj=!P2?L3)f|iAr_dOq;~wbzzP4qGb8a^ z#1)Aw*#}2y7V@Z0ID+lUR^>``->NgK7>nHmYeqFtHXCErBodejLu~ngTxB-X?L4pg z%~;KDjuSnv-R4C+JFEP1lec)LPV)mM(HG|7%<&J4i_EoOu6*t@zTEakz-XT@BTH^I zf=#P|XH<8mrymBDe@3pmatqb(&s$ZLiWX9x4*aCre%1MrR>96i7$>B9p^u*y`Qp&) zXD!~KeGH%a>rXHKp`;Q;RKkT{k;=8%HX{q7qS-?Asli3jG+@a=qRDBJa;8#?2s9o0 zB55y8#)Kw@n2i`yyYbFMnpcW%{^Zlvmj(+%0_4k7UNm8T9OUc{k-PMs-JF|G)^<;q ziX!r{cC-2=Hkxj37j{;CKSMnUe2BFpf>T>9@j5ZXg0RHf;rvlR+VfaUgztNKRcr0= zCBQ4T>vM9~CXu{j<>9e}M(&1s*XO_VQ}_#=2Yu<`X-Jw-j_w063Zgb;R}Q3ONHYmD zu4p+CoQlqJ9WqL1>zmdYMX$z%C0tNggF#hG!)=o{kGMoW}cjA^M z++Rs0PjystN@Qtm%RmXZsQrkdk}$G>{CP|PD6^)lhub8X+|E@v_)&M@+>+@au#`(}wKow>>sF5m@`RPt7mh|U`$Mz1o z-I}9%9ty$d!}{!fi9|}W_MYC}n_X$kPZQNvB?tN~PJOr49-G*=5YaBM1Zhk#9|>X7 z&nwyxGn^R9%H$fp+_k(dNX=nZH9%Y5M1?)@yZYb%&i|6Q6Ts9URboUXUbS@v&F;XS zM4b=e9~ePDXDBhq%OI7MKNewCn{{Gc;;$SwLK`Ob5(D)O-7&N z04|)lVaI>~+0gs@}u0 zjzRu{h<*;*M}W~!36ai0G%ED>FesG52w1RVnTz5LT2H(j{c;(q5#v~Ws zWk|2ox$n-VC*64R#B1j;%{)vQ!(L>2zht62-0Akg5+R-8;jrI+rq)hT?`*V;UrLkg zGv4({gIbKq(z{{M{bxEFQk$*AlAH02revRwKO`NmrWiS<1>moziC=~OnG2Co;oMvL zA2ZCWI2a>cS0FIf*g^D1L(nrBa!gFkU#8TcoEpuSYS;|;SDus9-*re1a-AGFPBLfX zqvI{XpCcK-EGZ+JIBkloatz76&MX$R0C7^) zK--ImvUd&+ICC0(Jx~=8AR{Ka$2DMWw)wKhuoJveywd;KJU84(={&B0AdVkjMaOG6--Z$ z$K&>QYeqzIn7H;Lj+2Ptgy*IyA_U1t2%{E`Il*(hC4kW=A>6&otb&~2KmzRcqk|!) zocnBuc|742p@gJI$E&6Z%nF0ggZ<4H6^9DgLUZaR%;;^W(AnMBM*MB1#hY!nT|B#) zPu`kk<(0?rA}zE(Qu+C{>l!Tvw@@Y;rKt&-jHjMsXJhS&eO<>2;X^(QyS4rV;kUc+ z2a$xX$h_f^Yslp324A}dJE;hV5=j-8-S0;yiROT;Mr4gxP>d5Oc5D*K)6w$|E^Mpg2dQ)# z9R@0U+PwAJ+p*VJ=N1jLxdiB$kH1ngWU@!Q6?S zqzRG`_cdvEjPD6Jt@XS&wqa0XGMK?_Hn7`p-*475apYS_`M{8w zFqC&fH(s!$zASxbNOgBqz0q;o+8rv{?DQmLOvnJoe&x__llHj6Os=B;B2H3>>Db@N zDkd;IKmj8mT_xzNv-Bhs2naO551OPCuxBnFpBJnNDK*^2KbU3_>{ zK`=-L3sRd1E*xuIrR&Xe-xk#F2Ah>0KKD9WUjC$2cJ0IOCQ2BQ+L-edp1gEG@E(fJ z**;i2gJAU%s~Dtf2u-1D)iAJyR1sWV%A4S-u_#dU6GUL$MBs4j*Me302`^Gr0PcVR zF;R)b*0b4mW>4{FPq=3l{4F%yPJcg+q9QncP9$~JE`p(9W`0DE5MfQ?gkTXi`0;~o z1!4{UoYfDeFCxn&R83THinYiUo%yChY-LD=TvAKL+kF^@y7rUnw4v~3lS z9~UM?oip@hcS(;g-#^JuQ1R^RKHOd{CDk4Xsw}0RjkMb8-3CrW zlLtMosFbE#&VGKlhMY0a4s0$fHo4jjP4C%|-K%QCe2J`ILPvFUaZ8k93O|`JV-7WN zFieuGNMHuw1vCyc_`PzHnD3M$sK#t6)`(VBPdi}6F#n%BbpLo8{9(R@%szyAvOGFX6N23TJp&_q^p*!#QM#9C!DWOE2W_|6Qiw>2%1KJ^>kbkE z<h#PLND78Az2AXj$f(8S+>&n}D{ zt*P|r(WWQ_6@CEai`-lAz7-#zJnZ>hP?+c_`L5@mjaLX-D6vt2K0I%^JgEB;_>q@# zdx#=g_}nvjYY#=sUis**&r^ei+m=zQYX(;H=%o5Uw#`&a^V_a$BFEW{gz2XL?gGLD z8eO+9tR`+f^O=mMC%^eA^rfTcLGV|jq`IkaE`!X9axw?vRTwnVqY>Buoecw4JSf4P zS&kT=|61tsM@0XA`juG_1IU7>dSiJVtC=vy0U|G?(Z^!Fyx=S#H3Rds0V>+xS8r=@ zNRX|zENO(%goz*OwrmL0+urM4^;qpyJEhD2eARb=Zknb@mi#69*Aee(bcFrDAsSX~ zZ&%1n*Y!;8SO7IpteTnt0rhH++zuebgcC1~8c`@da1!u|7w2Pmz?BLKFs;b|POzD>LwrbQGZks}@X5>~S`Zr<`RZ(knm>HQf(8k?_W&UmK{E_>S})DP5J$XqAYsCXS?iD)$^~ zHh9WE5`?xMA587`E;oP-LB6KtPba=YNsoI@@=gsyUZ+AMGN1Y~lS+hdD+VWAeHw+6 z2Zt{0Y$oVRd{{J38s8Q12k(7NeHD@TV()FCnF&0N6L$##lQcK^ORc;hb&m79oKN$>up-gsPDvcQ-nZg81uk#+y zX~F`&7UEse#&Xl*NK&Tf8c(KistveLPGYUb;PAcM+8>vM>&(f<)u7IaPY5NQrFLvg(&%q)(p~ZS49B z3@+jlzRKf)>F@PnDwaRjxZU5Kbu&zd?Iy`EK>vThzc>JN-{T zOB*$Z&Kq)&@2)StFKP#H62uTJv?NJt5IXg34VXlpE>qK@4-2ck&hDTu+a$sn^^F*u zm6Q21+);p_z|eP0D7o4uaT4fU7HZ^jI0(+NAE-fT;y^ye&dD4jieU)v5358uXThoO z8rxNS-#p^VKMdcn%fb|c6~%(DKfvm=g}ai24wVP{rxTgmp=m1X#>516TG3s*#H>&b}E$6DKDNDXVu zZxBp??Pcf{dFpJJHH?G^Cj5B5VHU@sXJf^DY;Fn z&t_lRs z^pm9fo*;MTfBF%i48Vu2H({p*5yW}JU+n3==!b?=Gr}5&7|-EpB+vuQ=IVWU$aPC) zDyJAA9AhFz4#y|r1KaFA!TY*~l6&FmGRv1~M0w2YAUbWK>i60nzlDjR`>u z>>SJDD8z9|`lri^M-I0w#Z%dgCMpJmSDJFyT-O$-#=mEl5D7!WFWS~5hP}dk$#lp! z4{Y4yyd7iKB0E$!SlwVz!-mC#-l((;dIf%F#m^i9m<0N_p5%m&PIs3zR(C(AiY&Ix zTs)&KSoIONBdU(eQ&$8eC~1*9y@Bw-#EjkGRvvsr5uoemW0WzY2${nbs~$oLAI@Py z)j$@#xZ3b$w7}-f9U_;{JQ;=NdIDeBqreNZM#Pi-^CL|gnp{!h<9WN0MIJ;;)G4MY1YD0)1HXQ*Lvpp(AMIJ-92T)Ro_1`# zz8~Gt*_M+A9_KI+!(U%)54icApz`L+CzX*GQ)esg*@Oqu!qwk9p123#>lbI?KGdl?xZF=1q>jnV2??%kVLIA$nW)qyq!7T2tjO z(P!A*zWe&BF8v&s=J_t)@XAC5M6?z~OKuhB599<4GY-shn!`5tc>ZH1#v_8$_Nyic z@auARh(il9n8}4QcZ<^Bg1f0BNrU+DP%y^|#cIR8InWf;rVu&gJnW!^P-9D&Iap+s zB&ss1HBrKUQ7urG%k5K=FNjW!lZqivlZpZv)*As5LgonN>*d*&E4>Zp>Rg-NtJb)V zXb~-}y!~F0LmoO!br3)<%@li`e;@${+2>H=S>c;f5uup3!U{*G+h@wmR5&Q+4k!|m zmV=U%ALFTJRPwF!Q+HfKW)b8tm78i>I11Mm_0KLX43B9^rn9X&CvU9o^BNGU-g4N( zG#D2J2ilJ(*v_l=zK7v9p0GM9`GcTYYl0IpEmh|0fsw#m6k~R0THFZ9mgt3+A7l&q zKT_5OjMrpSgmq!KtUB<7{re{*Y~lY17g2@9s+6rNSPsR5j69aRXC z!{ho8g=nyta*@H*8v)cf$VG1ek%BmUjMA=sJe6S+bEB6Mqh>Gn;{;*rt|TL(-tolp zlWUpXXf4-Q82v>=H#lyd9z`$$pzrT*npQ)+@-wHqpMyPO6U1$4&@cvx)+q2S`Y)J{ zIkT0Izw()?5F&!_S8*1?{3_Yt><_ht1Bnjf9%` zkbi6Leq$wNMnrxm4pQ-ty*^V(88cf*dFFXZAqT5y zM9d}S@3bq;u%-86EYcu((r+tF_wDUUG>JJGv9VtLU55P!yZr@hR#0R8B2Bp~y~1F1 zEj(piav>NP=9WMWlV-uw;Gs_ifk{nd%CE}0sX4-HStX6XX5;4R=-M1>lGli-8k-lm zhyy>UYOXe9WGGrqRUPq8X&)r7p&Go~l*0(BLT4QaV+W!XW%Wr2F##Pbl>ve6->kbY zfpC)5E@5FgN_CWHyl5Tqh5iOWjr?0+3jZ)k8RZO7FZE$*Z?-D&hf)~*uuvc`Vn~a- zr)1WriEfp<-FqIk61by`Af$&H_*GHIxNk1nb6hdgV0_x#ZiGs}HP)TR=?kXoNEp~I zdpjJC*3bB<<2w1R-{KkX-@M(*_t5rsatwWU+Tl%(QrK=ppcWm*CylGJOAq68wQ@a` zKCaG*&Tk#oc&=Q`woT)F+ilOINqJg}t@|Ht<+t;bg)EfH7n|*jJzy=Qsnf7k@$qdD zh%>1$2D84}T+`Fn2p>7sk$TRqiGpR<#H+I8d@>OS<;GwBWqNKm?88daZEsuC} zXQ7YxnMZ@0S}A{_nBPgUW`L82VG63IZ=!an3xw;#S3-uW1kn?y#+B=2 za}*Msm;QUT+22*k{}X6sc*H#eR!YEv)t0h2F}@gOG$Ed<8TGT%9WW3eyF?4SZ-_W? zlE8rr^E{GjGCNwmxJ$EzGW>|gDcb3hgjzkJRx)hcm%P5KXJjQ#?wb)|qzNU@)sIV3 zqq*v}3>b`4i|VIm*5vE%a8*@~E5c6Mx{Hs?*sgI}FZxv>6^wzINJrK=vCwINcq=CU zA$E3rUjLvr4ThtqBW`WZnobPvvNgsnE;0qPy@>bEiSC_p?sp64+*-ZmC(lrp$n2Nh zyv-V5hv47iTvGx^OEbNq0|Sf8>V{`eX@Nd9mj;ysPd?4VaxwA35U0+lp$Ugi;*ky8wZmN06(L9~#oiaDL{ zNY|>fdsb6Z{6D2h%W7a<0cP4&UaylYtEb@Nwer=^a>><-B@bPG&z~~}PZv}bika5~ za;$AfAw5(yi4j-ba_14GT=)yyxf6`-`atiy)6IQv@vD{6v(jG7?~VjN)!l z(w8zDiKmu=c2ECk`T|Hwq=72eD9@;sb(@8TJMU)sfxP2ZLzG(9e=t7oc@JH&#QRiyCT& z&d+TXO5Vy>&Sh6yLrOvFXaPA|4T1boHtd~Qb2&>9O?8Z7z+{pN zDkla+E7FDmB=ZaRbr;LE8=sYa`OJI3im}dc6vGqf4D~Pg2Ngy1aOGGz@2CVGsX}{c zY8xferAviTQ4nwf6&MqKJ&%YBF1^rX+Jm--ckkinL5xQ0K%Zy7ca+3Xs5cQ!U#7*} z%D^}-xlGTeDXU4D${(?@%gut`ceNM0JnVwZEqgakx%}R@Hp~-Gj~#OcF+Ki2 z4164@99p%J-|jpk9oC{n(PbQm%^sF%sWOPCM@kh;9*lOMv9emc_`A~nD_j57I{Tf+ z3y|TXy;w`p;<1KP7$w{_A>}k%s*ePnaX>`f2*()QATMnLGt+DqEXPOf`LdI`;dQ1^ z^hd(l&x+TV0p@3QMt<@axvGJ~yDzL^grmz5tmP{Z8h#h!((nu=TFx5+)$R7@$8!n` z=#!w35z>ou_@eU$)gdk)X!n*)>nxF@&;=_#sF{_(19TPP^G4>yF=XCx?K0PEDAaF- zgLZ-u1OAX9w9dYT)u15O^KaIHrH1cC?(P|&=m*_84A-=;-a)~6FA1Kg2ij2mJ+==I z?4R*s=i13e-sC1_4bayS!UT};a1Rz7XbOLY`Zt2z2b^!cS%HT6Yrw`0v-p#%;Ngbz z(fw(s?7Am+@#Euc*$LsZb&3KYHB4x@4mg+PA?qKtGupd4^p!Su^IFA**7oWiwvcuQ z(1%5}VgUlT+ikA0dfcvJ8U-TvzcLFnZCp1U-wvm}7G6AW0z~Uk*f*arSoJ2T)>ukl z+waKw9hdA^=h+?(zmzqZ#7fqKn4}$`pBuh%;GeW~$91BOu_}Le#fs}f`J2wS$ zFEthF0e$Q-J;@&FXQe>2B1oV6I9=gua44EUOn`a~qv${z?MGlO4thsuo(m-{&Ag)m zK>G&A1SN<@mjyl>WiG@pzO(#Y+Txs<0>|)}L@ozlTM5hF_xAIv@c>D7K-X=028+pP z;NW{%PY>Aonz{P#GPm`;*QwNny^Fud9XR7`U%22e2nC5%Wlh)LF_{7z?%++|#iGL9 z->w^zQT~yriJv3Fgwt!eF>7{XRk)~!JPHpXJ11j~9o z0#8tOmD^gCeD;i}jSDl;Wu9Wh_crRhsX{M7`Dn?Lu|+mWD6{3nx&gaF@n!a5qw5k{ zX4$SKfiplqL@`sam{4|S>qz9I@LhCh>LEKb)}WU0)$*CS16sF#zx1xbn;N)*+P!uy zvUYHAuF0@PDfibM(J)+?W;;<7aFN($-AV2AeziJiJpcu>Z<0z6Z^UB$4~@zn)X85_ zUYV508lLU!edhoqd~@3;2?j>`h4MTS8k9r6@tDL(x+bHi(xKe6&|`=-4P(mBk2fWE zG-%Nh6a`s1u6PV;k}ylRup-*AGge9_$IdF^vNAqCHzHaC^c9ga*DFD?RTgMPd-YQfnhQVtI30#+H}7}MOg{IZ9Yda7XFet=caw{-Ltq| z_}ExDO$$KsRX!9(7#yOeQF&kn$zWEI{C%`nieg}btY@T<+c^PZ2-~VCY#=QUh~!M5 z8c;e6W5u^8C=$p&@wGub#u2a&`eE3L zHH}K)7iELEQX&>L6wQHnsteLLmOeGm5wwn4@QOTK$M6{#2*pYmOhj=hLycG&>eS_7 z;1S^1QT+kYAMj#c*OmUq&fm)*zq7m)HcZYKhdSVzpE3^?k(XVVL|jD>E#Z&FZm_!m zCjpkM1~sI4MoXb07XK>8PF9l<|G}><(F>pf9h`dfPo2vl@tVz^-hd}wslGn_m7DYO zAik_yi}fz18cB(uAbMVq7RQgfB78HJ{y2L@RJKW4K(DsVn znlQo*1J?d2OXVOjsamN_#!jr4>#z(54UaHW@OS4nNl_23JIZjf;y1IddGoq-|G5xJ zXBKQuCI7Ny_PY$Kv2UST_enbD`zrjyIEoh^)agt>QBW zzqjeyPBqDX1KvpgdH8Q~nD13aKb_3{Ur8G32f-GMqRWVxzbYlWikoh2 zN(JMmlU%zIV^2-j+XHPDTTe=yP@}7IeH@|MX|tYj`}~$BD)w@J@$8D5)8OgXo+l&B zI-Q)yVPNzAF*==^fVjL>TNxR(!7f?J76Ae_G+3>j{+WQeCztD=a&lNZH676FWvb?y z#`$X*!{8jG+~C{Tmx>@=8hU2p<~Y zDgR6W?Y=tR#o)lTmZt-yv^GqXy~b^}Wy)N8?E{&un|O}{Fkh9p*Ic;K40A}h3$jFU z)@`QS>?#ZlLz(xZ_$W_D3d{By=Lkkq5@6CYLrJisF{GT76>tC`fi`HLn|YJ;%`@)% z#b0Aw;(X3A?1B|-g(3~j5B;imaJI-k@HWT4&p-Ra+4SBC&82suKdl&w% zSc9jUPHbd=#>#q$g5xChvhWbBs3*pskJ6p<=m~ejI$c-7 zz)(?NpcKr8ir73ljn|(n+GSqdCJ)K8KlSk0jXXVu9?8Vo&MaQubI)k z00IRYRbq%Yu#m~oKg?_xy#3_(W!hp@_V2XxCzkr_0a8MOO>7fh>dbcY(u~LR6C4J) z^+^ix2opK4II&7@Py_sIn>fRKH=q&zXjnvcVvKn&=a56mye0N{87uVXko7fLHD(37 zGbOFrTGw80G+k7ps|LP>qsKaijuNEA<;0sw>IM-qH3O9y0ikt)Y8y8Ec zrO7DF(qTL`^nH&6lS1eH7|xUjL4Y|{8*DNy^cE(@L29jhCHl%WwpAYxSS8D+KGVOi zP62oS)9Ibylm%R7=3iQ@EIR56VoWS#rpfObq1Z85ASVcMrL}|zgdPW{f5L?Bxjjxm zY7P=uG~vi;yLwAO&Un_Jo1u@gQa%S+Q4XEZ(5AN9?GSxSS?1^|U0x3=3nK~$8v#Lj6uwtI`MV;A$1P?02G9ENnRWNZ0wCGVRUIi|_%SHtvd;92FE1>? z?#^;y{$HgzwW!?~)$mX{I=)V^?!|?vo5qyaSlO-faFS1cg?owBDn^P0lZXBlyuVN6 z->6C%A2FZ~(^EW(Zof=wy~EwuZC9`ySnoJ|ZLs;44$X@O3(befpu({gh`HM6Wha4M zJcr9QGk+o6^L#zFV>`r9(&)gciOyFe2l+?ibLWvp5M|*@Z^&+)`iRnT5@I7w4Y zm6Nsd!359k?Gf2fIVs-7JDbVyYLw((LZ^vr4W}3NS(}wM(`Hti2w|kpq4eEka(0b? z9l)MKd-gVWBet6sUj>d2^+p^cJ0l&Fz@C=?BY~%%XOGaz+ZP|>P{a0(2+&?GM^rgA zSR>q?`IuBfC!WveOBP*K4@mTI=C!|iU%?@)`MXkPlY7<3j)5Q`r<})O`LDKhh^M*j z=}K5MvHblC`o(9nsn2Pk!uTfkU~t%>{U+V;@-IO(qqgD2X^D3Y?7!4I#0XuEso`0H z?G?fn(&%q={xd&Djt=iFKwLY}EdkaEeuly&jUFH>BPp68#`t_bTyi7Ji6iv`AugbDYVXsh_dtVme zBIu}sgW7*RyJ8jD109}U6ATg+rv|Dy#2FyOkEz_arFHCDlME0LplWs!H0Y|73BSuV z`eHoM$e!4fRhHXs2GSBdj-LFs&S}-*rbuAJSjS|(Dyn&%D~1j!>ud|K(S#AmtZ--Ff8`8N&6Uhl&#N0x4yu;kd{L zOAl^(HTMGiulJ;OS7yUZng=CYc5m38yqjkvh zNsp>Fh2kAisgy43C=hV8F+ieE*iK>{607N!D7{))Plf20jF3OfgiXLStww1f*i=(v-yY^_ zEb@QPthZh!WtPiR-AxlT2ok3RqFj9;sCu!Ojo_Kr;E3_OLgZS^+kQc43$fd5#sv%A zmD82B(^vOs`$BK1Y2~nE+AL#^0TC>QEXY0h)@$CC*nL>wye zGy7sh(n>S#V1bKeY-GNMmBSYYe9%xrgrYuR1WxDx0=Z#B700LyNX*L5*{MLGTg`I1 ziV)AzAkvn1L-mIrF7KaAu5|1kDe3hiqRCzfVkS;8qF__V3V3Xow`AHY*8Aqcgz1q^ zbxv0uA9hrJAs>r9jSf(KH=4$cF8nFmJQ^vUO$kG4MW15%;2`u1oDf(wjDfaItLDH} z)ulRBLG36HVVoYb(_Tr#viy^iLDbqKFwP0DuK)b7+9~-5jSC@`~|f3 zB75huR!e*%isGR$9G-XAl>d(av@U9znljYfv*N#I>zK?`qNFhZ^&T6E-(n|w1o(*p zx=^ICv$3z;@!%;mO;kc*V;HY(h(5tN;*T6;l z%TT}Occ1NPk{akpiXvS<^n~$y)TT<*;RenWfXVabBR0S00TFaHvaK)R4qf{u=C%BR z7%HKhw%?IS^c>&+o}3-}R$ev5%m61I=18gQt^Zp^8fXS*wj#5FV(ez#H7IQK_(Icy z8;X{9=w_M^mOx^HMi~&5;KZ3u!Ofwf^hko|d=5u$H7(&y8eQdxxQDp2i`v8G} z7nj~~^VGUNw!n*7=n39~>@zI`s(KG5V)!%g_JQW}cXnn_ul6AfifP+85_;#{w*r;l zwnZ3VCNW%5LaVzlw#6KLggtIFE2V&(m+kxV7j`Rzt#_h#mR7pQ%X;O|JcFDMCe>Iy zDglU11sLH0{hR9CLvPIDOGb&dw9hSyNJDIe@CX#b{a_cqN>DKj^$#K$8QXt}90MA- zZmEHiW+VUqkIN(O=y7CkaBKWJ2$( zQw5H685X|#nVlRLQxz-95KqQW7^wlu_Gq0``c z1ZW9*P(tLC;I*NFS&Ee`A zBr=uJh;nYTOYYgxGA2rJ>xzjDElrqf`xWvPStqbae1p1WOe zo-nLvC4WBVf8M&HjUKOpb~0*mTmnQ`^^t$EekEyK=t}ln4`*%?+s)*=99SeNwn{s< zaGPf$mOV<};C;&D$>s3GuQkKi{n-0w?w%AP>DpgklD$J7&{?-fSgcZ9*!XS{Jk}@V zeSb1#^)M%psD9=4j_(xnA$M+*8Xr12N;k+}PnL;9xI4F^BOXD+RKP{q_5k(Y47(yWo z;W}|Zc_om&LxlC>_LI*AYP@u>oL=Iurtt);$nkR$q7Ti!4$i(7eEYKZGa+~5NzsEF ztV8Lcb7gy)GSLl$4$+cl{-59q;FbJ9(X*AJtx<%}v4W(~Pj^IV&^~e-YnOkp`k=7L z=4?4xJMbm7h~<8d`!B3Vt6mt( zH@V78QXf~WfWLhe2We0GJ570P8wZC@*+9j4;$x?I9IM#?l{=!&{$ZyLDf2ur)3=qs z+3qq=Z4Anw7kgZRb68j_^e`8JI)@lerua{U6smD z^v9b`-mjn3`1&gAJ?$7;G33bY5_4ag3O2mD@`ygYB*sXW<}D8#Tr~5U@%r@r<&ER} zcHwW|S$g;=C9-(nukE%mtfDb({vtnt{$^65Mm$4xaY+l6qDtw4&{xt*=^guT+DU?D z3R>-SoF=K8ddq`91yt2dkIPEY6T0ial^eX?WCEM529{x33Kdnf!S1Fh76cHmc4%!;^fGBds=~YZSt(bH)cr300-DOCw{GT-6*UFjsTOKa+nF>bE7V>%RzQ815zPyP(iHzj% z@y|4K$7pUr4FjGS_bRwQx-_?pkYy^r_n%LUMyGR*;*6zFucS`ryfDB4M3)a!n7w~` zT(mm-l5h2E3&pNE0I#AZl2c5Q&ea&Q$4Nyy#oEDv;-w1P#(Wq!B0}5zIJRA_zc>+fV^SklY|O zuvs|eI1nHV*COXQe0AvF3msH97EsNAQ3)xb>HhGuIVfCI=#OI3wRSMpNU`#(~f2NYnZu$1B1VE3$l?;2i zkp$XBl0uid(v-^X?(>H2rXJ;~d_jot!nCz|{qO;LdNVw40oLVwouljs+tN$<0P`l< z<@dewq^tO27(jFxQ16;8yZI(4@XN3nj6`Hm&V72T8iyLx`8_Nyf96{~E>_2GI|>#u zqF5zuehUatTO!e~C{c7lb8#BTDE2SKVQj`n7!)ud<#a5aj7~ecF#pR7pkE2aXdjz` zKMsZr5@E)tDVO_8A7SnJoiYDWNBar`MRO3HzH1+>rP6cOykPPmLe7@XH zazVSAW4!H++#IS^(~f$v89XR^w^-OQp82MI`ZvWDCmO6Od~}hH6Kk?mA{;bYv|Uq` zb#KMDL3fIlw6AT*bSDEIsX-reM+(96kA{{i>te5{^c-`UPGMFIg`LTbE4d};?f}uK z3Qag^+zicnts;E5FvG~^B?PRWbV$KEh-=v&GpB57Vn3oFOEa4T`#{^ZtFwCO;^!Ex z{2;$iv`R`#W1Q&Od3NGlc|j#qON z>O$WDnuUZ>un#qte4dsltXxOvH;?`_!J3Oglznn2RdWne??UXEqBR$&( z10zwiu?5f$jn0O5OWpvc-xz%uSZrE+Z+d6Z?kpJQ_t3b#D<=BK-Ql415DhKLem(+>Rni3nPE{AR(b~EaE6}U2aPBjC zY*J-Wb4#)Hbw4z3elS_g8H8E4Nqzho6D;7ncYU+>aUTMcFMWD5+=&xJrimgBMJ*Da z6^rZ47BvLX)KgN~D^qA}m_!P2eU(xy*&nREJmnVr5BvAOyx;Ag;NV^;r;A5#SMskr zt1>LWoO|PX_>LQm7|6>qw3mpyn1=mJkd7j4&^oXsMD=1VxoI%q8CWjD$b+1GqTg_Q;_1^a93n%=e*O%?ZXu#S*BcQSlpdW2bdv@nCN6 z@k$l(u~yg#lW8=k@1iq^RD?(QFFjwrj^|8)HQ*+Neyzc#7=82mem*YrGRD5{ZQeMD zf9>$`^qdI@8-1dE{M2O6X;e!30r9xxt&{s`+PlC%?#?s#$E|W0PHQM6uZ18oZF4{| zK)72ViLh~Kh&au*9RWN!x`EBGY>h`=`lr>}j@dE)kM@I>McFIPfr;0@lIah1KI2OB z`+Y;fMo@a8=K45UStt;-_okmIKn{qHg)AWovr0q~-|`D$EIhIVyJ?+MjX?iTS0M&g zc%`J;6@}>Kp1{C$Nu~huMR*MJ@43PfU^Zf0Tv*~0n`tnmv7ZM5uJA|E<*0y ztLG|WTp|@!Rka!pp;Tn^L&sHddmgjU0f~Kx18Xdd63as|m**5{?~qdh%@kw2pKQ?E zl$FmQBocoHk44l;od>*Gq1=YN5TcC_m<#uhD!?>}%cr5Qx-9js0pE%hyT8)-q48Kx z3)vJbzK|ceden@m*hJ}_H@h!B=sFcM+B}G!k98>PUFtDp+UT5-f8vk#+83R)(UsN; zt??kNYbqx0hMFaR>ZcY;{o;~FUARA5o3Ed?Ek>ywi~n|^B{FaTsre&&E~=(!&S&|l z1*X2mUUI@9JIPk=D0kXXzh^#9UO%~^Ch>nvWd?>kGup_lbZh8q5@NC=2<40D?;3L| zP?8kx8Gr}jt-aMSg-!FwZNs}S92Hf^)^5n(M&Q?GEq_HYpP@H@eq9@tM2cqgIxf#` zbG#JvaV$!}X*M1`RGmVuK~CKX@taw83D(!DXG*z}=u8x-c*wzBFuS+BRh2bZDgOrb z^qp!g!lhN>RA|GWvZnt9jxkZMNLZ1zatA#hC_{U&USQ%f?3~xrJNdR^O|uv81bl{y z4Q+fL9R~g=)iUM3j-lJ-JN`S}aj4O+1e9C5~d%^>+@%8baloi(B(89`1X zK)LTTQXOS;OSCKjU;nj7B$mcz$Glk@sKm9Eay{29gm=`ZI{JV4uA_M?Z9L3wHtMIW zA`|b}lwLiTQzQe9&UfS*E#S*f%=KsRkA9yf{CV@&u#{kBW~8b5+}Z_`cCb3l>)_lX z-G=tTz0sS&Hhws!6@MoZB}ow48aMU%j;g#}rs>9f8E?DynnqT7j`#WecnXW{dk+b% z|0N;+N1lC*56&Xcj^JN+P1j1Siv0fw`^um=u&rAlNaKw=G&CN92ZyF{LV~-y1q&85 zNaOC3;E(`;U?E6wcL;95J-9o(p8M|1 zYs}!v2WB=O!(e*|vJsS5<1eFZbpYD((UREIlL8t94)CpDrZLM-@wj+#8@oRpz$1D| z8l>hTWu$cby<2tRFn_WvvQP{7b|;$Ec$oU0hBRJ3e6pN$eHBDi&L(owLUcu`8tG~p z9PMC4nz66Bc3)y);Tf<#PdVHpG{B*W^aLn65v7x4nYf)56 z?0XJL{C#jaBx3s^48(8^M13xOUCVWt))0#4V3se+Mi8J0*F}&ld|8tCd$)7zGA*c_ z>bgn9@MHlxfRiuaT&XIai7epmgtU>Lmu(sh#Zj_VT#aKdl?mJJhwlMOPDB)bNoqb! z8})fl1w5(9Gu0d*k^J=Qv*Y3>1D)K@2^qwVi(TTYRK2*roTxpGi1PA4E)T3*csR(E zD5ZSI8fZX3vDqjHOBJnyO2Lh;i`LC*>_$A>iSvu&tJQO$M!YP1#Qi@x)!$}TQbEq3 zd1kE&2&iHPJ<``&NC?J|JE;+tg#TT7DP^b(~3^Xv0XDxewTxud}`LnuuxsfDQYwAR} z7VO{DFWs)3*88lIRR8_{>W{WQx`Z^Lm z29Sw0Grnh@b_(lxYxexuC*Xxkbf(?CDZ{txAd3@)M&boewJn@!O~tG)fB;EEvMbx`9uIDJn!?Ue`4*HQctl9Ay*)@=Vq3jWszC23>~ zP4)W8Rs>T@!3@VQQVg_n0SHnjk{kIFAiL+p@MN(*K?3OrCZe)unULe9f({Bjw!I{0 zU~Hsb3~}B^g)*O}_weELX?7{>8%?**ghn}hr-jV^wJ1gy4n!7fnk8XkMf}uLzgmY@ zsS6&UXK#mSiiy2a8aX<_8|PkrN8gDY*`n7UCh@-w*tNf%DZDmp@z>KgPQPeuipoFP zkMZ4H*=+|Mopx^wXn!L>tLFqXwhVnxrAHRdXt?AG4z^6)Jlb%#S}S24dhWLqH~HC& zQpLvVHKix@ZN5z#e5li`XQ*hwfS9^&7t^LEWs;i>F4>j`THE~)3{4{t*jkJ5RKANA z$2fV?KqnphK=|GR9>?GT8TAi)c2^^YPX2Xxt;TfA9NX8TO{zDc`G{~jg`l^ASXe&W zr@Vqoi6KDEio-n`7xMmD2A+YZGCZ1oWtM5h(U3+*xWg z*-mC+{9NHUyKz2L{Mfu_rV*ZjDJxFZ(e9~k)s}(2r?9ZDeAN%zv-@?w;$P!V{kkUI z#+Ih)pQ{caBqF5t;(kP-X&hRG^PW0Q!l)%_G7&Zp!wK4F5O#zJlpJ7^btkAE6>s%i zch>ghnC=9qx)|Q$2-$c8I~2hN@FeS-{qz;;j?65}V> z)WpsGxXHovooC5lg|DblbkpDEy8m#ObWT66jkj#EM`H`Od$gyj3LJ$+am=f-r8K2n zDq0?6q+>=jS=TT4Ou!L$uXTLDYVhiy`Y13pg@5`)xJESL;BmIlfG}uVd9r=M7Fr%# z8{@WaZ|4%kk}15c)vevbYX^P%fB?6rB?|n0iXvT2E|=QG;*R_ccCZL|bK`5%YmZ|7 zEo?XV&z@mQq_-zk9i+o_86n!9{@*1i)rH7@xf0{Z44JS|%AV`z`zZ_+!e=c*##Xke z(%$prruIKgZK<%rQ*`HE?hWqP=D1lo3Vu?&N*xw3D6igw}9O`@=m(2^`ayl3(J=k*MQ)JW~=toF7dpKS!#%1v=dysXV>j=m3H+E#;( zzE;ktk-Q6R2nO^L2h2^WsWMF)n^=bhN+>7cm&ra3)4nzbafC7hx_SqeK@C?YMvlTS zMH~1&B`dTTWN107_b=P#&+!=MQgV1`kvJ_&5FpbgzfSf>p`mDGyV7-P07lDUyiwkK z({>sWN8bq@zP4=EDl31}xX5?YDSNA?*D+H;R3mF3B3q)4(4HH4qt&488fg5KY&5Y_yj?%8h(AvOWG`$wT z<;lFpaGgsC=EpLpDQCk>!3>yoPX@v<>JXX#S|QDz!d?lsvinwE4bvNyY%Q{FTm1Uw zZSdv%wsu{(kF*`7`ajJABj6Re6rdEc{wOk*4HA;rW39zJ;PaS?=s{`0Gyw#O5AV|n z#jUFp>X$q4YevYfQp5czLjJv{;f&=?+_GDjSei%m(;+?ASL8hIy7Pz=MNnb>)zzEl zx~0F=1y!!<`1+fCdj@zYAHf*{%Pj~og!pL0@y2>jy^?VLJeB8coO~neP zI^OwuS8Cl+wFaBjm!}DHc5fwJeC)QM&~qJOrTg&|eru0)CU)IKFHna zYI%>AiPIZE+(6AB4He98n{$$0_injhb4TAboi1%$ zZ5+EE=nr?*&CO8BZyDaex6-!n=?++|9MC*U&egmLMsE(REtmFh7eOd=JeBMrJe3gZ zRp`D^&l9u5(aUGzkd0@-+eSdVOL5wCMIhw(ZE+?6V&e~4@09RVHwAkQbi+N3-o!4E z19S6SB>~)&%^y|2cvt6~xR--kZKQtXf!z4waM8eHW7IQbA(}DD+Kb+{9Q)DUxaHpK z!__83RFjy^&D-+|evNk@IsjWBN@M{{+KX_nH{@R>M?Hqi`V@nOBb->z@=fISiGFlK zJ@EY)COS`>AfOSrfY^UE=D*r{8|yWf6_U0Hn5DOJca!-D3Aj)hIqh;WF3%V!|i%!c+x_-<8AlYrnyo<3jUS;4fE^72|d14KhLAV_ zzQ%L@)aU;HdFiT4BZ%0Fcr)|@4EY77*!Glj0Rq|t59>vTA33eJ!`_q1<+s8{lD%n( zRkHX`>)Q6)!+=Gtj7i{NUlWRxNiMHF*KqQ)yU%&F(_j^t=CenKw#0rEcEa%f2tkzT z2-H$WDZzBV$=krfu5a<>F7#3ARN_Pr4@7Y&?jy{j5gZi(>l$$KKPoOLX`6r z?K&4V7uWUTuj8X=NM?+KFC*E#bmmLk9sGFV%VHG{)O$;`hw3@ug4{xT9CmcHdM3bO z$ra`8epu1vec0F5-b|u!AU$>PyKU`iD&nmF_1gK%|NfQ4$a#j;zI4&G!PU~j!$xCZb)JZI%)tS zck!9Fqtn#DTe0A8>_$$p(U1a^S}dHpw-5XjGd6S*pv>RqagbqlpR(AItkthE8uk>%Wxg#SxTF?9kiRT6S==j!R;5&X!NzCVN4!F=`P=X!c#m_Danx;Wt9J% zjQ~*+q2*ZyGz0suvuc%>Xf^z)5IVLvz29YMw5>v$&8~xJ`t;S&D$OcLApIkFG()RU zB11{f0Lf~U3a5GnM}e5y#>jg7W>68e-@#mgDIdiv6>@v2H=(KVTI=4*%XRY038ST= z_)wpm6DM2>W~(E>nigQIZ=)O$IML^?hNp;Xc)MrTtb9yfG@GZN-cR|D!Bxo6q?kY$VT{P zc&dKBqKA#m{<-iMv5%u>g`cjs&hVaFr%PemdJ|H9cKNJ%>Nn#}VBJ(!^75#WNvDQw zHi5x2%%bO%u%|M!PZ0^5sJAl-M?iWME4M+L&{eGou;3cZs`*y!rG_h%n73572ox9PHg$#?qZaMr4BYwtGm zzHxZ=@$%5@au98{AVGAyFgUj6IuNY@FD_90q0Op=hDByJOu}$6KFF4k{OtLIqzdzB zFVq8ln%(WgjV>%AZClQHb%CGS#qdpR{oz)a^VQ0lY{Sv`7Osc)s@C~vKGmG@yPms? zq2`}QV+YPzJWDN78qFra$#5mpu@iz`eJ-mE;oAt_ml-~KHSa?s!Z&vfo}NTwqAc_S z@3S)M@us&JwCHSq=#;*9_5Kk<;JtEP$fOaSgneIfVA)00tj+t4qK`g3fuxOnkd?OTce45!YwS?%*hYah%^kzwGflO))qMV}6gha^&&&v3*NK2zb-s zldD8wCXwW4i|;l0Q1pG*XaKd{#|;+JpRo*B=8%|j4x|V$H2TBD@Z)P8l?D-SyJa3o zIB<9OLKFGOW=Lmb%qrTJIe_1XQ2Fo|J`sKh|7q=H7LONR=gCRsJg&k|Twg5bThcCh zRp%r-`rtgN*W6Gly!Nf*hP~EhzGEZigI|*atB=|8hmN1d>*eTm@}&i!YV<%LKSA#$ zMM{kgRM1tPTlo|7nub=O#x`#f^MBa%Pbd7Bf&E)}Rh$st>0K_MvY02t5}V`7pkbWg z#^OW*p!CS!tfAki`oIF3gE#!M_tm6N)`8o2EcZ1(`sP%gPk3g{R_dMll?m?eITus0 z@a=n@gbVlcC@oU6!&PppFNUTu+R@k>)Br7PeGJSl&H%MI*p+;Ok`%VY8HkdF7%ylp z-qcVNU4kAhH+Dw_#&{cO(6MtkHckJD88e9stG|0u%=2TkfS~nz z4#?K@{rwc$-Nl7|$~57PGRZb#utfRi?AL;IZ=1bIxR_eaPDI}Df#;MM(8(6BVGEc> zmy6EF&zFQq^G1B8!l3iiEgin6P}B|&dX!O_@5jf+g+>FzJVvMLE19n70n~_h!M&_r zQuLVrGUFdtLKZPVzk2IO)@3xq)Mf8HTCp$c2P_9hQ=T-6$d}$#%J{*Iz@Q&3j_f}m zd=v&^-O^+aUC&%!`05GG*v+!;?k}A|YWva0z?XLxo@a|K6+}9A$j{uyaQVV3`-(mY zKUzr4@6pD-!pu6}s;nM(6@kuYx=tHy$2P~RJkW-&mQVMGKmD(}`L`W^vb=Xt>3Gtt zCh!9Mab&8Gf|?7p6L$axz%R(r0S21#p5bx%pbJ;56%l-(xd>t5@&fyV5bQ|&!7ux>{g`b2`S~vBb#w6>@A1|fUUYJ|W z&ZvKGe1v6}UtfKy9MV$CX*xC&+_Uv2@qov9IEG5EA14x_#d})q!Q;F(=E9PyvYhs~ zARhjZdC+G}N~UV(b*p&G*~30|B^YhpK%WuAWZXE(Sx9pTf@{LVNAYI=ar0r$Cm zy&i0)!P6^QI@O{@y9oQ;pL;NHYzd$1E&`UzrFmK!x0L7pyv71Cz}B(OGC9@WS28Wf zW>kFsa7bp}l9}McFB*AeliZZ?LEetLQYGxwi~cgSU;4Rx7vfMpik8`vh^K6J^cSi8 zK0}bFyZi>+i)=4yAh+VzCr0-Pj;nUC)>mkL!JIadsT9Daf-6)83#^Dr(N}O7&Q*UU zWb)bJ^WS&%zue+wDH(+3ai2#}fOgG|N(W>YGK^)4)+c&@Z1PMO*e4+~Y*L*QMHh5I zkGbM`xo{z7aJe9XzP;)SOwHBOz#(h-S*$nZ*f>M?q^Ydbu!;S3jDYXX$IOlN!b5i9 ztlNmoNo`7lrK3^0*YETgGh6roOhaf`ejIYpi|{aL6eXcl&I^1~>Vh14z^e%IbqL!> zzqGaWx-!gzVv-G5GfFp+Ey+)-7{zw>u!c#Km@D)u(*6#`v@xb7yuMP0QjxoJGQnO6 zK=6=-(L!A{=E$1Zqea?P!H>5if^;vB1{xqs@7i|V$XJ+tFItn#1fn6nEagQ=Qi z=4VySJvU~D)Mq6(M4r9cKmG1s(bx|$%Hb|N$ZkBX^&QLV`2_BTy5+}PG;{TNMQyb3 z_P)`3PZ9BQHvujx_?Z(*LG&j~{6EauPNTb!xAQc*8eeSL8(S4ujz$E3Fc$LzB08Xe z=2P6gcIDtLo|%ARsVF3h64th`g_&JiV)_;%>-FjSMq!!gS39xCXB!i0Bi0(2Y)x0I z7bjOK97!Z^ArxiPDt=FWzL8G&)V=(fI?#T$Yl%z_RF=bOk2e9KGh7$q1$ZQBC%`8Z*5&8MwNr2d<6t>Aup2*Nsx%(W0_9`AS2V1UaN!0VrghB z>9Ymcv7~amqGtL*fZ1b{#o<^27dpH!==R8100%z+1ikWSnsIaXRTU;29vn{kI?^

qE}Qb^?*!|i4NWn%ZM!NXM|L|-J5#lea#r&;XhDEY@DxfYIrk>U!pyTx zOqR{W(*W-NXG@#kCp|w5D#_*h)uNPa#l`2bvtwy3oUui|9hOiy&gREh@;dK=oxy|( zE;uIOZB+sj(L?VcB6SJ&9XzT9k)+A6eAPr8Y9bk{#(|S@`J-)wx-NW=ib0 z`f>)A>S{5~U`?i-Iw%5hA(@!NCp8YbfAf-M4+#))cfA-j+qQ~;ePX0&l+w(q4tK9-iA>a_%==WWFdKM{$+>6eWJejf@wrSJCMzp_rQA=fP4 zpO##6VjU7qsNhlyPyuCy`MRRj)>q|&?p}&xP>X*yBcg1pPxj730c46t@x*_LsCnXw zb2YXvjM%&&N9={N44SPuhzZk^dNlB;?W-aVcfh?@1XnJaHApU(%(0B_E04uSf8s!J zs*kVES9i6iMsz#D3wi@!+=x$W)3r2G)8=`%p*5YWMCnAv`j#jJVZdudvJgPYb*M&B9ZG7o4KOAu@Kr(Uq+L|u!!4Wn@%c*}yBP^5(t zkwI7c!gR%{aXMP#zg z^b@1I`;%o7KgYV`3M0DZ>+fW3C(mvMCP;2aKeUJ&aW zb#QQpt2jn~7$i|1>RB*TDvkLfFHV*SiG?{^x;lp*%_JiRpz2!%j?o!kE6{j7z>w-E zDR{m94b3Z8x@76A)mzW)hZffI<|<*I+I!`rtyLNar>XYX`S?I_zCLRR6zj7JOdR!B z46#C$vcjoct@81Vq&7(xin8rIqczxO%qqfjP+JRa?};Hihj~gndd z0{guMck@LXLZdK88Ya*+frmmKj>dsC?mW5ph0OUPz2a_VRlZv#TWi~$*)7NS5Iw%E zTdyR=MzQ;nrKoARDp!Z{JQUVD10aaV^(GE&rNs? zoCF?A*g6Op7DX?m3d~ZHi2Hap&&Mry<7qHD%=LO-GpqW$zE_ub6k)Yxzc-t~ah51Y z658SIY1QRq>T>Bms(by7^Os@YrZ6!xw_7}hBJc&NU~f2t`gw0GzGMMt-KaP|2&mDU z5AT?Ur?kFE8Oe*}Q4c}vv9Cswcir|TM42mVV|{XJ36eh2EcEXvU-EA8?1#H)LYQMO z95A;@e80V$`znTWU@tO4yVPX&Qoh+`HEsrkOE$7feBBx87UF2Q_+u*;K7`?PFu7rW z_*iepm9qGFz4Q$CuH#Tw@NCuTLGf4w6W8g(1(mPd-chh~Y3iCq{-AR+y7(JA9Ok@5v3!aM<`Vn* zHgO(Dy@6Y?A8OT-q8yC0-r)#vB>sPK?+Gn}pH0mhL^0LNL>YQ_%13F{xJ0i_h|Hio z6oeKJB9x86j=>Wyu!i!8lX)||De)d4Iat)B z_WYUmK)HE7rXV~3yL=ZSmFcu8qqJGN0SC>xU_TNmYG9x^5Po-5f$#1FD({J(0oG}# z!NfM3qUSX}jD6A|wA@3%C|ENWvAKRccOQ4T;F&k6+&6-=AKXn!3k$oNvb1XEqwkW= z)-JjhZEvS)E&`aE*7(>%x3FX1PG5QBa-xg;B#G@Q1#zCbUpL-vSXqkLKgscB;eSYl z@H-c zdqO>DL8`!T8Bnl!HAq2FHU;}&LdOfg?N0*(-b>B(Vz;xxS02WsMia$hDc7&-|=qC0JN|D!eIS8fO&$(>3(wth|UPcca#BX~kZ$AId z0Y+wge9o3n68HHpFl!AD5ofD$85){)Ot10pW<*M!r7rf(8?=38X=&#Ya8gvfFZlB3 z9I3BOVko9{Qf(LC^pBdk#ft0m4f|6&;L(KNLkA7Vh<$xW_B0(;+&2C{;iR!V(EpJa z%{B=8MrK8e!IKG$LTdm$iG>RgfIFOAXI{ht)noD2j!on-+K)}4Y*kycRtd0nzukBG z+bYRiZ$6dsNc;$v!4ewV4TX4kdXCJKb8Wl471Mk7z#kJuikwN!W%@%A4A5vtC31ss z6;p14-67m`$QJ7$rn9}J(6v_G&YUP>DLQ2tTqG4hCny0{^(<@N%4|5fUXH6dc6?0T z!X%uU3$nm_?lR@`tAfEgZa{2Mi#-GSU+_ zoME#7I(#8Twum-!!=g&( zA!{Qg-HXOo{V9>}lvmH$J#XWyid3EVz~U}q7n4cw>fT@QxQ(~0m~%j)8=Z>FhgJim zS>MfDm<##o$oFHXLewkvSOA!Hig&A; z7tRAr4?S~Y6gDPVa{nC6jNbsQ-zi_Fw^Lv&vGn7O_K3->a`6Ezq>yc8!@J&?(4*4A zxg$W=LJA~>BjH<(h6nJKf-rWH9?hAu(bP7rz0@&@4=by?(HoFw${dTpRnuiN{ZUfh ztbfq3J8rSGD4J=xLeGcx2A_9(_lpWFW2Pg&>(?7o(4)sh&b>=Hr_hg|h6RckC-CX8 zquH$>kiw}4cU;iVY^)aEZY8Q5&ECuqSw_>c)n8IGuMDG+*DPQnk$c3&Bap0&!e_!4 zUhfrfcxgB0r}V_kP<(X~OqGY671S(k`3u}B-o+Yo1(%BUALTDov}_pVk9O|1arich zTy4ZQWPU{vF1^R0d2z4&3**}%n(}n2XY-Vv!CZPRCdKx^C{sf#_PJU&l#6`|7nyk1 zeGiQAv}FA4UddDJ-wFpmz&|+BzKZnI3D0P2&u*J8e6WCI)nKF9>iK=)@cSix`5nQk zL)%%Wy-T3qF8RL3@iDl{=JdH*!}r6lEgA>6KmEkl^w(tP9niJ9SYPfd5&h-||AiX{ zJOLZOQ~55_VPzYmaT%NUQy$9013Gi#3ly9r;FW*;ULJb8b=V~JJ zyt^0RlDd7Psw7Gc2f8pqWK$p*WhJdLi!#Uuj3&s^dyB}`>pMUSzV9i6?Iu~g>Hw$y zv=o~5awXeHp}3jj+OkdqEKm@rWO{|8Jn04SFDByk z%`d&T_h_JK-YD!3aWUlAi0AOx-0Ht5JcO=UCz3`%R>xCL%~`q}#AZP!8j1}OTcsH_ zA)ze!K37=%Z|XD8xFc28BSM-V1t$PyQz10(b`_}&wrH$VYv*q1yqB-Pg2bUG%8?JlrFqZ+-gnP@8@h+rHC( z=)e{;V6wxCAu#Kt0eY{7amEG8VO34QpNH_yna&(m7~y(+u*h7T=zttlhWC93DfM$} zajZa@B3<wWW+z1VYV$DIv~ppd^qIq>2I z|DR7TxTjN+255_K34IsiWIO8e{KDI|>q`Z(`w)5C>{dgQ@~Z!pw&`_5)9by+tEUcE zi_TrqOY_ONU0-4s3>_Y>LPLYU-LhisCKLQq41)g=Vx&!`FJ)tA*^Kf?$mnr2d*ia0 z@4N6!e5*k~e>hgXNYWu+&mk+YLvvP+Bt)LQ?V8E)^q6BYb>vp#%k;IF^?CS!v-^cn zv^uR56m<#DOr?C0K_Yv{;3#GQBIpa`U8B`$!spuztjH$(>}7R6;)H#44z%Wp$l?>y4t zmIpUS)~}kc06#@R)P_C2mYdj&ofbsHeX5AW13tMaX32UpFHWOKf7)E7#1X1W`QuiS z?<9RfWY<+#6VG4c`XzM<`3sKUjf0O=X+8Yyba~cf#VJ1?yD8ccIm9Ae_^kR_tnW6KW7zFZ~0c!tM<_dw5{T;yPF?`=P;%{H|H-GyR-f+kePvbSUY!is% zye0^lj{HfJ@cck9(jc>T5pJM)ENRjPy!N)s{r!i(c4sq1abU-|ydDuEIA8zayCZvv zRykyy|NTX)DFMvT%SN{T@c_cr;&3?foXi}D`8mkJwIEBdSLPx-zZ1yC3`X(Pp?(1Rdx4=$4Y%_oBZn;&dWo{-plgST#)8_m}ya7S3V-Oq2Cvma;(^497O z7+cIOpWif>00Jac9L)v&5F^Q5hcz~a4sYIwh`?{d-jj`~mg{66lh*`mvEOj!i}?so zXGU1|&|RYIsb=8AjY`$QD(%W5sUu(u8V{VcyhXL5$vm`NER-x)31Vi^ZlJ&0T$4j6^^_9F=CTi5bG{ZpDuC?4wdymfo{`Z?k9KgngqFr0DrQ?yeW2k2CB5DpVsz_MgJZa!)NRuUde zUnWb6wxIM03&2^HU5GIpiXA-Mi)y-LnuU?zwpnuduKnF-vijvhbkYZ2?x&clIQ@F& zY^mc1HszKjQ8-cwKmc?q#CeX>Zf@We^X|xZxR{w6gxlvMd+ljGytCi&0U{AwX8O|g zL%<5JYTR==mR_}_OE}L6Ku#*4NzG*AV~%xqhy*39q)(A_OHqx{qgeC{ZAaJ|YV;y~ z>;WKE_zVqmag(V^{zY`PUn2kNUqU16i;4AVMO}-fRPVb}D1ZC&Ou=H@b6RmfTsFe@ z!c1*fgZ3}`{MUmP;6@(g*Imd5$$|)2zR(<&3u+iw@s z@Ah$1&p)s$GIWm#J6uOs?bgfYQLcpw@IeIqGUPv)z2`{GaY~l zOBl4_Ekuv{`z6QAg+($-`dAn(st!E}@&c<91b-aLLuGJGJ3%$a`JEm?GgWXca~>V+ z5lq=C-+>)&>Ju~@8DGf+A7v{0xI!%F_sQ{u=H~oThtiCHjK$V!-ztY<>W z9qzNF=3)*vjhEqNp%(3NCzA(A(au;Vgt2vnk#dAdJdY*+h4?&INx^ne!3}~6^zZ6n zqk1wYhw@wCqa;H1N#uO9?fIFpCR(#gmu1OUFE6h0H3 zbZ1i7dsDU?8LTRJBI>Is7ksPEm#D_%L}qhOM_7$Kvyhx=93ETQ_su63lb_YpDpBO& zetg#dlq1Fa;7YQBSt#=rBjOVa#ZFQwSK3Oeb%DwzVk+w-(oVBZaU5<{;JU}~co_MU zRkR+QK-sY;MT+HWg^OIYnqbOl%dF45hDSbk7>MRngca@d>$Hb&k(6YRPMn$UU8aJeGMOL4mo!D^tXS#tXn$AZPCkGYPOJwCemnVyUPuq zfBB7OMkV^!nu}q$DE+-apA}BLzcCG-XfHhJh9Riai`Bbv6E)8OZ^NN6aY{4@uVyeG z51|{fo10y)Ro%e{Bg~hpeeE=RE%5t6uK}DsRQL-~-&O5W(cBfq5bBAqPbUB438O_K z$Pvt5EQdqS;W3Mx_p7NK*86YyUE(2rKptZAep$S=PW7D(?k8lt@!LEGnDK-;@17OxBxzspS$gA6cCfxYClemjqX z0Mod5zJv^}t)9UBTHbubXOvuk)_^#|9i(NCJy*OC;R++`(7=ifc$|=;nfXb|VvR(` zoTtCS%te{Ih4(e;N)4{?a0B30W780h0|G*tZ1&6PU#`Y z>AHOPvZr5U##F=+{17t|@;Pfl2$6ncU}O|Tm?ilc4TvfR6`H$Lw=yuX6ujkRDt;~A4>VVO(T|0!;iC++Hdh%#IJv55J`@oYDZ>a+Mv(if~bje=s}z*Zh0qVr7z&$?dz)aTCMf5X3|VX%~CC##~9{ zZkI+y%lCRiKqhL#j)z_^PAa~K-NYEILZ1%)CO)e%?UPfg>t_2*7Y_Dxs7)vRksDdU zQAaDZ8WQ{T&dViUy&zljpcI*Y<7$u;ZabH$yU)x|$`}IJ-REST#dU&1=1O@U8r1pO zXSyG$q7wrLyRBV3eMrN^=@>6#|^r8DDYeSh;j+{|ZNGoW)epOB`$ef2lYa53L6Y=_C{eBe2ZSOwQ z3uWdJg_l~oktXTo<*U~w1jhy=61d%lQ$Hj5k-G_{*eXZ=%@*NT#L4N8Q-pQMfB7Gb z?|*;LW=0mb?QJHP@985_3xkFgAe|`T`wMxxyK8(o<%_lp=zSXfGQcdIvnHC%#x~#t zK1uslr{Q8yvl?Mc6$sb5c~>LidT5kZb3c6&DuD%0^uz~rhe4U22=)RbZ!ZON;j5D`Re4Y2HqZ3S4E)uaFz^BCE{6DdJZ}yf8ftllp{tE?&QzY%~6KoGh;_ zKM83xbew{QYAHg%QL*6aRku{x|V3M#MuXrfr~LLJctHQjmyEq_vcP z&)JSlhfGG>3zsE@ckrN94xTQe(qsB$7_T5>fK{|RiE;G9p+9Je(pf%mH0IjPx!SPS zfOg=AS>xbaA@b0>^>XRpwPzfE98)?{P^>2%Dy@XF4C?!@%upz*tqLrv6Y2~Mqhf?% zIZNQd+GWPn2Q6C%0`>(2d%2T~);jrkjGsDxP!P7`+o{pn|DND)yacLp>jX_mL)gmK zuF_z~lG!f9erkf#V&i3K2M>u=@a8hjOsSk^ipx6V~*WRZA- z;?z9eecMnd>l0dQZb9a72}P_boS&AnknXc>C|OhQq=JFkW3QFwP6C}j1bwJAL87ef zH$QXQ{=*X`dtNI2CvyM(YXSiOiMWyH&cU)!=z<*(CSK~4fGkf4MYfHHSA&t#O-Z=` z$XHAUSEq_aM`7$B9skaNNBz*xa)N7v1O4zP2`!OcoGYBV8Tp>MSloWab-f9cgU*F6 zh%bsW0!X5MAtl7c^UF;+jVUppqR0b0DW7e^i!<Fiia{{uw{13% z&RJ)~PG?S{qS%+lgZGz(rkDxrC|uhI!eTmx3ttX+%Laa2WH5oeDm7c*9J_<&gfXpVjFd7m&l|7|ot zlNh@wehS_Y#bXUd(V>Fhad&e%@0_noGJqFU8Ni8$kh??MPZ>?uH_iv1({6lRgfw-R zJR2x7*tQ$XvDn2_4zkQ8Qj~nZ>@kqDij-7w;ZYW)ZSkk2u~`&I$~i7|yg5)LDJa)2 z_V@?dUMaN>TrD2G@4Qrqfy(0L&cpb}9-tM$A14y`D6NNu9TRAP9 zHQjW6TZnXfcdC>c8b#R|3GXJcM|pDcYOrvgfZIkd?Xuzt(AW4i{hdET63tAEpYA$n zMkmQicYaOqEW7y9F_^DxepZ~nh~@@5@$C%Wcb}&-JQiDy_dg*O@ei*B7#A1+=E}br z;NR8=4M32?xlY3b@y1Okql>JmXpug*cFIVT#@0p83&sny6b+0c2qwP{?92g?X_zX< z1!hR85OD=t_J8_X&h}x%PmT3$=MFppN4<2?Rdt^3EkA72KR10!k1GAXGe>0%6e;r>AgX@oxiW43v@7mpO5 z^hb8$Q)Oy%Kmr@kmw~Q=v%ep{p*^{T4&F3F!Bs>xoisvW0}H}ta)=X0 z!N)z}P!K>6uNRE^Tou?4Jqi<(161Z`ZE}Vr&uaJ3$b?SmJ*N>kj|wMrBp(?K|oTF z?(SA;Pyy+d?(Xg`>0TQCkKgzGgzs+XC=p~ zK~PW)RgsoW*T5IE-b$M*-DjUZ?k`5ot8%TK^0s9Yb-c| z5V{t+>M*^%GD8Y>x0$J#%ec;T!CcWrSn23y21&WR{PtNvF`WU>3|^=SVC}IbllnKq zuq=l+9AhXOnvq8Q{|f;;L9vc2&jMwzBm}aGyeSaNK*nF;fIK)DVqCVx_BNW5IWQRZ z`6ByEY&0U0?3q#Chj$OY_WL!M_`(IVda#yKFxl!3C336vj$r zgzPR0vZ?2unS_}~gYily)KXEX4iEy>F#|a3s(pWh^u~5jhI~Aa`=&>*%vM-d zRe4=UaaA$eSD&CFNk%Fg`?JWveo({}nu< z9vx(C^{zl zv*p0kUV!5^iR4Z9)?Q`H<)2h#JBXI>SZZ72RPjE?lAyx-;hVy17$$6w^_3>pFIsRU zH+I&SWIPLX#x@f-0aGWZK0cHf9Z^Haj5F+6Xzd?rF%4x9K&1J$<_-QGbbU-Bnuqgh zONwc$XIfYD7XSX@cj1+YizM=yCWJU97K|t%C3TJ7Dh)JP(ZN8!9TRxUGMHr1eks8% z*&eeOeW5plFdY%hA+<6{o2rw$F)SHIvM!F(BSNrJZYBFNJ?~?6gQFqBM=c2>F)(f?upez!tVD zjegVg&lWBXYc`gBa-N#A6TM`nYco@y5F{K=^+))IAay-Ps%kE>+>>$bHfkh0rUetQ zh&LVuvj{se%fZT7PQaYwG_KKj?2s6g^Kkn0uh=YLd|7;sr=nn@G^bvEZ8hgcJU?C% z*e|)F4k+sW!i~KP{4?5%!n=)tt@O>V4;2ldZv1X<1mm(CN_oE#_3%$EMk(P~?YV3) zP#F`u2q&0}uI{xjs+^1>4p}UBffrWDaV**L^Ah)~g}^HGI~dsB9-reG3_~ zC7h0~Pjmt&S2&f(&)QBi^%cCF-E5bG!EmxtRpTzprlxoYuqllohTNp zO(lmkC>gB_21=l_8moyiK0~z)K40U$Qhtr-mz>LF%k0m7&EpHP;@Su9nyzS|FAf-p zSvKXeO6GDz7YgEi9Z~%;Av%a7W1f}>*t=()$mqFJ-L~d}-@i(BO&;dQ> zS79Wi)aa7Or3_TCTBRev#4U(@`$yaX`xucSYDrF+RA9#S5JS&Ec|rc^^k~44T{wjl z;7-E{G+yUNBMBt^iKTFmdfKu}ln>;Hfg2fPh1nZU8cfc2J``R;z8$(AN^b})c^G)? z4B5EU-`K_kNtd~zY3Ry6S`5V*jwdtzF5ET_)R>& z6p%kx6u$Akt1r2Aopiaqp>`PIx-tD&n-x)#g^!l@n{HpV_itF#(^}18IYl$CCksT% z3pC41EvuXMxXGJi9Npl;dhq)C{QApQwb*`f;ZutgoBIOx&1r&p*dWX$)=!@tiY5?~ z6WbfEJ!v(x2k8p+dDP*KPf%%JO_7QmaW+jSt>@e^fhOd+jRMJ|;-V+Uf!#-O=2#H-vWBawwcizBa|SKA5?#^UBH+h zv5$r&x1E4IM6nq`07;5U%G}Oy*h&g}b;JOwKFw*Uh#@f!g>XY+I{KoEN3?w1Rc?@a zkUY3iCXm*$v4W2_hc)hca<-?k+9II zvBvQIA@5Ax5^JsVT4{FO^tyiwm{mc&)OtWM6<5wv65!*=?l;zRpx;v-?c6*5o~ zEV80#7S5VXGwzSF#b1Zdn&ZZA*R*Dt7B1PU2(;1a6l&Jx6%R~pZ<=YO)(|_{u+8m% zs->Kx;yoE=8Sxy|-qfDEU0Ycsk^$z*&OcFpj`{4tFv8evp=10b+<1c*ASR;&xl|wB zfU{JhBLTWqz6)1?&CJl{+tUGgwX*s}iP?V@ILjazaoNz+W+27>1#@h*X_ggr8dVu_ z^z7aR2w05RyWW+gU)kGg4C;xMIvw>xxl3y>{($!W&81P^g~hx0buk>VC1Y|VP$haF zT6B`&_EkJzE-rp@q*lDMu30|;W~_&2 zvr)IxMC$qmDFJKj!A5)7hiP=AZf@LJDw85Bug&|iyF9n>Iz%oRS)5*THu*t02^j_> zdS*H}^NYmYG?Unutao6D0hEUI zeoz!maw#;y)0F(a&X-9f0>8eZl*V|NA`e-6vUv;Uw#=&aVSR&?;UtQ?Kcx5 zi&Z9Uh2|oYinP*oLZ9XHaZ|-_{-B^}Ru34TrKg#Nf~9}aU6V~`#!T`HSIDJm_$C)I zh$9e@cXPCulS%yRNJ!|bKmcqRhLkV(PliqeA^yx+-DzjdDz7wQx+;drVpuvEGFCcy z8q_8i+|`yI8c5v0MxbM2Oq&1xTR?9Z8DwRxlQbodg+z?BAs;QbDn*A{X)X@c{OAvj zqKa=1gPO0$7}6U&vsZ}~5)MEj!3AM`^^T|xqz)lwOv2>2x;|!NEu6@b4_-d$mh{r% zO>vQS8K{|Jo#prFnoDb}24?Bs<8!9DoxscXONAaoxWsRdL_%^(#SF?QE}n26reXu5 z9Hwz4V-+1QxCIm9JW-{1qWwm3Eb>cK++E$mJ!9RUJ=aJ!O=3-FP7Y^v8no0MGKbw! zu*Zkz!jwc@%x2#4##FaN?GgPKxLzS3)`c4@V z^hAIu7)Ul{I7Zk)eQx+jZzKCwR@2=6G6u zfy*2B5lCm+GB5|otR!Z~g3h0$eH`%{`4L;!`)yy=bR9BjQP)KnV^w$^9BcKJYq1XX z!5KbSss`k0;q(~0oz=jDVQj5R_-@gyL@=CpPDv-rAM4Dgf?=m~bRqA?Gs z>AH;w^*eXl#jrRlHkZ%Y$+XuYzUow-Ghn zofPp05)NXU!>N-g$pZZ)jV?ex2 z!i^i48`5+}By&DS+Bchrn(?JXSz~~P>;1wWhgS7`??IZ|ZPgPFsRxBIv^_T2FGECl z9T;$<^pZk)Bo~ai)1h^97&IS+x%=9dTuCbkDSE3^GGD74&KjnFt~ZTm$e7cr5PPst z*OjGy=iy>-!9Bq~*KC?|i{=&pk)nk7>bLm;ttvDIW^j8tf8$^`ESO|GvTV0oA_3}u zPkRlaLp2$PDsXZ==w={uop%x#Yt0u9@H`uwt9fb@kzCl{ql{ELYrwNYrr52QB!h1*+-V- zl!NjZuAwTYQ+)ro+`G=v+nq80<5m#K1F~Y%OeNSaS7=ss~h$CM+2 zwdUe!g+F@+MRS=8CtCNQhjn)`p?SE+tq{8fo|AJ_{el&<02(Q+r^e}Z2{>f3{|d}&VE=N*Wo}C2+b|T- zUmFK~LtABq-v~v-dPs%niO#e1}@X08Uhrs-K2^TpfwN+edZJ063iiwQ`RCc z>Wd#;LjWetRS^KU_3=GISx-49XMeIAQBvCK$UknG9z*R!(qq_F71Vd2qja@qP4IM7 zXO7Qyn|d9S5i8Yb4n6*WBd5^qrNI7~gKV14_1?*qibX#sK~m|(>0SDU0X6i*8|c(i zMcbz=BiH${@v1_yQ40MB3Ne!XDR`e7D$m-lI2)k|l>&c1q2CeAz+8n~k$d#sqb}RF*mCedf7zuS)mxJmTK{3mcZ9_e&1V zX)yRzub-D0{90;STNIyMwOsO^AC=iEmKiL8w;j|@6-DL`hTX`6dw+?`iM&&0z?xa= zZeMGcqcMf~Jv&u#L?`(91?TZyTF?h@t%i={| zqCKuRcTCGlw|!UESJV)8=OADXC%yVoD8c*s$=?;q{}m#UG$2DADs;7J`A*v`(Bv=0 zZd+evYJqNfQbl}wRfrs!A_R%K+aziBr03mxrEkrsB@NFe^pB|=5_PNhGFh0HbPjH!kL=7r^=7(g>s`qV{eYM!c{)=JhtSpAgsk+4aUhnV-w}RVq;{}8Kn=Xd>sLI!> zx}=S&2k22p3@w(_RI^bTU;vl6qEY%B2}$1EhJsCv4)qGpD1rh+UM(vAEVQw(*_b?g zPVCi(S3!cD*>i?82$l@vVLaZ~{~)YC*bU$VKOP>K(PE2bUl@LDf@JFxH}NW~J^ax} zgNjqd6U^WO$7td+NJ9rElkbNzxAl-JjvnQ*QZ=9eY?WV1 z^oolAFfUyLKg86fF?T$>QoV)tHeXhR-~d`6*|)5> zz=$OeqnGpcZo$ne_4Y?xMKM;0_=xD+v2CWUJZW9uef^omEX6}pV6A}VF_W9IbeJ@j zgt418ChJuc{5It-VBVIv;;7 zV^)3O&3Jvgk9Gd)eJ0>5fR(BHD{>CN~_nWC(J$c8fbAX}4e zp!j0}vc8W@yX_~RH+2zj(0?Vk$VIy?qke8QL|k8SO>;vz6P#wzAm5`??lfm6Wnhwn z30L)W6Uc*~BcVoFzmuY2)CH}y&ZgK6J~Fw}R4-LJYdWsC?Co^W^U^qUJnizbLhKQG z8Q|=Gl>J+OIOz+36tymwgX70jsAz=OHP#M#7h$H4P*9*Y(Y12vpa^txV+5BAs z<%ZtQO-`R`X5FcrRWEgXyN+gROavf+Yx~vY&8%}UvFN@U86Q7`3>5_e>dr^BXD1Crc zpwwq9I`uG3E&iA$3m6(30($cG-2e>K-$T2i?U8U1j*~V6(!+K6BHGR7vC?8wod068 z^Zduf4>E&xF0%?=JK2XRY9FLF4j+#6sK-x548XWA7_qsYe^H^Yp?oU6HcL&f2=8ThJKfLtw!yl6&a(f<6i$;5L=!foxv zNa_Y%)9tr@#TN#CxbrukPew6^BF5Wz4Vq${s%G~HoJ@JmszS1RBZ_uSab}EJRAETC^l-a|!WYZuQW2R)6nxK89w7BO;#n1jY&q=(WzD)f3|1J7Kw9 z3YwDL5LI#0+RW**Mism8BoFQ2%@ALX=xk;`Wtu#ypVyD2RboSho3o^xrb=637haH{Dlt3JYIv@nrYOspHU;%m!T0rxLz$!43_+P%Tz{6 zhqdswzF?qwE`83Mz$JDXIW}50oh%H}-VKuhXBD1DqP)8Xuul*?sHQ;SSRzVjT9r9sV{#jIuQujuOL6-fnolXhRR6FkJJTbl8%BTQETnfFHoy(Lpbeb zdITS<%ijM?85~uOh4^pU+J8rW zKoPqH9++ZjJ8lyHh(+@3(K?<>K#WF8E({+MWreXS1L3#zpWb^>MM{I#QEEss?Dfps z&R&=aab|2hqte0E)R&wJTL{>iB9M z?letqPKy&C+;_Q+JQSb&d`J@`4;%JP$n49srunaZJvz~DmP;F+20BZoey!~#0?d%n@itL@Dd_x3rvG!g#lb1IVE-WA z*hTp-{^>g@xMm_LaQRESAWy-|8$!h?ydbZnF8(X4gf@dP=A(P&0dBejqI|`k9jp&I zOexvAW-fx5fd2tob?z&e*!-}l6< z51wJo$a74uSh9EK3=yJz;%CRX9o)N>ze7{61!&YQ9@sqKN;;;80XjLB8_ zMz#_o8cmcLr)T&EgQqNK?{0#k9HGBuxNeV%S>wbvhi9}8>l~EZ{^^n;6v^AmQlYY3 z>E|O#5md%kK6H+;qIs;dJO86??ZQCPu*qR(Ul*L8+RVK;cc1FcWa=S- zVlWt(e?!5nY_2k)|guxY69a@f9p$POSX|dA^wjnqkdj&fuHpUU-dETa+%-9pMdyIaUTvWoz4ReTsA)M<1WkecPYCmYX@B zr!##=%G15iVcj3aKtAJF<~FTVPE%2LJ)7Jc`Y4}&+`U?1P^|EFHE2oL{G?UEtq=FU zpABVORr@Bq-eJm`I_Iw9SU>$TNGsauQ>*8g8jT;qx{4neB3Q*&85PjM1d8MDSXaUE z+}7>1&Pm&k6s&Ww{Rkv|H&AC8J27|J{-7)V2+%}GKDNPXO}Ur{!Lko@iZ1*%+bOcM zDFwFQTV3XQm(PZ-6Ct)*5t@rGwVC5I@@#lA@PeI(1LiI?wRzlbcBEV-v2DE3Z(Q z!Mvr^4iwazD(|Z_xa<_Yw)6E_--s{w~7blSoEC*!oenH3|m|eA|yr z3G5cHc&T6)KCMj$63_&z_=!W2o*2g-^tp zHXoS(M$-Qqh;6lL#iPu(2+r%h@VtowktceOGLa`Jf9M8speiTnLB57_paGGrVQgtG zTgej-VatmzFe;+)2$%0>JU^+t#37{R*y17cQA*qd%%V()eGD;5FfQT-Zdzv>I5&<}Z((P+I!Ca{v3^;*LNmIBKX#gbvx+pr?*8lM0PU!ox76o% zwUkm+1^a~svF^T?aU;Hh_K>+FjZ!H340kYnysWSQC%8RgUQ3@fd{?&&y> zlSlHs2j#kU)P-T9fd{oUt+gAP-flKx-%p#828lgtIJrRgG`?c=Q~M5zZV5^k-x&2L z%wV^0dNrv~Pe1Jz(L%i^aciF!<1X;?gw8|-iRC27`S^SxCqXYrLM`a-OX%to6Ry|? zrC3h+0wO-B_ze?%c#%pnzO$e^jdxwmd%3qH_DXm9c%sbhh6v}RHIi)ug$}D`z@Jvl zVX|f_aVo_vLLRNr^SEnKn_b|rV%B!9NMr-e>pHQ_d1-WTC{Af!CCz2kX^gI`GXBAK z*D48)BGld$EK)H+f43fEK*bO&8@4Zf1|6!?@jKeAvZM?qd2M$83%z7Mwx*q^TAT2d#2F3n~+QeE)PiU2m6mEcZL)4@3h_}6ewHnj`H(^Vq6=ZeKB z)+YtB-ZU?DvC`kc|3UcjnIwk;hEg4Tjp=EfX@C9;G;WH_v(PLG6WglnV#it`Ql`|K zt6lkG=b*eP22Sukjg}rg7DFb}4ct!S5JNe=2gl=eO{3M<g&#XguJNj zn^+RD4~UB65lHXPPvAV{NRzuBn#NfrF+T1hhf+{sBbPa$iaXyPs9Hui2y>4#oV5ik z5q$^dWW@53LR^)u=z&{>ZIvd8>(wM3i9Fv~Wp-5jKbUW_1MA0mXf>x{Q?=!8VBhnMC)S`eqz?n^k`{16M2 z7y4T03jwt%LHw=(r9IT2u0vz1YOg(`WG?2eBx-H#cq1=xx6D{SMIZSaX}W%K;ne>R zcjX9bjnTaO%>K;G^@73MMQK4k-Qw_Pb=h?Q0!7)?Hw237=<4JsSyjMt(>G5 zKaopcXtxYg+qABY1;2SxzL6K%;FG^P#s62y^Djb5KJWpzkhNaVV+u=qXjMDdK%}S+ zP%hiN=g|PrLEtTpf5HUge;e-RUu$+`&q#4ag}jCZry35qLHUI&qRr9GZrb=nEXwmoPYing;V)Ode@{REPK`cml!y)tEy?YD0gm@|ag^uxrAr#BRPKlfK_c>Ea%&0* zi8aFXU>9=1t2IneclmLBl$lX8-V0fqNX&*K7=GT?0O z`=HHb;&>*%>_v(+MX;~mk|?Y5=b`h#+h|Uz)Emw!p|b@Y=X!w)MkVj(e_(_}4kQh~ z95_2b@g}XpI!pRVV$dva5e2|*zQI_p>A*npkBvSzvNnsLSa(BptGdrX;OgulG=g!g zOV+$7b=FsjfAyhaz_}z|;rM>npTedSly@4kO-mVjG-TKPHk%fSMly5|E2HQR&jl*6mJaJ4-^LRGU{ zr8JFsZnMriv6olAQXxOhZq1X0>H`6qEx{5x70_N<)QDEk7we33$DEm8;{OQ9e|+F~ zf_S$*tF+4$oLylJAm$NGAOx9t32sX&N+{DIqQHXnFf?wUSR*k*W(A%FQMRkCGq~TZ z=E-=#g3A)06}n&Np&x)ZL{hWlxZg(iT;eKv{PdB(MMo2(yo=7yUXq7p8)xiH^D(|- zz>0vw%*14TPamy)4kt8PTkO$oRt>HFlY#Nc4ihhGc!fE1Bbqr!r#~^sBQm+4?dJbp z4C02kMBvyJR62iwF)bSn9p8Vn6NPIZE?0^xr&A)TxDQOQv54O;lF8v(%&oHy0eV#cum zJ=%23kzDt*(o@j`cL!cELW|LY!~4E5a+@@{n3sF$Gv`v#Q6)oTzc>2R@3{RrmwC-9krb_5w`in7VJYQ&-YMc7yVR%wt?D3|`8r`I&D7ezx2@zY?=;15uU zrU1Mxlw>^H%W%Y%#7a@`@&CDZtjBR7*Al4@fJ+Uv_B37#28omd)?vGTJnZDqH?~C^*pJmndX@ z?-(7J-5@ACz>M*ko+?g$wUjXPzHNJ`*4Dih@ok8>LTcaP^fQWUT|~>fDn2=vNm^9Sw-8`0k)?#Buv$f-!7`1w$F8imBDmk6ZeMOd zLl@ra8->y2es48Hu1odIub?}&Lr-g~y6zFvwI8%Zk?&St=p38zY6_&OwJ-Y<-ZT@g25h3WG<`C<9f zfy5C)2^TdZ5x2w$eXEJ6Blq+AkONfOd4JxRM4tE*Q$#wAFQd-9B5ECpvWK|!*F=@w zqHz3XYDm{|5?hFFM|~@dPJ+s}rHmvrZe11xHlr zJa01j$tQ=8ds50#LRdyk9(dlA;E*0Il_`UDLQQQfFl*w)Y{a*E1EI!!u8h~mOZvs7 zbc)k!eqLYfipxN0qR73`fLk8A=2=dMDgZN2NPX^%-y>08o>-*)Mp5hrgAQFsCU$r` znf-fe(SmJei+P>$?qJONAouz>;`WP~>hqW~`weD~6{)N9q#_Qn(Km zB`eZ+lg$Bj8`h=M#xQOnxuM0MwFROzF)=s^Bww@JQEk(dNpI09qaK|3GasvP{N>*F zJ0k{2A^2yoEWv46x`1>t&FO#hO>9u@B8E#iqQf;*)KehCl9rkx&*0r zUH5QHCND&!zOn*xj~b=!D)&J++Q�X~|9vCdn^uL^~_j%eohk{_uHw8~t4yVuvP( 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 literal 0 HcmV?d00001 diff --git a/public/blog/002_representative_samples/index.html b/public/blog/002_representative_samples/index.html new file mode 100644 index 0000000..359bb33 --- /dev/null +++ b/public/blog/002_representative_samples/index.html @@ -0,0 +1,243 @@ +Finding representative samples efficiently for large datasets | Avinash's Blog

+

Avinash's Blog

Finding representative samples efficiently for large datasets

Premise

In this day and age, we’re not short on data. Good data, on the other hand, is very valuable. When you’ve got a large amount of improperly labelled data, it may become hard to find to find a representative dataset to train a model on such that it generalizes well.

Let’s formalize the problem a little so that a proper approach can be developed. Here’s the problem statement:

  1. You have a large-ish set of (imperfectly) labelled data points. These data points can be represented as a 2D matrix.
  2. You need to train a model to classify these data points on either these labels, or on labels dervied from imperfect labels.
  3. You need a good (but not perfect) representative sample for the model to be generalizable, but there are too many data points for each label to manually pick representative examples.

In a hurry?

Here’s what you need to do:

  1. Read the premise and see if it fits your problem.
  2. Go to the For the folks in a hurry! section at the end to find the generic solution and how it works.

Why do we need representative samples?

Generally, three things come to mind:

  1. Allows the model to be generalizable for all kinds of data points within a category.
  2. Allows for faster training of the model - you need fewer data points to get the same accuracy!
  3. Allows maintaining the training set - if your training set needs validation by experts or annotations, this keeps your costs low!

Define the data

This data can be practically anything that can be represented as a 2D matrix.

There are exceptions. Raw image data (as numbers) might get difficult because even if you flatten them, they’ll be significant correlation between features. For example, a face can appear practically anywhere in the image, and all pixels centered around the face will be highly correlated, even if they are on different lines. A workaround in this case would be to pipe the image through a CNN model that has been trained on some generic task and produces a 1D representation of a single image in the final hidden layer before the output. Other data will need further processing along similar lines.

Get a specific dataset

For this specific article, I will use the ShopMania dataset on Kaggle. I apologize in advance for not using a more easily accessible dataset (you need to sign into Kaggle to download it) - and I’m not 100% sure if the GPL allows me to create a copy of the data and place it in my own repository. Nevertheless, the data (if you download it and choose to use it instead of some other dataset) will look like this:

NOTE: whenever I want to show an output along with the code I used for it, you’ll see the characters >> indicating the command used, and the output to be without those prefixes.

 1>> import polars as pl
+ 2>> data = pl.read_csv("archive/shopmania.csv")
+ 3>> data
+ 4shape: (313_705, 4)
+ 5┌────────────┬──────────────────────────────────────────────────────┬─────────────┬────────────────┐
+ 6 product_ID  product_title                                         category_ID  category_label 
+ 7 ---         ---                                                   ---          ---            
+ 8 i64         str                                                   i64          str            
+ 9╞════════════╪══════════════════════════════════════════════════════╪═════════════╪════════════════╡
+10 2           twilight central park print                           2            Collectibles   
+11 3           fox print                                             2            Collectibles   
+12 4           circulo de papel wall art                             2            Collectibles   
+13 5           hidden path print                                     2            Collectibles   
+14                                                                                           
+15 313703      deago anti fog swimming diving full face mask         229          Water Sports   
+16             surface snorkel scuba fr gopro black s/m                                          
+17 313704      etc buys full face gopro compatible snorkel scuba     229          Water Sports   
+18             diving mask blue large/xtralarge blue                                             
+19 313705      men 039 s full face breathe free diving snorkel mask  229          Water Sports   
+20             scuba optional hd camera blue mask only adult men                                 
+21 313706      women 039 s full face breathe free diving snorkel     229          Water Sports   
+22             mask scuba optional hd camera black mask only                                     
+23             children and women                                                                
+24└────────────┴──────────────────────────────────────────────────────┴─────────────┴────────────────┘

The data documentation on Kaggle states:

The first dataset originates from ShopMania, a popular online product comparison platform. It enlists tens of millions of products organized in a three-level hierarchy that includes 230 categories. The two higher levels of the hierarchy include 39 categories, whereas the third lower level accommodates the rest 191 leaf categories. Each product is categorized into this tree structure by being mapped to only one leaf category. Some of these 191 leaf categories contain millions of products. However, shopmania.com allows only the first 10,000 products to be retrieved from each category. Under this restriction, our crawler managed to collect 313,706 products.

For demonstration, I’ll just limit the categories to those that have exactly 10,000 occurences.

1data = (
+2    data
+3    .filter(pl.count().over("category_ID") == 10000)
+4)

You’ll notice that there are only 17 categories in this dataset. Run this to verify that fact.

 1>>> data.get_column("category_label").unique()
+ 2shape: (17,)
+ 3Series: 'category_label' [str]
+ 4[
+ 5    "Kitchen & Dining"
+ 6    "Scarves and wraps"
+ 7    "Handbags & Wallets"
+ 8    "Rugs  Tapestry & Linens"
+ 9    "Cell Phones Accessories"
+10    "Men's Clothing"
+11    "Jewelry"
+12    "Belts"
+13    "Men Lingerie"
+14    "Crafts"
+15    "Football"
+16    "Medical Supplies"
+17    "Adult"
+18    "Hunting"
+19    "Women's Clothing"
+20    "Pet Supply"
+21    "Office Supplies"
+22]

Note that this is very easy in Polars, which is the package I typically use for data manipulation. I recommend using it over Pandas.

Specify the task

Okay - so now we have exactly 10,000 products per category. We only have the title of the product that can be leveraged for categorization. So let me define the task this way:

Craft a small representative sample for each category.

Why small? It helps that it’ll make the model faster to train - and keep the training data manageable in size.

Finding representative samples

I mentioned earlier that we need to represent data as a 2D matrix for the technique I have in mind to work. How can I translate a list of text to a matrix? The answer’s rather simple: use SentenceTransformers to get a string’s embedding. You could also use more classic techniques like computing TF-IDF values, or use more advanced transformers, but I’ve noticed that SentenceTransformers are able to capture semantic meaning of sentences rather well (assuming you use a good model suited for the language the data is in) - they are trained on sentence similarity after all.

Getting SentenceTransformer embeddings

This part is rather simple. If you’re unable to install SentenceTransformers, please check their website.

1import sentence_transformers
+2# See list of models at www.sbert.net/docs/pretrained_models.html
+3ST = sentence_transformers.SentenceTransformer("all-mpnet-base-v2")
+4title_embeddings = (
+5    ST.encode(
+6        data.get_column("product_title").to_list(),
+7        show_progress_bar=True, convert_to_tensor=True)
+8    .numpy())

This process will be slow (~30 minutes) if you don’t have a GPU. There are faster approaches, but they are slightly more involved than would be beneficial for a blog post. The wait will be worth it, I promise! In addition, the call to .numpy() at the end is to directly get a single numpy array - otherwise you get a list of numpy arrays, which is rather inefficient. Further, SentenceTransformers will try to run on the GPU if available, and if so, you will need to write .cpu().numpy() so that the tensor is copied from the GPU to the CPU.

NOTE: for a proof-of-concept implementation, or if you’re on the CPU, try the all-MiniLM-L6-v2 model. It’s a much smaller and much faster model, although you sacrifice a little in terms of accuracy.

The concept of approximate nearest neighbors

Performing any kind of nearest neighbor algorithm on medium scale datasets (even bordering 10,000 rows and tens of columns) tends to be slow. A primary driver of this was the need to calculate all, or nearly all distances between all data points. Approximate nearest neighbor (ANN) algorithms work around this through various approaches, which warrant their own blog post. For now, it would suffice to understand that there are shortcuts that ANN algorithms take to give you if not the exact nearest neighbor, at least one of the nearest neighbors (hence the term approximate).

There are several algorithms that you can use - I shall proceed with faiss, because it has a nice Python interface and is rather easy to work with. You can use any algorithm - a full list of the major ones are available here.

I’ll explain why we’re in the nearest neighbor territory in due course.

Building the database

To build the database, all we need is the title_embeddings matrix.

1import faiss
+2def create_index(title_embeddings):
+3    d = title_embeddings.shape[1]    # Number of dimensions
+4    ann_index = faiss.IndexFlatL2(d) # Index using Eucledian Matrix
+5    ann_index.add(title_embeddings)  # Build the index
+6    
+7    return ann_index # Faiss considers databases an "index"

This does create a database. But remember, we’re trying to find representative samples - which means we need to do this by the category (or label). So let’s design a function that sends only the necessary data as that for a particular category, and then create the database. We’ll need three pieces of information from this function:

  1. The actual faiss database.
  2. The actual subset of data that was used to build this index.
  3. The label indices with respect to the original data that went into the faiss database.

(2) and (3) will help us later in rebuilding a “network graph” that will allow us to reference the original data points.

 1import faiss
+ 2import numpy as np
+ 3import polars as pl
+ 4
+ 5def create_index(label):
+ 6    faiss_indices = (
+ 7        data # this needs to be an argument if you want to create a generic function
+ 8        .with_row_count("row_idx")
+ 9        .filter(pl.col("category_label") == label)
+10        .get_column("row_idx")
+11        .to_list()
+12    )
+13    
+14    faiss_data = title_embeddings[faiss_indices]
+15    d = data.shape[1]               # Number of dimensions
+16    faiss_DB = faiss.IndexFlatIP(d) # Index using Inner Product
+17    faiss.normalize_L2(data)        # Normalized L2 with Inner Product search = cosine similarity
+18    # Why cosine similarity? It's easier to specify thresholds - they'll always be between 0 and 1.4.
+19    # If using Eucledian or other distance, we'll have to spend some time finding a good range
+20    # where distances are reasonable. See https://stats.stackexchange.com/a/146279 for details.
+21    faiss_DB.add(data)              # Build the index
+22    
+23    return faiss_DB, faiss_data, faiss_indices

Identifying the nearest neighbors

To proceed with getting a representative sample, the next step is to find the nearest neighbors for all data points in the database. This isn’t too hard - faiss index objects have a built-in search method to find the k nearest neighbors for a given index, along with the (approximate) distance to it. Let’s then write a function to get the following information: the label index for whom nearest neighbors are being searched, the indices of said nearest neighbors and the distance between them. In network graph parlance, this kind of data is called an edge list i.e. a list of pair of nodes that are connected, along with any additional information that specifies a property (in this case distance) of the edge that connects these nodes.

 1def get_edge_list(label, k=5):
+ 2    faiss_DB, faiss_data, faiss_indices = create_index(label)
+ 3    # To map the data back to the original `train[b'data']` array
+ 4    faiss_indices_map = {i: x for i,x in enumerate(faiss_indices)}
+ 5    # To map the indices back to the original strings
+ 6    title_name_map = {i: x for i,x in data.select("row_idx", "product_title").rows()}
+ 7    distances, neighbors = faiss_DB.search(faiss_data, k)
+ 8    
+ 9    return (
+10        pl.DataFrame({
+11            "from": faiss_indices})
+12        .with_columns(
+13            pl.Series("to", neighbors),
+14            pl.Series("distance", distances))
+15        .explode("to", "distance")
+16        .with_columns(
+17            pl.col("from")
+18            .map_dict(title_name_map),
+19            pl.col("to")
+20            .map_dict(faiss_indices_map)
+21            .map_dict(title_name_map))
+22        .filter(pl.col("from") != pl.col("to"))
+23    )                   

NetworkX and Connected Components

The next step in the process is to create a network graph using the edge-list. But why?

Remember that we have identified the (k=5) nearest neighbors of each data point. Let’s say that we have a point A that has a nearest neighbor B. C is not a nearest neighbor of A, but it is a nearest neighbor of B. In a network graph, if A and C are sufficiently similar enough to B within a particular minimum thershold, then A will be connected to C through B! Hopefully a small visual below would help.

How a network component is formed.

What happens when such a concept is extended for many data points? Not all of them would be connected - because we’re applying a minimum threshold that they have to meet. This is the only hueristic part of the rather fast process. Here’s one more helpful visual:

How a network cluster is formed.

Very starry night-eque vibes here. Let’s get to the code.

1import networkx as nx
+2def get_cluster_map(label, k=5, min_cosine_distance=0.95):
+3    edge_list = (
+4        get_edge_list(label, k=k)
+5        .filter(pl.col("distance") >= min_cosine_distance)
+6    )
+7    graph = nx.from_pandas_edgelist(edge_list.to_pandas(), source="from", target="to")
+8    return {i: list(x) for i,x in enumerate(nx.connected_components(graph))}

Getting clusters

Now that all the parts of the puzzle are together, let’s run it to see what kind of clusters you get for Cell Phone Accessories.

1clusters = get_cluster_map("Cell Phones Accessories", 5, 0.95)

Make sure to configure the following if your results aren’t good enough:

  1. Relax the min_cosine_distance value if you want bigger clusters.
  2. Increase the number of nearest neighbors if you want more matches.

Viewing the components

There will likely be many clusters (you can see how many exactly with len(clusters)). Let’s look at a random cluster:

1>> clusters[3]
+2['smartphone lanyard with card slot for any phone up to 6 yellow 72570099',
+3 'smartphone lanyard with card slot for any phone up to 6 black 72570093',
+4 'smartphone lanyard with card slot for any phone up to 6 lightblue 72570097',
+5 'smartphone lanyard with card slot for any phone up to 6 blue 72570095',
+6 'smartphone lanyard with card slot for any phone up to 6 green 72570101',
+7 'smartphone lanyard with card slot for any phone up to 6 pink 72570091']

Let’s see another cluster that had 172(!) members in my run (the clusters themselves will be stable, but their indices may change in each run owing to some inherent randomness in the process).

 1>>> clusters[6]
+ 2['otm essentials iphone 8/7 modern clear printed phone case snowflakes iphone 8/7 op qq z051a',
+ 3 'otm essentials iphone 8/7 modern clear printed phone case iphone 8/7 arrows blue op qq a02 58',
+ 4 'otm essentials iphone 8/7/6s clear printed phone case single iphone 8/7/6s golden pineapple op qq z089a',
+ 5 'otm essentials iphone 8/7/6s clear printed phone case single iphone 8/7/6s butteryfly delight yellow op qq z029d',
+ 6 'otm essentials iphone 8/7 modern clear printed phone case iphone 8/7 luck of the irish op qq a01 45',
+ 7 'otm essentials iphone 8/7 modern clear printed phone case iphone 8/7 brides maid white op qq a02 16',
+ 8 ...
+ 9 'otm essentials iphone 8/7 modern clear printed phone case iphone 8/7 flying arrows white op qq hip 20',
+10 'otm essentials iphone 8/7 modern clear printed phone case iphone 8/7 brides maid pink white op qq a02 17',
+11 'otm essentials iphone 8/7 modern clear printed phone case iphone 8/7 anemone flowers white op qq z036a',
+12 'otm essentials iphone 8/7 modern clear printed phone case mustache iphone 8/7 op qq hip 08',
+13 'otm essentials iphone 8/7 modern clear printed phone case oh snap iphone 8/7 op qq z053a',
+14 'otm essentials iphone 8/7/6s clear printed phone case single iphone 8/7/6s desert cacti orange pink op qq a02 22']

Running for all categories

This isn’t that hard (although it may take more than a moment). Just iterate it for each category!

1clusters = [get_cluster_map(x, 5, 0.95) for x in data.get_column("category_label").unique()]

For the folks in a hurry!

I get it - you often want a solution that “just works”. I can come close to it. See below for code and a succinct explanation. For those of my readers who aren’t in a hurry, this also serves as a nice summary (and copy-pastable code)!

The code

 1import sentence_transformers
+ 2import faiss
+ 3import polars as pl
+ 4import numpy as np
+ 5
+ 6# Data is read here. You download the files from Kaggle here: 
+ 7# https://www.kaggle.com/datasets/lakritidis/product-classification-and-categorization
+ 8data = pl.read_csv("archive/shopmania.csv", new_columns=[
+ 9    "product_ID", "product_title", "category_ID", "category_label"])
+10data = (
+11    data
+12    .filter(pl.count().over("category_ID") == 10000)
+13    .with_row_count("row_idx")
+14)
+15
+16
+17# See list of models at www.sbert.net/docs/pretrained_models.html
+18ST = sentence_transformers.SentenceTransformer("all-mpnet-base-v2")
+19title_embeddings = (
+20    ST.encode(
+21        data.get_column("product_title").to_list(),
+22        # I'm on a MacBook, you should use `cuda` or `cpu`
+23        # if you've got different hardware.
+24        device="mps",
+25        show_progress_bar=True, convert_to_tensor=True)
+26    .cpu().numpy())
+27
+28# Code to create a FAISS index
+29def create_index(label):
+30    faiss_indices = (
+31        data # this needs to be an argument if you want to create a generic function
+32        .filter(pl.col("category_label") == label)
+33        .get_column("row_idx")
+34        .to_list()
+35    )
+36    
+37    faiss_data = title_embeddings[faiss_indices]
+38    d = faiss_data.shape[1]         # Number of dimensions
+39    faiss_DB = faiss.IndexFlatIP(d) # Index using Inner Product
+40    faiss.normalize_L2(faiss_data)  # Normalized L2 with Inner Product search = cosine similarity
+41    faiss_DB.add(faiss_data)        # Build the index
+42    
+43    return faiss_DB, faiss_data, faiss_indices
+44
+45# Code to create an edge-list
+46def get_edge_list(label, k=5):
+47    faiss_DB, faiss_data, faiss_indices = create_index(label)
+48    # To map the data back to the original `train[b'data']` array
+49    faiss_indices_map = {i: x for i,x in enumerate(faiss_indices)}
+50    # To map the indices back to the original strings
+51    title_name_map = {i: x for i,x in data.select("row_idx", "product_title").rows()}
+52    distances, neighbors = faiss_DB.search(faiss_data, k)
+53    
+54    return (
+55        pl.DataFrame({
+56            "from": faiss_indices})
+57        .with_columns(
+58            pl.Series("to", neighbors),
+59            pl.Series("distance", distances))
+60        .explode("to", "distance")
+61        .with_columns(
+62            pl.col("from")
+63            .map_dict(title_name_map),
+64            pl.col("to")
+65            .map_dict(faiss_indices_map)
+66            .map_dict(title_name_map))
+67        .filter(pl.col("from") != pl.col("to"))
+68    )
+69
+70# Code to extract components from a Network Graph
+71import networkx as nx
+72def get_cluster_map(label, k=5, min_cosine_distance=0.95):
+73    edge_list = (
+74        get_edge_list(label, k=k)
+75        .filter(pl.col("distance") >= min_cosine_distance)
+76    )
+77    graph = nx.from_pandas_edgelist(edge_list.to_pandas(), source="from", target="to")
+78    return {i: list(x) for i,x in enumerate(nx.connected_components(graph))}
+79
+80# Example call to a single category to obtain its clusters
+81clusters = get_cluster_map("Cell Phones Accessories", 5, 0.95)
+82# Example call to **all** categories to obtain all clusters
+83clusters = [get_cluster_map(x, 5, 0.95) for x in data.get_column("category_label").unique()]

How the code works

If you want to write down an algorithmic way of looking at this approach,

  1. Obtain a 2D representation of the labelled/categorized data. This can be embeddings for strings, the final hidden state output from a generic CNN model for images, or a good ol’ tabular dataset where all numbers are normalized and can be expressed as such.
  2. Create an ANN database (based on a package such as faiss) that allows you fast nearest neighbor searches. Use cosine similarity for an easy threshold determination step.
  3. Obtain an edge-list of k (from 5 to 100) nearest neighbors for all (or a sample of data points in case your dataset is incredibly HUGE) data points in the ANN database.
  4. Apply a minimum threshold on similarity (completely based on heuristics), and obtain the connected components of the network graph from the filtered edge-list you just created.
  5. Map all indices back to their source data-points that make sense, and pick any number of items from each cluster (usually, I end up picking one element from each cluster), and you now have your representative sample!

#representative +#samples +#faiss +#approximate +#nearest +#neighbor +#network +#graph +#networkx +#polars +#category

© Avinash Mallya | Design via Bear Cub.
\ No newline at end of file diff --git a/public/blog/003_powerpointsnap/01_Shapes.png b/public/blog/003_powerpointsnap/01_Shapes.png new file mode 100644 index 0000000000000000000000000000000000000000..b2a61a2a64aba8ed7fb947151cfc97c02bf1e489 GIT binary patch literal 36688 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 v=Da-;kt4_d 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 literal 0 HcmV?d00001 diff --git a/public/blog/003_powerpointsnap/03_Tables.png b/public/blog/003_powerpointsnap/03_Tables.png new file mode 100644 index 0000000000000000000000000000000000000000..665dfc6a7b7b43cf3f53cf754246d336b98b056c GIT binary patch literal 21908 zcmZU)1y~$U@;{7A2(Y-rA_)X{hlKz^5+GP`2rj`TxD%WJ!95TN?(V_eHMqMk4h#R` zd-uD$=Y5xF=$@JGneOW9nvze2epHagd_npG4h{}eRz^}84i26bsCS^D0ROKm*sy>C z-ceclEnMjc`5thRV4@*wDlZSm2-MNwkl;z-ke{0XhbTPRf9mhx8Q>8AxsCt_7i7TO29D=G|0mC2So` zz`U&Ntn4(RFTh~1u!FIwpt9t7A%f#HckevEH;j`|9Z&(Jx9{S(a6EV&dI{o2K@Y714CP9ClMN&=NJ9w_pfo9 zxLW-8O*W4Io)$1cw&y!+9IWhY|9LjhRrvX;;71Er6Dv(g3u}O8z&k`a1h|F&Y5)Jb z^WQiAPfv~i_T*yc{NJAcbLaotQ_a!DLBiG=c%_r*f0yguo&WddzdH)EJg_rWD`7%Nhkpv>Z zdHIt;Cd0tt*t=JMI&mi#B8nii`ZCJwaW}>BIMjKxiT*OZZ0mBxHCFj^jsz;CaLhSFiDa`+%2@huGGO&&o}FEZxW(DY&w*4L!F#N zb8fn4I%&N^^NbgBtbx2`PN&Nzsol2n@{hASqnT`S_tVqUa%?*FAMv%dKYdD=nEMll2Ju7m zLo7)_6t_bLMowh@Jn|EJ@O+cHA~ma(LYum|+c~=fHkGK(w3sqD(^z>)YI`^}@8D>@ z2G82&X>LGF$K$9bao$9DZrRe(G7kIvmwt0hBeC~CW9I?J?m#aN(kXFI4{AroVs7^% zcwKL(6du@{z~g>l?(B58mltk0+2Nt7r&sDpGvCnKwVOa2qi=4neZAz8X-VPGN1g4; zRIxVBc1yf(xI#?S7_YJHKSZb0QL}>8 zF-EWhya@-a=hfWePh5e)_Z9Xga}DZUDk7ItDwcbvo!CSr`S~E^+s~5-@CNsWw$w5q zu1o^~yE1q^pwV(@SJ0xZUiU^6L=QGj8FL0MdC%6OIvaW|rzj9*HF><`oPI@u+83k# ze!lxlXx$GLHe$BRxuX7u@``cnt&0Bkx@mQN-3yhtd*#Dm~=~K zg80+Z-E5l^g*S(Ok6&HVeXkdy0N1f1&Nd` zZ+Z)84?V$D1N<6_)re1fi4Kc=46t_fn?5r5SvM6|*yZf>rN>DNz59Z7UFd}91vC^d z-sjdNF|_q2`>)~N&T0Vmr$>&FIt;evk9*V-hnVa28{bt(y&Zgr`Qq$bpC0cSA+D#N z$D>5=Wa6CrGjvUOVRn$Vb7zPBH+j3bP{U?Fh}f5r>dPJU=Tp9I3Z9*mo+3o>MP{3%;&x z%cZ2g#}UuC#pLhMuZMF=_`}~&P~Wio5PBxE>Z)e6#Dd{y9yH;=xZK1-7-OoZ;dkkR z&dN<-of~)`_lw=E0|}UD1Ubjsy{6;FFQI3LZBLJKwhdbe*?h~czjiH)N?s4}6H{%# zqjRznUP($5cAd1qt`;m&1K}#)PVO5{VneeNYWE?jX{2x^H;f`D~A*7oDs8Rv^Y+i0YL zgN?_F4OOM1$z0O-NT`NpitM9GjQV>~_lWw_bDR&{RQAa2uXwAXT|d{i|7%eY(ESIo z2&Jg2N!tNAR*K3$Jo*DQl>H+e>yK0yAMTg9M3Em-96p|BS$O}jln6+-OG&n%&zczZ zN5nCSQ1g_`BsM7$rb1Jk+2R!9-{{}^ zAjTAo;g^QppHO|okuL5R9Y-x>HhLoQTGoQdB-dzDK!Jh2Qom?j#f!~9O$;H1{myNJ zjzaWdSru!L2l27k(YGl5{?TiQGX8E{qBk$7G$1;`R8zlvw$YV+pXN?i@wT{=S8o4) zU9gVFP+l?!rierNs|yH9IotAfl=qw0dy~=@(c6P;ZN(Sbwk@v&t>)O3X0V|FD-nv{ zQoNJ+w#qHi-S-O^&$klw!@PM7{CC%aDPG^fu2;g(x6iX^J0=x`bnqS1 z#_i;I-Cq@sLVIEIx^0WL^D4O}H<|_^OlYhdyx1t%FEOG}Bfj+p;36fyAtmI+5I`$6 z(E37HL|L`Iu|DQfrnNu{-F^>?a`vKu!^3dtkK!0JIvev?4$59b= zd`zL`7Ik_z@};>7BWH@psKkRMmlZWp1j=Eow>LK%QO*=>v!IoLuwgXO?{4ep@kX$h zP75Dud^X@D|F-$~#3OQepSGjQLDnwM_Pb#V$W(XE&6C9{Ab#HWNUR5Y>)~vln&!g# z+Rg`<;(eM{h??t*PokD;tH*=L3dyfSZ>c=T#0Sj0N~=Z$qm)PC7s{jW8vQjOk10seme`8s?X%O)`J`$ z`3h^&pO#rK)b0o0=XG&D6ti~`AkB(Z2%)h$HlengygLThe}JpiYA1;7zFhs(_>NM* zA!lOlhv{fW3HLIM9&&UwagEz7imY#QpMFI3gHBl>YV>a@T+63%>EO_8g9@I{@5LlO zBYHrG`P3-o0kYOH!T<>zrsp`!lP%(Lg)g!mLMu65?Xu!kH?iUgjoeLlS$;F%-)%Zw zXRE(uWYjbivp|??Tj~iKAIp-6M}hZ4B7yY15dA|0+Ji?W|9NMY=~c_nhc3!kwHJJw z-EM)ZJuh_9{3{!f-}$?U*uvl!R5lG;gt=@Do486Kd>NE7;@SfH<>k--lmcP2h(~&% zr#m5K6m-v3-o%r(dxguf3!s11M54a^w_R+TB6tDcpR8ABN2|-mdQ#$&T&6=GVcxL2 zP=`#7y18O@_|vc+!4BR|FT`ZXMKtx3(yw;~OGmW}3ix#W&hr8K_s30T1NNEXhKS@G z{vYTSGm0G)A+YLQk?Td;fxFK8fjeaCDuoIIoV@P4RZ-Pj7wLu-vo!mlc}PFb;&!V| zS>rzAR>0z@F!V$28rLY*0VW>$Z#*lbVtqBepiF|GdjHiI{s(oJgh;dM?uVcc;&!>= zR3!>_uPW@_HXl0HaWOBF%`$M1Iedl3RGT{`INla2PmVqXF^Eyh?3;HXJaGwoA0+3o z82V&-T`8#)$Y5cPHhr~h9(Fs%Y#NRsTBf8)9~Y}0yj=RaAP>tDcFjZ#;c zZzsFW>fN~%ITgFS2UL+T+PuS%f*^is!_L{E>|6TUYFC2SWo({Ysk5p z!9!$ZZ|I-Sb$nfc4WKc-A$Wk4gN|U_i;90j!Asj5EG_uM_`#?*Qso}@Fbr>u!Rfx2 zo9IN*^*!>(4ze~OukH-ynZNCwSI{_8E~J1f@3MTJuVDk{3K z01*-SuF0G(8WrXnc>4IW;>eBO9>X$G*m z59bcddQ3Y?B!ijL>t(3xUoZBvSlcS9Itnw|8Rdu2>?~ei>Q3<4^+h`IEI%%?Uk7%E z#0<5k&Zou>kUB_*D0GJzj!*`qL&%GRG+U!ZC2pq{f?XnJmumq=zh->BK_Zu^Ivrv& zXRR_GncjM^oNKtEq8680axmT_INqow@j>Ye?~m;~-YMQB7AD-Pt0t$t!gI3Xwv65C zH?fl8JAao8?&h^}H*D@LFW7YT-TS)-p1$tmk0^9t?VI;`(h z7}!}7<)fG0BlEPSBIW%-s3yvb-z>h;p#E|JjTA>4ftPB%u3Y3NM?vuGcUAs@WA$L1 z^`cXMLnw_6dMb&>#Mma^if2_1_5=y+W<$=%$nb>x%o@xMQr&O%x!a?kM%@$6n9$pQ zLjk4*(Z29iSBysN!`7Y>gIphB)Uo&*i!}zjA}i6-~_O|?EE3cFAlMhwJ! zDi2+w=puVBV5I_v9OFR|Ew1;c-ycmvj^rHz-Qs#xI7ZOD_j`sZQDqhh&~Q%}EM~}{ z_1DWD(^S_4sb+;ljsy4}3dGo#Dm&ec8}b-zOkru0tgg;E!VkYPP-5?on zU^OLw3lJk`1a%uHG$tJC0Ck;SWk1*@h&Dzkb%>UXwF9w7>k?dvAq58f#gnl(Xv z6O6+ce_1=Nj3aAmNw{$9>Wc$u>l-yn_gV7GA2duoa_jb5;&s*BIYS)kaU0t zpSTVhCpR81nGM}+C=rcl@C_$79cfa?F_VZ5x^d7^_}4dzLQ60mj`hj&B@~h~ets)) z$;ANG+WCPS_cG~XM{lAHndyr;{v=dVLNY+5%B;s2514z?^^ZO`D>*Pj^qUZr zu2A`)NkSPe>>HuJ$(h#wKS%6XcFpmqW$L$xteKk{wZ#NYdOw(d^fLb8ttC0 z%aYmwIvE}B`8ew!G}1 zS!5!epLg0;72kH@q?>CVmnJ?ujd7kif>omlw3p@(G0s(u22Urgp1;uG3IQ}$k8eAE z*#1RjGg2U(g>dX=p-*A2mMr@QmxZ0KdQHKLdzE#m4nJK*i)DTldA6@#x$$Q^NDGD# zUgowlyc3_9VN{!K)A9jIRBTXNtYJg1TUN|NhUbxgUN!XY6K8MqQmS`{@x3rpVsYum z7V{SBmPKX>y=41?JlB|Xn)bh!lF>wL+{S8Z1{)8%0cVzGy8$TQs2q_JKGc21eMi`v zl@%I#-JTFw5+)KgXLV|sh10MGMgtM(DK&?Xs!n2uz>y*7EnLp(>r07gOyyDPsdBTU z87w)^s^M6vbwPg$RCuvdo$pa01z6M92wQARr%_yrIkY|A74?XVLVr`;bUF7(cujy+ ztODjVh*6;^@X?BpoWIb%y%&Hdrc?bGVsT8hvF5FWog+oMfOq|k8)~S_VH?eG5PDl# zsxcdvC)$^O-{ti=ZOX{A8siBNSWH$~V8*)*QI(8)868SbEmCXV^%wqwdK3YxoZ4m} z9nxv#9+O}k(IjpHNUG;gbL!<${~TJ|$z;VxTJ#~TV+VE1V~w!W`- z!w}lh7V3r$_rzt8&0e~SXPLWoOjHpOJG>udH?HeWXmRrTW#faFesdd~4e`+V80;^c z>y!T2Vm`|w7|xnzODeoxTh>8S6{F@xt})dTpqU)>@}6Q`@e+m7EpAt@>EzWwK+0ZU zY2i$7qD=_aaOiJpN)-9Qj@KE;kuQ|r{_;br|L%e^EahRY&?6;quEHbQ=l@8|##=dc zHqHvg!AtSpr9whimWcJg*p0g7g!CX+8f3+e-t1v_b?M1~Xi2HG$A^-+)R5^A)^jO0 z)&!x5?e>LeeSwb^^6gYT!~Ei}H#^nuXfb`zu;Da06mHNba)mbxmQNGi0-Vef@4GV$ zKqSzhQ84oi8O;BWIjX4Rie@61V;d7vzXIm#8T8ur?pVnkH>CxvAqRYRU$@ITzDIgf+|CB0OUkRubHh4={zjbN!c^HG>gv z(({=KhwYFOhB%Qv9l+~Gl5DFL7jsCeC)pmIJg`A~Jcal0rZXQRk8lnr+MB=aMZVTx z498p}FgDBADV=N-l#t2Y+8(w#(CexUbBOm?8cjPH8<`h6-rb0M+Cn;@Pq2|Gr#37@ z3m=yY|S^vI_5e@J{DrG#Z8^^Le9tB^zN4kH~H)vMS;6YT(FHcdF~ zyPdFf)ZR8G+H+?%=qtz`u$H@>vF(UaT-=Cb3?F8yf1LkPu)LTI34a$G6g~0sRLTMR za$L>BQ&TOnW>CoM>+eYVu%qb?Q<}7jmDMAjyN1u^%G{#0c-%O%7Wx5}cWZvq5X(Z$fqO%0zd$Xtp>9EaD>gjaJ5Xks?}oRMY=A~HIQ z8{~89%*Q>VRtZh2DGA@t;f9{4iOv|xMvrm9qXh@Fmx4zeY*xA#y$=><7S(^BZQoc= zal7PqTkr;cfVuPnkjg3#B{Fu&R#y2n{Dp_Y&~>%X(1KbOG8&trfwQVTNAd>aTXpwB zm{YKMkOGrH=1w(=G?$|@Iyl6Gz{c?hG_ zqHT}pL@HZ5?nhbJwRLi7OYhvPVhA?pM|^?rQhTnn{AZKN-J#F8vd9c zOE)^G_6CDuc)ye?rlWsT@`5PQxC!y)Lw`#c1;DA`yhw>U^A+1oJO^`v(EAWEzyCG{ zq#-4ko|}II0sUt?3F-r!_{WU9IJ1n1RJZI~@w6$4pFb3zhN8SJ5^pCUTdUZx3Dyvd zK(tDv2K%V$y-X)Pdh6voAKzI0l%fWvXsg-?I}_bQ^M{FNO9z)g{CBa zDPeKN8cE#&E;@bz~;7&=BSO5kq^BWj|sM4>%){$lwQd@YgGd+`;d$L(bPE z3M0{4Ic@i;HN;Ua2Ax5K*M7Gjv9xia0Z#=M16)`j9M9jn(O9z<*rL%r3EljfsEaN$ zMAt;Eb`;(Y`YJe-FbK!_o*|n(;++nM=zoqQG zv#ir4NRt1e5K3LFk@a_g^sx2azSpdqxasenj6L2O!8)&34#PKz$FpA;8C6Sv53N@S z-nyVqQp6A>CY6MpK&PitBUx8)v}6mYJ1^=l6W3}RDsiJG_s5iu)ZHQd+yNQQjOVM_ zx5_-Mv*X;)#*hU!WeR>|#I{uI1a_alyUtD!t&9xx&lnZ#ml6(twW8PEnjmSM{Wumh z2f_d|Z1RHuKCuA~(H`-(YH6+6df+5okTtT4_T)~T|IZks>R(}PzNyZY7NdFKL>E@Bm9ooDowvi^=)E@~&AI#%O;?;>3sOp5;!QkK(Y^%>bF zyy()kGRcFB3#LC-6P=(M+2?lr6YHEOh3+KZ{&_1bzPO{Y1i%(i6yuUl%LMaJH zlj-#cdWOEnr5fOzM1KD{AbiZ!R^@iP-kN7O!v-nRBdSx2e-KvL<2}M`k8hGM>1avh zuw{cRM0!UC{TZT}y;yp8EjYtVtXy~<;?n%X`BF^l`nxG{wpD)BImz)-@fn*-UiUEZ zta1p3G5iFa+i9WyHmaLJ6P%Kmwk36ds~8QK#7YN@*X%aL#zSS?{V?|)Rk`DL&~=Qr zdGG<6%uRa{Lz9Uo?X ztvkyqWOc0$D@`7PAj$dqx{{I6ubCV!wcB$QvFQN>&UCSwW+A_qtv_LD&~QLlvYVG_ z7MX-6TKaIbf6+EJ=d)D5j2dJt#@?v#b8-2(={Nw)L*mLGijBs%rBwl8R;o? zT=+C({prwe=mJ__$jCfWJdUH@L{l`Xc^KKM@-r7i^v>Rj8H}h`g9d>s@U{DC{+OT@ z9f3#JQAEAb(Gyq~iRRpF1m=oZv0`cOhkLs&2n}Q_;N`qShVM{B^0aINYl7I0Cb2fQ z1fjB0rc)RfQP1%rs(nE9dh-LK$I5hK38=aQ8gAr|ZPO0GjJs%8C$mj+SW7rI)z)}( z*vBOe^#qN}#M(#hSCPh}-_NuBDvUdna4zuHz~E@Dw}KW#7z*E?BZ8~UCq&%A6d zQ`S175ZN~b-7wi_@#?7PEztW$Tl_#?Q5w%uU})naAfHBQJd;pL-Td3YPnWF#%t z(Ke;4zmcbEJkMWlpDWa1^``6FYgD&fnm1OWI;gTg&s6jyyP6?qsDa<)(NeMP#UjXz zkr3Xlo`ua8#HLTa^B`xEaEm4pqU0aNFh;`l*FQz?>RMJ=FDduRo#~wUMig_#&IZzE zM0mv0Y?X5%KmyzlT7Q7eJRnCP253hLw=-7l-Fq)Nq`|q5-Fpu;vy%}XPgPOorWt=z zOh4Sq?)}L0#!u(4$Tk;Gp-%SKfsPEbaV%)KMRvQj@LcJ}FL*_HNzLw-Czuz|=IKO{ zH63k}#Y1i)xTNsB8zoGVYgAN?HyD`eoSLSsisTlrSw~X1q%Y^IYaAR+wHsS#YeGEe zCl|kj{#KYTr)Bw8FQ$;Th@SoDcR(a6JhDSON*7{bf88JKjXy!ihVV)_$?~KN_-HQz zWku0~?F*p=_4ROcu|>rv4=EUnCP5Mf3@FcR3= zp8(g3sS)5xj6#0*rD5Kxogh@hSk>#-(e&V6edG3w8^%55dRe?FRI5%~aclHp&uqNr zoP`s%w3DgY$Y7|~bSGEkM^MX?s*;|GYv0>~UATA_pg=S{!d<3Ua6<9n{S3p?bYcdc zNY06Pw*9rJf86=`P!O-}BZBVe5Qnx}f%FwU?17bghh|0S?~JwHrR2zh6RlgTN&ZCJ z@g%Un1KW$RNGUfFvi}eUVWJv~dvW9^WxcQBVse%Q2y4An#Qqg_5AL9D&9zXpIJ9E%V!wxT(x*$d|70hwXi-j`I=5$se3J?x@XoS%rajBwai9;`fm6&lDgzD z#0`&$k-0^@E>iXQ{EIE2$muG4wv_cykJ_HuNN?3kgh=AY^3v<2C$Vva700CG9n1K5 zt!DLF+E=Z@x;r}|CDYE<)2Vkyb=lToLrqCrdJ~Lw@jQ2X`1YewHyHy7Z*|P?G^)m7qU<#3m!#pc~#p0}J#Z8X|^{Q(nUdeoL%C)&RJl1PBchiulq!5$stZlC2BsS$zjWb^GI;Hi?1Yb`TVK9_(M`+;x}gWZY*3$7q%?+g!+TdEcyM&+59Q?*e|CSMC$C^r6pT;B0_d+Hb^u z1Mbl81L=UDH9OPuJd^?L1znG)m==}SMa%#uDYwi;I9n^oM3)iAJ7EC8nE0oq4YBwq`Ou zq1hHzs%MVIqGg80n9P3inR{?~%@USYBrPpkdJenC#E+DId3KY96?4HX@u5>%xbWcq zs40^{ugbkn*18RLHPANB1Jw)|RlYNtO-i+{O`d4+xF)3FwMt^ZxtL?FB)8u)oK*a^ z(C6@QACYG0``U!O3kSz7(i$Z)f+$S=mDOwEvFi68!mF+r0`&VL(pbIZUe!TpKlrZ~ z9pgnG1MwvJj+S-t17r3}5XITCqOtlAB?DFsD4XvL7TV_kl~$G@sleV0oHER}qO);0 zJ351NMCmxhF#v%wH$~|S`U@PEcg86$&PP*A#04n=j@N>TQ@jPj4O*IvTP{{BD?ECw zhqbd_sU z+cvoXAPVyS3lO$icndfz3#s>0Sn3VYt7LPVO6U^|JW$AB_hDPDy|z2L!wDC6gJq#y z$lgI7M!DU#CO64Pn6lybVaB%wc<5Cv5yS#=m*4ki^|`q$V3H;GGBqb|(D#Z^5M8OuYCY!i}B9g0j{-Io&iM^qRfmb)C*2bF8gM<+Er%@C3xgB+mpnZMX%| zf?IsMLj91|sz@#F;5F9?9xf&oozdASkMd}Eqlx{UIx+cFTNZ5FbT2ZW9`YDG8-Sp4 zT+qrCVzQqTrRUf>oOA?n*7@9@5MRJ<3%|lK)}i;wrfvF#^75kxa70^~V>o@+vhq+WC5 z3nwlHKzRgnKSPn#C)V>O$ThpGs(2;^9!+)+Ymed-dWM$t8v3j>k34OSvgezJuCyd_T+_9O^ow>J#a3tlb~uI5ev*uvNKwHK_W^0ntx z^6no$M5#AXJpj}}BE&UDL0}6%9?>Grbv;xL+itk26HABzmP?z_`|hu6d4t`%M~qQO znM0!P*JK7>LMyVT+fkpmm2pL({Gt*y(!ln5F;6h1!c|v-!)_KKBv^hMh$gEF-5*v( z?Lr>Uu$4e$qz~iL!=L(G)$;eu@;z>k8+Is7A}K|*@Fk^0(eM^Vxki)JZ^D>LKi(Qe ziF~TIU1`mR-7k2_OYts7CF=7o?7How=bg`e*Ykln=O)j3T`%Qb@Om?%^9nS3OH;b# zl*UH=*%tLzecE1`CWi&OwZ}f1!t1-(Z@LsO%ms-)l+SNfM>G3iE&H5^Y(Y_cS)A*k zF21yE1eSLs_g4#d*FfBy2-#r##F9dYk?MpU?R-S&MD#Jt~qYfGWnf>no z_Fv>C2yJxX5D}8*%B=m|Y95p6sg=ndLOW27ZBJw~oRC}VZiEZ8*d-Nmcxz5>8rY)YUPytw-YMeXl; z`NhqLP}wGtS|E_h2=iSC`|j9P zy_4a=NR<(_QF#yFq3?C{lcT6r~-u(MhHa24lCZu_J7k5!P2+U}fx19~R)B|z%z{(MtX zXC$?wKBl#^4Z+~jK0JBLZNx{t7E-wA5;{0__S0^pWJDoMgQJbt zzLzp4>3;_@yxOC&YVjh9!FbU`wXqG3JC?$doY-G&HzSWr-u?=ZEJycq9jo39I4v*m zWiOY-X}hdl;1mmTMLo+Hr$ob8z)m5|3G8{*8u68wt(I=Sop7ScOmR5%-2CDF(spgG zelP!Uf2O2++j-cMbaX!erYO2vy$6sBCER_Ow#NVy6?{UAaBM<*Kkk>I>e>+-Pyfv0e|J30_Pd6QMz&TyOs0lzfxrud`68{ zswT0|qirYkpc*2R;)Yp7Za;0@)9ptJDJy#N{T1(h&H;UEGL<6F)Cs{RbU87Yu+|y> zAmI>>Gm8ct!Rd`p|5IeHC;wDz6bPWF1oZg0nNzUIUfgym;+!CI8rqUAGqzF&yrVDO z%MNFqcrZs@KnV$RrAX)w9EHrb(ce=FSb+~Ix_ATYK=O*sxM(jT2Zil+CcS;Gv;EAI zs63v;7$Wcj;W@LZqQ{`em?onXDOARO@`u1zY5D;GThNA;>;hmnHB#f+lh%92VQf$N z7D%d1V?mf5)$0#QKe^A0`EC`^j){(-FFtGv!vZuodW?$ZT{j}9k2NWGW?QuRa!Igd zqHou?0Kws+hDAoEHvj;!gnska2H5F(F^o`xH$cLPpoL@m;7;7bLhWW%7vZ z?Y|n991G{y89;%Q*fR0#I?7XYZR{UIVZ=ue!^B@2z)x1m2Zy?gFiy{{hbZ6gV& zvbRiQ8N6Kr`Z2SMtlt=&;e4)<--qJ8j@;j_qPW5C)K zILzUP#G#US0wFDfqTTJ3#1_Z2&$2o=%QRM)T?e3KtaSux1E#l=c!^#0$~a{H_w z@5+6dD>OMM*GI+? z<6SrDDUv6je*~Z*SJ+VghP}x=CQRHGfLL*_-)6d1u#VVkGomHfSIx%Ul#fy*8y$3* zVi*QMT$`r%^jGQ8Sh1~M`VU6*h}&t3IRL0q?K^-aUlG!>N(kptCdMx`#G2~qndx=3 zT-Cb9n`M@VoQ?<}H|l9CGpFp?>pTV2N7$zcWQNrfF4PMbwNMJic72y(@?&U3}QjI z)fG3$nx}W5)W(wWQ`h0<-01!qP=_hm{ZJ9_bUjJ^b>4#ha&mBE;JD>lFL#mx2d^Nq zB&41(`tXysb?$l8OS0GQHN6G)$3*sat~>&2@PPr5SdZpBH=0Vn`{KvK9mQB&}Uj|%tFuy-)H*BYPNQo=Plu6)vW-u>W zsY(qe5YkCkw#!8?^}5sa9F&aG-W#u~<3EMXUddH9__&gKbHGp;eJ(q&vVkBlNWNzn}m<#Z=#8#AZIj0Ce6a^wK=OoLMD~N2Hj%rmPuHj-|2VVYzhh~Zg z@X%XHe=z*Nm+do-h4J(%(({MnNx*o~te zlbIxV_;??;Qd>e@n+!d43g8;85YgsaaSAWpxuNXkSxA|6I6f2@P#on6{B(kI1Ew3{ zTE9SQcHgWb!m`D;mr0xLvcMMcJfXDLJe2KBl`^hI!TSeE{fQAkQZq8)1q7^W6&x^g zQ}UO;6&QPVfPg4b2xPl3Z&hYE zO{;a2ON>hlsr@pm$E|D|bB<{;EeBodsEw{Yfaa{lt{=V1^)MRWxA2+#CBnVhLz{tYVTd=bvQjSIn~8Em_XUD~ZJl#|v{ zdS7R4yOlRuE22lzu$?<}$|gQ)T#Igx?#8KD0w_kV|R`UK=$JU!)N*aySGQIkI>TpXpl z#i@5!^qT1tCmGBk47~Pd_$(>KzW(l<##~RBAsmB|f#D~L(Z^q*q1r=$o1lv>1scI1 zC&`VlAM47^fDq&*{T1JsEWyCn?{6L7?I)iRkH_Uf1K!Q+$@M60r+40nxrs%L zIrP)8B=kLoB=q}Mc&*hX=6Ki-&hf5F*YSyL-0?!BnEIQXQ!1vO?p`u|wRm~1H~pK; zZz{eP6cnrv_4R>7>{flvEi4MmwX{;qH(v=2mHqs)83B9`XMMk{c3FUzF%!v3@#XKKb{@Bw4|zgiQNbU%l$?!H{|XZGUjw_oA}0 zQWe?ft^Z|WvIR^{`R|E_z+)Ql6gpeC8O@q02AgJ-ER^fH-(!C z6|c$PL2%-BVBWied^C5^b)ru@QDSWDuXaVifEw>}YfsFuxm#{>DZ5GG=EyYCeO30d zRRLtKnOuUg;b&aH#%S1LN z|Ey@A`d&cgf=J8?WqI`~Fkd%JY7L7> zON3tB-B9fF*4GJMIX)^4?+WVp^)6p?QW6#xj@IIypgy_pTGeIDlK1Pe!>IA`CJ$Ru zUn>d8Yw&*HeaB1Uq<=+ELeDD798F4ZJ($3fYoK5QLPYb8jdGi@71&=+iA}5r(HYkraj$w%oociIDM7dRBfei+3*fk*_9GNud(b2kH z=b}#~-1sI};^BlWs!?gXBrTPh^-sX82m%W%j3D-N<=&Gm3Tl z-d_uEn@0|gEbh?C^H#0vTd)(Q0ZW_s6mu&8rU;Yw?IIT zmhVB|c|VAWKjtr*@SGLW{@-0I2HrF>Ru4&bZkzg{zb8QlT`40dTsr9XgviWcbqwo| zAmjJ)e3|O+lBH0ql$jgVU5BF8!xhXdf+$$`*c#cU%#d?x`M{;wqci*7%gYqmB?^3W zN;ugm-`utl-z$X7dPO6R)2MyYXXn1b<*yJ34Snr5Cx#;F$Nt&s!wtJr1k^-j^KXM= zUXab????tTzgt}0PO)E9(PFw=J<)gsIX-t1qhO3^1Q`?&{~R%Ha{Q^zQLmXuXT#Rh z3Y*;kZ!x>RV4Xf}Wi#EsihYx{*4jKvHD3}L&?4`PQPCp2_po#R)_hT~F%tzdVSU(q z+eQvrl#aR>^laUq!c>>x-h#L5RI6hd4d_PP4;u7;XH&mloB4gV5dLMN6yC;0#Ou7& zlYNa`>Y}h{4t@8Fa$^f}kcLvh*6l^xHp+C_!WTC!vN{sO-SOPmeQnJ~rNxnWM>W>I zB^E9G?C>oD!j>VdTdsR-VpaO6P}DF?Np3WKczQa|v@RgoYLY)KB1hT|!J)$eH~f}P zkKaw4GNhwf3NP6saHy_NKk3g}lh|T^^?rrD8aMqmev0b)=$0o-kYzy+7nC z@HGdA{P1SrqCAj=9OB)Gzda<|My!0>7UQPb7p^DPO6(d@2BwGe&zLP4ZYK z=-f%5*RkEc;kWuc`6_8R*qQIS?|2GoI_eN+V#CKpy9xyyP^}Y>GEiIeAqMu!! zdIj))xd1VWe*S4iQ6l9m;Y!gAaxnO2@^R;|?!z^qJWFhYe617(^lS0tP~}@y4xWBO zQJ&_FBz<$ys`XW?9i%P4c6z_4@JvqO&uPtR?X(l>EwD~QAq|B)IJ8ldtq?&JQ_1v7pj0?&G@9Hn`H`v}(d#9L^PB5}?tY}CjZ}}~KJt(p4Z3=tSA2cK< zcN8DKIpurN;ZjROMW=8~pW*rz_HcjQMpb|puXtiCT8l*?nBQy`wH0r$%KwJXcDeW- zT=`U2#a8hH&jS{O$!mGa;V(JSAruxRa+iNRn#3W2FJT>N>C?R$ASp(90X*tSH~sNE zu?^n~$i#Xz@QR=q;c#M|A2@j?DUBZYO;5ABIj|hv`9F%gyEbek!7^Tn|_o_gUC}-?H{% zH>sENio3Dv)3@(@{$%1g`i9|D*O6%V~j6UuuW&;{|>~5jj%%~KR zZq7M?z<+ZG_)fy!(ZB=3Cm(hE6+3tlH>fJ&=W<_M6Jn;)Y-R?aj*=Q~^R3z2d7OpCv(P zeL ztWIP-qI+6NVQqrZbJNf$)_&^j@c4r zw;ARpKd9^K8KHhAUFwCRBA#EjzsdS2-8M-K^-jY)g5pTcw75B4Zao@(>=x*=(wjzd(`_p=VMOQZV#nN^^|}poX*mBkdICN#)6Z!%0j; z*UO()f8#GkBbg`098tv&_I-AfLlNP}Rx0f#Ha0ZdyjyOPP+|F%cW*CV3MA2+cnX7m zB4ZHdzj0HjG96aFrH9;xGCb^t-fjd)+D-*TG&=2NUzH(KX+|9{sl8j?$@I}P+4jpg zqi*N3n4mlJ!UvJ`rCfFc35Mc_huE7EY)puTZ6aVD&{pNvAkRp;QEwQhEkPmM`$X1h zAMu`>4Bd%nuRyDzqdv{HCZm31Jv?-F`Ea%jHw`1E?dDn^QG#dFOfULZ^Sbs9sOBy@X}2q4b- z5@7o?ZWzIzHA6>)3h5cIc7H_`4x#tTqB}G^oDVubQMKnm6WfTD$qAyPY(D9m1~V)G z8!sOK%p%b zy6KV51+H}@`oOrLkMC|OcZWdV9y+NWe_oxmn91-7crNJ2PbW^p`z?}Y|6%HI$cx<|93;mB!qS6fVWT?6@7;r_;YK(rv9{zDR2F77nK zcgpn_Le6xFHs6`w;U{GM)iLT?wmPf7+4t(Y&hfjk)Qkh}#b~W97_9YT*MODIJD!;L z0p}Yw?0Bw1;TD*sv{sy+(ZK>$c( zo~l(d%9aH;OKB86#5Uwn%s7W>by7@kJAf@9fA%n%N|p4{+gPse%j9MuTY85}<0-t~ z1+Ud2LjuX9{K`<9O5c}MLFdBb0AklyVfpjBLdRoXAWHh%^;g>qi@4{@&nZ@C&*9Lx z{AHI`C`Eh>s{YFmalRrpN#wI77?9;VQ*sM0i^qbT`~e#Zue5OwxaSY1u#C|;yX?;J z?B&Eh`oIqKyPtZKhh|pM?v6k{6Etu!A6e%M_YU~=Lk+G!|;f_L< zHd!OaGNffJDZ8;N+YFhJ<$KS29N+gn-hbfz?LLnCJg)7&&+9tR&-MA79}m!Qk4CdX z&PdrzqOkS9=d=bFlT$!vigaFE@656>WV9D(YpBb&m}KD_OW9p94K26<&d8fxtw#FB z5PsX!ZM2ZtB_&;D_r1w-dicu#IlZF|Paw!<9*eN>$_b+I=XFLWNNnAA^K^<1nf)xa z{kyv9kbU%<%U^b^jyqAy^P);`FYrF(?e*e;mA*#v}=%D#63lZN0(nLlPwf zfkRBPw)L0~tSL(6zd=f;D(58aMCiSBUduBA`^0_K^g%{$rRy$x$wHHW_gDBk!xQnN8fTT9BZGnI=+$0|1Sxn5ACW4wku(Z(<%>1jUh7>zsO_;*$x96H zGp4UfO|Z_vVbU6=8cdJy^O>0v4HYD^ggl?MC;fX&zD063tGs%&hp52YGf4GnMs55ITbBA069i{L12y(&W4YX;vZQ$vDxW5ZT)mt9E`0HsKg z!seK#=+}<50lu!^PG6#tPT$pWiChX~c~o7?E)VWCU==8SzwFeSnQUEJY4EpnN9W16 zq6ip`q~{aNjO!-J@AqXCPV4NSI_>{*K?p4g#BSYyquP?Jn7V3{F|?H;7`716Wq41U zQ9rIWqQImG@aKs&>JhBI+%bD;n6%Pgb}v-shdD#Z*~O@p>t66?SN=cdN}9m`T= zjuQ{(RiMuY^ZkT;j8630Q$&da5DUgHFT0TCoQYie^C%X)U*g84XvS0CAMweZ=4$35 zYF$Q4+2*8WO7zy#&F3f43VS6B`FRiI-Q&a~`|X6?hlB1wCF2>yfV6kzaNR$hU|woc zer{XjK@qOam56VWd64}@8*S*JADDHGR%~o!GreZ;!aNlRFvBaGJVMu%Px!H*2 zP?i9h8~V6!TmE5yftG3E=4&gm=d)+o_%f8%iSyA` z=gh&Y>qn@F^HaO-VLyCJJHpc?N2Rdll*9%VfJ~qWPTdM5S?lgwwih2!?Ggl9G}`P= zA221!s>R`nt91QI6^-Q_Pf+yeRfGdl@rg!8D~hoR^Lgv)Axdi9rn#8QiFY0_CtJcl zKeX9UI&PrrF9|<^R#>)pf&ktHP~G&|_RwX6xMC7oRV?Cfvz;n;g`+j!8-gIyw#g~R&+E07KW$s?eoJ~6F_-5{( z>#vl{Ub7AQJJjWPRrT&j$P_}R(Hd|uT{JI23yE}8Ym~J&xHl&saW-u)WtFWZsM4|_ zF&{taqgE=X1uBWBc)aq>2@z}LVK5C(Bk!b=BU1HR;k=o2D60_X7)Cg-mgvqFzLv&d z%!wVFm_@U^6gII4(D)&=@$i(&0+~>z$GVI-th?RvRa>GauP>$B`g)b^m+ALD|jWRNrP* zB_E}mM(%XqF7C$35We09#ksk%LvWZ4M$6d6lfu#c8hqQOZ_VLRx*JU3N6dNIJ51c!zV-bjx9vvHD+=f2=tD!Ctw@*g*Lh1w@-w6QiLDi!Iz*&K;7SFLk-McEhzd6P z=kyu|y*7jy63KI*&eR9ONa}u}63K&bj+E+T`}j3@BxI@Oe_FbmtrTVbNzRcuRn($@R2TLFJ@L@ug;sD13 zQV}~C@Il1wYc{-M5U+%vkT*UrPm-tdxA4|tRCE?p(`4uvg5wQWwe5KJVIQOp!My?g z?)FBYNL#&s1NrR0>igV)4~A#JnM?@Q1yfyFrzUeMVl&EPi;uX=il$26RR%E>2$M%H zZP^vq+BURK$jE7uu{Fq;Q=c4nhWLXS?NABWLJ-4%`$fKq3?vQtjJ^rTFW|0&5T8U+ zzJ)Pnzok!KJZ<5H?53qCYI5~GHbtxjP<-1MeDgLJ6lco^QKdo?CazO&Y@M1^`2YSj zF78J+f^EZ0x$jK_rqj8IwIv8x6Lf08rz6k7r9V>bqx%vx8Yh0-h~XNCaE(J8W_asC z6VO!be`fkq=QWfqU_LfAOD-p**PVKN^wIq2``cK~?KHx~eKAd@?+=j52Pzs_GXRIf z0SLGAn$$*Xu6y^hjCk_5ZWMxriXsaXaal#tgQ}M^4xDQJg2OY&)r9L=dQ&P!%$B^| z-16TM5fMPQL~Ux`pOxN9d5-!5_YYopP<)BEZbCZ^IE;}!VB~H%Wd5psnyB;b>@Qhrk&UB4)4!Rm1lAn<4lB_xa{rb2 zJwLF<%R4tkM}02@5;jHKU&W)mDpRe+$_Sn=b!EVh5Nb4|n{SUbMryM%gj%gK#qxST z=bAPh{`{yaz*WigQu5rhQ;#vLhW{Wf>@&^JS343mlHnRAw|`%CBK$?O49y7ZevArM z)+3RlEG|Js70&D`nuNj*>FP?aJ6!bx9rbEi@AaZ7o-nHKJS?y#rQX-;QL~8KNxiY% zy_8ClrX0sf76p?=tHQoNG7RYJ1fw^s%)xWWuG1go^e+_;&#(1jYr7wty6r}C*-MsI zAKl8%L@+_PhD$;KkOliB4iuYR8#JJol^vvqk4D(6HA4}S9(AE5nym9RK?PkU{{FyE zh!tEZRmGNBkf_wNy#o;-ojvP93Y+i2z6I-R07#q7j<562Z~*si2#89$av&dGA*{vS zB!4@Uh15>mU6&GO#+QL-u-eL@{ii0;*+1b{eL-uA;lEDY(ZoWXu?ccwgB6?>&0UJ9ji2z7$Etmu4o7f~2 zdTWKMT`4-5EQCHXC2-_P^bUs+KnLzell6jaH+uU+3sj%{Ev`koL0Vyd5*H-?ex7KtFpSdG4KWaBiTUEF^DqD z(c~1dyCwh$DT4Y^OIf}$vbkPb_w%zU*3tw56?NfsnD4yu%R@(E?CQ@6TGcHc?bpLK zx=SJkieW{C=A+mg{mUtATK99s?bz0Lfg{?D>dJMt+nY!|R*PH5mfU4VYtogm`fxm* zi&JLKDcd^S@0S^L4wE0@F51XXXYY9xgcywVWim3pM{^s=YxZsy~AO7S52(I*ekAaFQ9o+l?5hIDpnYeJX-=-?% zkSF2N9SOp>nAN)Vzfe{6YdsEF5W%w+;7dGx73AD8AhEG~vc+(bdz=`LpPB`HJ6IJB zme#?7wMGth@sCM2i!9_?SAzg3c4M>eoQZG@7~aAP;1%-Vj^dNN9NEmVa%Y=)1xxFO zD$rt=|H7*H0rxO+oKdOlRSb)SPG5ej-SE*?GM!L@e-e`N_Ooe9-{gx663nvk$rlpw z0wRCakJN{g%>7rnh+I;+?L)^jS|vL;ENJ>hUa8{ZVQ?J^S}g*0dkdlfl!bcD<5 z!E_Fp9Bnja^v+7ySRt8LjRbn;vF4RrUbH;^)~;G`tR;}65!MrmV7)9LZDN`t-)o6 zNY0gj8|(}}8Ixpqo#-Hb*YzzFu#oM`kV|O>gi*11;c}K{D;XO6Jrh4g*Tet-p+q1A zBtumoa?R0QTF;Ah8fWjguf>}oH3@iGFSeGd*gAWPRDsfs@I>meErPqh_=j?*A6j|( zUeRQ8ArBF90+S7eM;Wx6rOaoc}FgRm?pLsV&V@o!y k9lGjdt>^gkB4k%2YMNB_Lm~74NSN4ThjqkMSp6OMe+afEwg3PC literal 0 HcmV?d00001 diff --git a/public/blog/003_powerpointsnap/DataLabelsScreenshot.JPG b/public/blog/003_powerpointsnap/DataLabelsScreenshot.JPG new file mode 100644 index 0000000000000000000000000000000000000000..75906133ea03badfdac16279d13d7bf63aebf8f8 GIT binary patch literal 22809 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 E0M`Q*V*mgE literal 0 HcmV?d00001 diff --git a/public/blog/003_powerpointsnap/Revenue_Presentation_1.png b/public/blog/003_powerpointsnap/Revenue_Presentation_1.png new file mode 100644 index 0000000000000000000000000000000000000000..8933a9010ea7b1223fcfea29f9f5b0a1a9db604b GIT binary patch literal 252958 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

pB=>grc1NM+|6Vu7*Vh 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 literal 0 HcmV?d00001 diff --git a/public/blog/003_powerpointsnap/Revenue_Presentation_2.png b/public/blog/003_powerpointsnap/Revenue_Presentation_2.png new file mode 100644 index 0000000000000000000000000000000000000000..f046049e4b3e1091859742e867650a08195cb438 GIT binary patch literal 214873 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�gafe=({rmSf*p8otqB`i_ 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 literal 0 HcmV?d00001 diff --git a/public/blog/003_powerpointsnap/SnapScreenshot.JPG b/public/blog/003_powerpointsnap/SnapScreenshot.JPG new file mode 100644 index 0000000000000000000000000000000000000000..6c759de57a07a073b6633358bb070d0b01e842ce GIT binary patch literal 26280 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 lA9?BY*=~N7)eg?X{52?x=BJN+Pq9 literal 0 HcmV?d00001 diff --git a/public/blog/003_powerpointsnap/Table_Presentation_1.png b/public/blog/003_powerpointsnap/Table_Presentation_1.png new file mode 100644 index 0000000000000000000000000000000000000000..4bd1c62187760b6c762b010a5a2f50876e6507d7 GIT binary patch literal 318022 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�i%H!cqW%_hL+wN!>zSd=p8T9L8p!!kgTJ-ASU=6WYZ} z{$+-J>mxeVg?$MRSa3QwQw#4jE|q{jiAK2q4$MM?0P*l%1aIl#wSALZdDg2bSNGkZ zJHR*1(McuML!G$;8lgJs4lfI+BL|+8LyAzvwxDLpilF;HCEN`(==f|ye#Hxc7uZ&( zE8UZ7;w*)hqZ5Cd4hi~aeZ_G!3+TCK4<8|gd+`XriqVE!WCg!7zwTP%3n-jlgJ zTjolbVc-nFz*Xr`K$B(S~3SmZI+M>Mwsw6}lcexAR&X$E8cwaPFkgdoOl@w0bDAD|r}j0vqDj0mBN) zsY1n`kNp*_vuCOC$ef-1b?nyH>3YC{juM7*hkAG1BLm@X7x!fuvYT;8%5hAFi6j*k z53?6$!Z3dFgk4(fqk!Uif0D4z^Yc`|EFUYoJrKLU5KX8gP%5tLuD9QzP%4!FZmH2k zf!PK8+`w4%FtoQn?)=Gzg%j{WN*oc;&S(LJVm?dPdHPgt3nqD{3%vXH3vfe;5~1ax zOnA^2keQ^v<3?k2L2nNYW-@d|{|WW^;rD0~gP2g_A70oN(PiqK^T;Grg< z?95A8S4Zp#HuiUIzq(vm`h9tGfHALKPx6=7CyC2;EFmpEDvtf&^Y%oQzl7`4XC9y2 zuV33a&lO<@UuPk%yPgA+j#H1~qSKRjC674@`|UPO%BeWPIed9$k{Oi17H!~sn>r4h44<W4C@v9iwmK==*{I%OdCshdQrlXVW5?#OcynCWkX44b|Zpis!Ud%b{~wHZF04s0^Ifz z|LDhIVYpWvDYw}{^(Vr@j#|4I@KRjfCB3YdP|MU!xfbL8-C|Ab>jQD(X6E#1s3Ifl z;6Aw_-z$jbra3tzxQvaEf&(9F?sZ+gzVwz6(J&#a&!aL%(19!Xg8Bbfe$ z`1Hc_pqk}mAFlT$OAF(HhUfh}_XY%Sqt0=$ua0Qr))&1a%=l_$aWUo7j!M3=<`;eH z_C$G3?}%DK!TqJ?E0#bE?_a-ueM+9ktlH-pHMOE{`?1v28o-a*W0!8#b@2YY%xH%( zd<|2?Wr!}0*+As}R;#mLUW?E58craXBRy=klb_rF-tmQB5XQ)EJ6%~t37cWru#q!q zG>%W=^tig~0rgB1zcO{U?E~9YE+;O#$?FS^ee1=HCI5%T-Z%x-s}1>&!os9>01hp|6wPC~8Bcp4b-Xe2rma6eQHDTvnwLkb&nBA%YF zl97BsK!Nr3az-K6i*vTl&_aN5M?fi+Bx25>gzNS3B1hKkWf9u;L-{m|@CiBnhibIb z_^|SV3XULM9rit{`}(tXB=d>)U8NoxCLC`iaLxEjQG1+PX4R5@viguo2%j<#HvBMr zs6gJ=Blz=29DEfBk#T+CLl}NQFR44(=udGh?sqy~Egh!|r;y5vlI~U1i>qi~l9qhK zj|TWB!^a&XTOINRRw9E>4Naju(a1>^8-(Vx9OS-N?t) zI`drcL;W_|882!+KNE)60nS?jbG5I)lumxd)7-aS*K0l4y>WZ_>`}y&Uy3w~DaH{( zR!CIQ&GfUV-J>b>;+Q&fEeb0xI5=H~nmM<!4g=1qY>M&FufTi|m&VG700Re%{$+-{*CugqR?RRtz&NyjxLBZs2 z*}bDmSoEQyMI| zJGvT2L?{Z z?`OLe-e@(rsO8FQItQvkXvP!U)K&4gjkd~pKnMvR)HPI`Yb|{vbhLQ9Xa}fLTo8P?pJ9RhNLRiw##(Mwd7akZYboyt zzI5m&(wFZMxkdiS`!hPc#HkTMc;n}F${6^=Ktv!WrM>dH zQ5?I}{Pb9d4u>wwH0T<`XFLKHrK_kty1R`nmsY*}m&5bxW} zH+lLmw;hu)lL~UWx7iOgrc)_oC8m_aFRgSS=lnU`*qV%NYa=J<*FYRk|`IV%p~KIuy%JDO{DYz3I-ITC(MW zg^?noLB2cs1$A(LwkA_P+kiSYEcsOQe3w&^t2R|J_V;rH7*`SSBb?XQ8lLwlYmdfF zNo|LMO$h-;@J}cz2wegO`Wi!Y=u)AG_NLJ7Kv3OAX%8hKn?Qg`NBK!8f?C>3wTU)5 z3C@Zw(&&oBH(umEfn?gRnO+PCHlghD!NKf3l_`{G=j=iHo& z?@FGzmd}fGjyZb%#^P_maKD_sT9rNil_WZjcnXD{XV-V8+oD1S1Hm65fA#n250#v1 zI#p)JnVD2yH0OJP4ICWI%2qeZ`Wu#yMp^Tz4QRDp@i1;rk&u*P??1(`V>dv=fm^8a}7t)9}7ZF&u@g7#8H*2dV)`_ z?XS-i>TPD=U%!T(!o2^H_8>)?^!olRc_9db2fg5e+eMhJUZ`l-n&dDyY_ftj3dxl2Q_l zViz=f_8>ts!jfw-x``CYUDU|(z&w2luaT}YfW`FMPX=AG>`hy{obi1(I<1aJo>xlA zB%x7ffIFV9B`%*?s%GmNpu*(p)M=`+wVJ~z_p#1B3G}-q1M2iz?`55*8AP4_rgoA3 zt4^CBGGd#OOi+gglgMNo{0u+Juy^qLr*aEC@YhHTO2lxkMMC*WVOB%_-0#EQ@$?Fa zJrgw2=?%BV`A%Q;=v(_i%odv#pFoU3K54VLOb}*oJFLxeyBkjH3%JjvCT!u_h1QC7 zoQvJ}jNvrlf!%lL!`QMh-}c(o#p(4pUk&CZU)Eq`zK;$xo>ymi{_XU7pZUV=(9fQ) zP9{_Kh2`mc>`=ZK!5w_j95+|_C!I7uF#_3349%D1;CxFIa^vR?u1&?{NZd5dldh~s zx$H$rlvql2xMge&>iCPhL-m6b$Mic452LRE{Z}VrBZz<8piAj(y>#dmo}dR>&!=iu<$_jU9DHw_wpQDqd+=sx;L@iD65ER+2nO=(9cyjh{Jd#lvsfrjHdx)-3I*ej>3p#0=o&9? zqXgSOQcE;{^z6D{MNTSjyBrYhG;@+e+;;1XNU9#Ajl?Xyd|o z7EeT~#|_v>Nxpagul*QdQNo_@4B6{Aq}lJlxyyPqXB$f9Mv)o-i+X}K!hL9Y+{Y@N z#-HYAa)0@bo>pr&pT;r(ioQpi{6o1aW?^M}6uOqaZj| zNodXhfi4mecDLK5qTI`7ZWU>{KcuQw_?!+YHd_DfyOx)tCz2u~U&i&05=%0g&E(UX zcPPJ9f3j%XBE!a;(8~L^dHQ86)o0aMt`9uxt;5RcC0KJ$IS_TfAWzCGQ7!1H;EU;! zfo{~)Ww-WApz3G0;&USuy+jZUFWDi}jKtx277!9y&!P3)OAsD7P>bigxj|0MF2n8> zr|oX{VX=%_BVEu4P6jr^_4yC360FF?Tx#uk@H1S$24C+OSz1DuA6FH{I%SpW1+6g` z7iccO)HTHS)M;iFJ_tT$aj30QhgE>ayKi^oT8CH7N6qUDUPKYObnI8RNuX2+mx@^` zm9_$zG|8!9)5DXJD_mCV={MXCw2$~PSut(EF&9R`TLQZv05E=9lA z6=m^WpKf>xI87MaRLD@t=+T@?)a0l!?pMQ{2~4zP0o!Dlhm*-(NP7K=p{5FS=3*ZP zT3lSr>lLwU%2^_sr}W8Jrz?B~4Z8fTYtE`7><95*foC##$*_ZSjXsz37X?8$Q$PLg z*+yr*lq^!_Kf^~n#WuI3OhE7`=*kN@gfr*Sxsv@{Y%TlVd-H=45qXLwR#vNHx1SNh zYPy-;#RxUOnaWH&-wTmOq>@-3Z`p2>fh)f7#MDdT&CQkHUCqTt{) zyL1DiFQSjHPU$dCRHXt}7P08HaR!yH-fuL+zTBH_fBd7h5nXb5d(0h=-IUZQ?Ri*p z)t~cz)BA*D*>@$Q`Vl0!RJJe9t_w!hFIULSJJHDsH7(4w@ZwWDTLi;#RcgE(ysl1U zaAMIvQp#sULt0v{w5nd`+Wh)pf4XBT@`1AgF+v zZ^*Wi>0gJ2p-YxH^Q+>kX zH6Jri@Ss~s-#6%(>-8F~+(;U$gsM7iGSufXlNq_{RU2oZCoHW5@Wpg5HsjH=7Hg@E zu7*qF7C*(w@P&WhtXlf&ybJ4Pv`u}QB%_CrZ4`$jdU}z>_rv1$k(B(EcE>lm#IHc!r+yGLJ31a`D^vT-dK zt~WRN3);DwvzIRi^P1LGf5MYtc9mdeT=2@PrTI+O!BYeGwhjEQXc}@R>QjgKis^{W z1&vyo!Gd9Zy_+hsEZvnrdn0>Tqw%iteE~jTcA9RvV&;{0-I<+)Z0+(gi9}x-2)vf3 zMzGzF&yeG*eOr##CF02XG42uT)DuAz@cv2Sy9zRL@{0rhj*0KbS>89?1QZdTRt%yuw(ZM&#+Av7nnyH2AKmQA zoFyWXx;8r9$i#y8$HY)X_wz(SeM^POAVx6iZMFNsdO z$NOqqf7Tk<%dymAe;C=wi>WrMa^D&}W&H9i^?M6RIJ0PGWp0G_z+Q57vB70+M1GtO z{yy{3G@{-QYBG1r_;2~aYj;Qkmj*Uum`y8jJs0UR6G}c;&jZZXZeUr{8CS8DQh44K z=R{J17xgFQCuhsZ< z_9>GOOmBJ>QT^0GN@o>@Ns-@Trlam_3{MblM*@por8F6ikRdIY_Wc40B#WS;wS)R( z>Fa(9l*MG%nJ=k;_g{?Dr`6)7UcQ2;A&?>Du?xDDVH}wTQDI!9pt~m;LqanIH-)b6DY4>5s zl@xB}2)#vlB{OT&Sn@S|N@SatywBjVu6|%U%jTH)V2|!Fta@;6VUoN2P)+x{?r@Lg zoVEF~@sa*2g?BEf^xZn86EBvAu{urifNG{-!hOcdww!+ZeR(axk41E$h zaX+Vwsl`>Yy**m*K?N6WIaEWsypQ$ek2)0MyS(p3Dk?_#GANScZOgs_(+$*N7xRe6sIVA3v8!a>c*&+wrhPM`Y zf5S;gsta87|M{bg6j+}!5yJg<`TJ$hLBP$S;P?hd>j{5QPW{OT;?Q{%Az6){+Y80l z;q}3)1!k?1a?eM?*A)Za-Zr32@z#V|#^_7P6&1LQ4Vm&snGD@*2l9IN)q2rSt;Kg! zz|4mhS6T4hLGzuUPa+s1k(+8vk(kO?*i9FbgZ- z&~0TsL3|qC5h4&JJ~pe>QnXbh_Hl#T*`o97<_5z@ zK^O!3YP?J(2ER`6Wk?p?ssb4#cWp8#U3$r~b#*Ja~9;TLya%q|{~o5(XU zm*%t&=%9qR*QdhF9|tsSf4mI^#(#}fZSpwOq}|h{8$Q`bM_(q17IT9+SGUfr0)rAj zb-ME5^I)Cy;%Gkz`39G1Y4`@vM9v8j`V~l6n_v>iEj#NQV*lbMlOIHcx~K zn0AiTx2%GRN)Z1!vaVLR19iN%0}LbZ0I>G=GCLkA$zzzr?cOam%7A`KY;+i?JM6j} z3PL8akT51*bQ4i_YElDpIB6kcAQAi#bl&<&siCF>D-SjrjYVJ;ID^dR`<}emBw}+I z%OykwCiR>2x27SM*sw+k6k(zG$`4E8?eYrKhHa&Tz?T#1DR$q&69hY7}*UjB^*P$ z$y$6kUtB&1C5wDgutASe`LHS^wn9PuaW?1nxvP6sRdaKG0E(xZT6)3Z20tU%6An*jo>;Kn z^}V;=nYu|q(n*-KcYZeW=K(SOo#c$E_jH<7y3tfhM2KQX9!g`-I6NNEJJU8KlS48< zBWGy7_ez3zi3#)JgT4AMy;ZPLQi^H*Ru)E4x%tnZ1`XaY`+PrOVLi@Tpn#!|5l)u> z5-zgEX7;w+66P>a1qRk@)+zWOC^7UTU&riY!7%AlRrt6T+_ejFx1{>tZxi7K%1) zDUm6WNUas~xwFa#qpu#SkH}^<>YR-%N$2ZMV#jN*gmI?tm0ob_#DfuSX3v}}*BCRQ zlXsE&8xvMn(hW$^R14&T^(IE-*ss(K9my4IS54?FFR#Co(=VY@YLGHT*fy$@x6Xd> zB+dq=x7&91xAGev#xGN!IVh&1X&Ao4{_u?v>5NcePrrFjk&^XUacWhL(S*X@x= zxbP{Dj&bQf_W2-cuf@8w;LoRg3MsLsekbeff7bM=f@@{!}mA8s?$u?PtAtx_lzbS19V2zVUH$jG3<1A)G*AAIVk zt+w&i3)^c{iegJ0LcdBIJqbaW;1f0^f(r>MaG5%4D(811c#UsK{&DjzA=#tLN`bew zgb-(tFvAk#@{deNWbmip|05GqO;hI@!Kfqgwe+dK29qQuv02Dw9e_)OqwbIE zTufC)5-BJ*^y@R9`^^w{P-}#j0gVx$Q##O!SAsWqiyL{|9UNB{Ns*j%Bp-s?j(~V~ zc#`nLx1DTD_b!!C0MEVHnQ6&eGzB+hWf0DXhG6m=edVHOgrS^m@$Q8JIWZTKMY`74 z+ZsBImr9{9?0O}fZ%yiEBH1mZzr8YF+_;!ZNo_o9{OaXZ1Wo^=1ZPOmvJ2iUgh@b4 zoX4}vp1B?va^?KzotX`AgolLYJr{A>ttN4g+<$QrGN%-fvjyTb+IPQ^f6psoF&30J zIF@I>lB?@sjKPoh`NR@Ei1H=|-8ceA9yn>0+ChO=ipENwoV>hvQFxQW2H6)MV;^^# zY}2ya6cYB+PfM^knR?Z5y6}R`G0*c6?v;|4Gp>@|O}4k1ljRyS%beh(XTIOr45~g8 zGB0_-5s{)L5=q1dzY^)rY4=+muoz!Wh?5?}8UEt36{~!;N-VI&9xYZvN4sJdp_MHW z!5N+mJiFd2m$J1j3BB9R;ZuvR)nU4%34CP9Lnb*x3ObN;)nWW-sR%jniMAZgzuuXn zI0zUare!uAk}62In9z00=XvTc*@U3byuMLmVU;0NQCcpSk&d2!dPeu=c*W16Qk2S5mhVvMQlnJU6fG?CG0Y#Vd4i?aF=EAIo4|s(sz*waF0CffXImv@~EfNEfD! zMJ4WPZ1CWTr*SyZZj7E`+Q&q+QE=QHtO&HpVRT)e@8?^U-&s4gsm2QU5Ip;UK!J)| zLTT&R(^JBh(w&#QO$WSykjO?s$dw++`l)i=>S7t;eeG)fZXQ$|TlPz5rmm$ppJyq3?yD6CTAKpuQ>pnXnv3OQn$YPBHUine+g^ z>i7N5&%HNq>rm122)}XJE#7duu0pF8V%#hDk`&#s@p@muq;pkNNxPK1nJIQqqt~y| zBt5E6F_p#aNnzR%+E^}0zkJ13yX6NUeFNWFdIP1?f6`qTY*va5|2A==FiLxqoKBEL z3NZ^Sx$k#sLBW}Air7l(Pg*DU@obvM^V z^$#(f3s`@8^VTHh2yu-?SS_Zl60A-(q@*@ch{rLiePBTwIUzOn{S)9nqk@;uV%OC6 zgL)idu-iQ3&&c^sYU7){4CmWn`IDU=LXBoM)3^N9T%0yHiZ7J$@I*DqL29VtPipA( z+3rEk;~KNiA9RI}>;3S#_Lbut>XFKeLz$)v6*aEtnWT(xseU<*SF)I%Wk_s&ttk^x z7=@Iue+|<9v_G%Jso`+K;wm>>H?Z3u=iPKV%oXxD-wg~wx&Ky5%y05SGLoREfJ?j^ zeprJp1y+f?lpYjkF=?15itg`1o~C~rb+;N#C}Qm4X}CgpHeI0?L>kb)Bm|OLc?KdZ zN0p99p6$Wod24srY=qfgh=Z zR*sYV5SHnQ<5d0>_iZzz5v?WE5A=lbYa7NgIacGO{`mq zuZE!Wsy|dhNndL1)U#LB5Fx>!M`$d!+R-=FC@bAXwk1{yuinT~kPgFjij0`n=He9h zz0`h-)**{5U;NW5DkEGe5u*MFlV4}`lQoinMOqsp3jxgkD*!@Zc+-q_VZ3eUFLMtS zz+!uYA!1(K<$Jz)_^BLIq{ygW*1;7G3yU`PxqAQ-eK@kx=71ammQ0cJcI~pt?D}g+ z>R(`Y7KHGamQWn$%B0D6E`whl+dH6rpkUuCrx?VxR@($!4JqU`^d!sBt!zCu>gtIi zsD&~KPkwP;;EH>(ZZ1wF4W~*4@_X#^A8m{f|60&*_Xyh&(tH#{LdgK0g$_o&N0Glm zI{7t$3|>IRyM}yz>6&9TwL_~Ha5dGPS57lB)``@+#e$xcyE;4(h(#ZZ7)RfeUWlhnwo>VMLR+0wJ0$hA0%mnrFoYk%a> zBj>so7qSCoFxq5Jns_E#MIh@ih0UYDe5J%3q`k45Dj)Z3f>cLUBjrO!U-q`Puh-qM zs{fRm)GsR@b(b6^vae2O8cCz%Ju(xr9bV_~HkA76ljqkoDCsw`8m1$5?0Nk(bmpgw zk@1)PV%P5wt5(duKP?FBuLPw(m8Mr%{r4x9s#^phQjG80BqQ%~*k6F#41e9J8}Suw z$-#ARAs7s`fIQGGw?N+&f`mLP9C#YAP)TJuXl?b-jAzpc0N!9H?j>dzBr)) zqi&7m(LdHH6z{W#d5`Uc9}RMaNd4yj-oDAqYW~HD&65IHft^s`(?$2OsyRfIWwx9X z#b^R2?FAB_;kfh3-gRB}1XYHR+Y`VX!y4CgoZsVnmYu7#AZ}pU3F1o$CM;M5-PZH1 z0Luw;ISuO9?8I4u-nrv8hw}l$Nxtes!|y@o-s-2709iD0si?v1ZgTZn0$XsWLo_If ze})4UzTSF7d0_*JfAaQ0=?|S0!f>B3z-1qDUKz6a8__E~9>RDR$Qu|(v#{QXg!WJ; zrayf12xNy%k!m7~92fX==*PKv;JTPj5W7{9zc{R2ur3GEo35D9D)L^VUTTy)uLNcu z*)j>mWjH)!2IOM9SLB!idA88yNs|vd%+6?$?3CgrIg%ylKX#F&Fc7H|Tsq}zB5%8q z5y-g-C=cDHuS+J#&Z@I^ZVPPEiV{gtkH_wiXTl?=G8ap{o}^=Xep7hof=C6eZ<($u zzfr=6ul~tj(Z#WQNM(V^OWE5}1_WF+6g4f;e_}ni-wUD?#4PCsl#-F~tqw~D@=sBA zLQa2aBA#`yZRA=vz4rg2ymIC@obU=Soaqj0wZer zj${R9E8ACRyL{mpJPb{C9E0rQ(M;39kvSuhSM(r>pa+Lr1){t)OJ)H_)4rLiRkq#F z^Y=KXbu}Ih;c%@))ZFZ*JM<^JQ%Ya^DG!Rx0okV;q-ZtFva(6B3n9Ak$~|w2xzg-J(K2 z`XIT}x-AQ$o=JBh{22b{&eNzzW^TcDF`{21UvpZXGGugADmYI_&|kYu=n){e+eU4t zvk%-l(RJS+i^4$llGbD8kaw)vtBTm3%Y%HHJcZ}R0_OV2re$m|ztQKGx+2*5iuto# z)q+xRxbMbj?0(ZPZ;#TexR*A5t;Sx~;z3raeQQ04FL8+ThfAeU5Kt)i4<1wZ7^dbXJC9QB$XV{itRBW~ou4 z;P-?%38mth#*kw(C^ivjrgnkpcLo$@Cf z$S>3$T(Uy@gn3qR;F1-*b*B>JejYUf+HZ!njdT{@e9`6==l?X`1lLL58jO!}Qlwx1 zqNeVbT`VJVN@fXPOb8}s71cY0`kyUK{|@~RC7jlvZC z$C6k4j|XH1R$aWF5qdMNy!YU?M2}c>E6+qHwEFpc;KJr5oNLxw+O6iVp9Ya1r-z5+ z`tBn1PouX^lvugMK0+W%PJ7Y{;;;>zqPZAMd-ARH<*f^NwQp7TB%m<@uEh;o=)%2j zEbC$gvCRjCKRlu2CpS5*#h0Pj4tJ|Yv5+&wLet@7DbQZ1&TF^NTC9BdG>LxZJ>=+d z&UfEE_Wai1gx}ZK2R9#t4hAcKkLd}DK=62pHu|oCrbGI}PoPK;{C7B$=R8|OO=S`& zC8W35Abo69sDqhi!!ouVUj4f4RtxOW$xCG^OfMsAjDz7DjRzEax;}&;@G^oDAbg8s zGs2Zvh*F;WVLXU{#6pm|<~lV?PrS7~#=_`77iAy-&0IgXUbX-!&Ms*36Wz`2M6|j$ zi!1zXGc0-1i=osPr|XUMp&H@Z^@X`* z_)#%*8xkvj(u>kD_{4{#S5A2Q#;VDmT1(oS8s~UVKQK_Li>-(^$m|9ACyt09k`#eF za?Pj{tlYfAmQk~~&S#Xu>s6rp##sB;jVgDwi8*y+<|Ji=hG9N84O9%*k+G{>T6+bU ztDe@#I!)%BYMcS;oW@{Wv47rdt!c=8KfZ(H=_*=AqwS9u^`A5Pk!J!#VKP;hOGa&< zJY4~uq4utdQO_ylNKJ{wUjk`vk6o&IRIm(t8xpB z^JAj4su%OU8`Q}cZy>!FUI~IDAZd*O)7ezBzPR>c$m{I_DlRUKy#4JHp~+$$sju7U zf<8BX=mi`Qa1+OcMdqey~i7 zNkapl(^d@B;52HF3gwEXzc<-6srET9@oY`EH_0aVB7?)O9$wFT1v$xAT8l89Ho(<_ zuT)0=o2*TPcv@+U{4F*d5J!un*pejeA<@Db^nM|k^dBz^8IpVh_7r$j!5`j7s1&ek z8KFf;H^@ne)0Sj{e2Q1bHa)B{q<$(!wxfphT)bS{1eWR2v9t;(4;XD z3o~scbGCGCw(`Z{B$!q#nyk)!Z}cqvO!e|_oshCmq#bJ=1$6G_y_N!*IRk2Edo1bR5eI zZ#(nA6h7T9332gkj|K#|_A1IuaQ?WS=fnXYKZYc?(*Q+*8?7tqT_hv#c{X0~h}}+C zDZ(p(R)hAIY=dni1~%w?~h}AgX<)*ihjWx36X@3Dpx~9>*s)cv{Ef>|RG*v8m$*qsz z-jDalI0Yekzy&sSPTN4;XHph{Rs)_2&P!S@h{|rlj0x!k#+s3cQAO>agN9U4(ipf~ ztX&`n?efV|IE@sNWn~RWTS#L0=b)qh9yAXhWp5$8X<%a1c+&EE1*DY{d*u_Tf+7Uz zv9wr=Y)@jGgRGdUcvq|QCWD})H^ffpcy08eCcWkq^DN5l<}>l=IPXt4UCs z?k=e{XnwmCj8C#3>AB%cRTbx{SWG+dfPB8T!0=1!D0i58mk^@WedCpj(QyZ>WD}W$ zY*cbL4aO|ADIMCcAnD8PxXoksrn!tY>FWG!4f_obQFOrF7|ana*9J^ImXMiLO6w}r z78hp-r7;t=v`?wx{l}qE)v(GLX^P>p3mpE;tw-$gX&%o(vuf|Yr)JwYTN$sM zI2XvViAPANQNTn(@^O;Tl;%z#Zl~JhAYJ-v9U>u}9Rn*8(}8|9kW8I+-={28=4ViH zggrQ1h_#e3yVwxNPl!1$o*Nb7`4ys$aIdzK8PRAN?Ozt9c1jRBNR`aA>85KBaI0#w zwPGy1BIF3s{FGsGdhixQwMaHNlF^|koh?y&fNzPplAX0+;>YG7b@H&|0&Mk)OEM-1 z?|*!jG5;}>YG?6f+(1%%kcc9Z>$fr;74P(yf;wWw-yT=IcqmzttEVAM2+(QP>Fe~O zI#&6zY4R56_P>xNnNT#h|I`Nii;cWqH}wdvvP3YR39cfJ*LBElC_UAZw4b0as%-CB z=V)S|LP)E^Ra#49$h&%^Zutp5Vrx(d~(kWNyFtm-AUI@mNcc zJC{1v9)X62adoG$-A;vCEAkNnP z^dl#?1?(mqlzaHzOup6+4sC4+MxeKo{&P(#quv}60^1yMLJKzxVT^%p!U-I`F-!i)GwK(^XOZ+$zz~5 zrSUn-C-Oa$%GC2P>F!nQO%sWKd)>9oPF~;IhVMz!vXQaI19=m+*SE|fBW^GQu+5RkCU0|lAr)b zI~!j6Tx#LiMfXr)(^zm^c_!W-rI=UB;1a&Aa7(kvdb``sI((^q6&84sJ1AkzKcbk) zi+tPSL5@kkes{ZZcWY6qRz{o2=cdV;!ST{nx6_c%bTn0F*vakS%KFse7uMMHKmwJL z;>)JJyc-qRg*2p3)?Q!2@7=PBTz*Zf?9DaU3|`Crn>IptaN+S_NX3ebIUg5XGZr zXLL$$Yb8G&5b|Lw2vF{){A}T65!D{>HkTomH0DdmZ<}4W(XhhyElhsXEY9Y`CzqMl z_3IQ2r8cq(G))RGEMgfgQcbVDc)_sbD6t*SQ1zzUnZ4sBP5&=_Mjn~YH?DeGCF93G z+0@PlV5x0P5DG?YkBJ8RCW?+@CJG-nnf#P=qZLVtFpd35;o^9aPzFs4lB^P*<=PR?*6iBcs1!B+2ctNSy8)`?D|RFuwF3#$b8=iuTx zQ)jC5&Hl<@4Dozj{7r>&&U1z9tLqoozkPKYQ+eI2)=ccSs#PW{uCEm@7fk@}jfbNh zjJ^JurPpjAc)GPX&>jpuFap|-9=*FqN5#&A03qjlfG$|_(T>h_;y8Y-4}^5&Y;<_I8NnW=(#c^g;0(J^hH>bW>IpckR#wZ(Hl9$JY~c zh|UMj^?O(IW1G3r$VYOfT)#U-$jyiozWgAxcbL>_A5rbj2z&GPEfHGfuRd?*yC zSA!2tOs)+h?aPC6iS!{DKhW(9WM{dIiRxSENw~YJpnT;;0dq+R+G!HtDU+OTEN77 zKxWhS>=E?>Z}UgdjgDBs+x*cfFVyuW$P z>uf?WI>CZG{LW993<%P5on=6H(9A5B%bjih16+Cp{T%#<7Z}`+pdgQM0hkyE7Anl| zbp&(#V*)?nScru61+9<_8eRT=>CzF77+9N+n1?|VKe0vyZwsp=8%wSljEc>0_!+Kc zc{}bs!?Pb#N(SNNukRfquY+1AOGK${`qX^SiTcI^1}mG?)sIrb8=6e+*b~D}(~9h; z_sg0-d~f{S<}jnPn?$OB5DtfullmQIbw&VFa@PC!sw6cw%E_najlD=(5hu6Smz0^P zFk_cA-$LJG9)}g(O8S+=6p8n1-fOvhUygp?au2Ms9EKWM-2}3z=+v|UzFt(Jv5n6G zb+l31L4+NJ$IoeF%0e}!z&bb9MEK<+6B&uiTB+~9*%&=Ox^BV~^111sexJ9oxp zf^*q?;eaAo@Se-|d$`G`)VT2?Eo|?vnR~*mSfPNv^`lNQ>f_>Au*xke1lP?L-sOA)sfTW07b7P~du>!lnMfJX{xO$xmMX ztj_uN$6P^!Uj+t-8wQFHB6g3}Q(>UqJ;E~lyA&Fs0wBGQw5bwOtH$B!NB#Z&j0bwO zOa$Xh27qvxT|M++kgu%-{|C_K{-61Fj}G63wLZd?c7A}E`KN;C`6B!mTmJysGGJK1 zYYmvg<-A|Ps1GWX4FK8{ne_|cC2^pjMgSFb)KSd;$vZzv2zU!Ds*sR$0Q6SjqyIw8 zkg&n@QSgtDhu)8|Wl`CT$qVKTcu?A*U~AC-mpvyAtsRK=m(Rus_zHyr`t9^a9kNWd z)rim=5FW#;yMuo*%pj@(>HP6Oo7YSC&xSq?MUkI`{Un@=57|c4KJY2T)o!U7WC(wc zGO(oY-?{+Iv8>ft|U{})yd8tTEk!3uwZhI$NnX8*{f z`4Q9~^qjk|b3_=gF9AnAE`-1GciPJ1L6U5UU8*-nh#(<(-bEHE{b$L61)=8;RqyzJ zsCpr8py3`M(@w|`Kdye{4>bK3dG57H7aVxyk1N6>>}8P4DE#F44+x#@9SMLd=%Atq zw*Dp0AyJ9QKZ;=fdyEhA2*`6`=s+I*(Ikbz@OU7P3$fWEB-!u~c?63Xa1ZiG^DjDE zFDzUtgiDgpb)EMT$m3dZ&gVb!2+@z?{|nWN1M>KH=|LVX$F!ItfILRf@A~_-fbX%T z2(|qe&V~uO&b_yfpf@0d6N29d|KSBftv*I~fntr_dh%e?A-q6;_k(XPVvy~IGvkIg z0^$Mx=NL&K;$a5osE}dM@o!#WFbwj)c!9#g5DAfoLai0^pHThd-pMt`F0{}=Mu z@AejM#9rt>Gcw!!{{bQTU37`-`60akb3lNE0O9MYB_Z;12G~Qe-Tt_WK&xOG{yoMA z@xb+eg-!*;<6j^|QjviFf)J@u9~8dYqd2Jh z!Gwu~43kDneBAexatGRkGlin@=Kgpb zBtYBA=RaUL!5%zd5K)27lKivuM`xXRoz{k4(gM+AgiDnJ-*dX`<@+za@u28=uehPy51_r%YS5#on}*v#~gI}>8xF<~Se+(;@W#v6eX!2eUOdvu$O6*?H`J}9=taKe>)0gxNPuh2ckxA{>U$EepT4c>p|#Kxl1 zDrci&GO8wqW6((2blW!Ox7J{UX~tT?i?NofFM6$1I*K+>0#_xC z$d$u@aTShqlt5+F1Pq>4RPOW)e4YV})H*4UioSvkEqU)X=b7{&9_!-(aB}ZhqGj8)8=cVB#&+r1nl z6-K#=?+rgEaz+-OG0Nf2R?YP_{j%nK6EbJzqb8_Os_aptiZz_UIEwX|E;{J2^_)5S zZqYMMkGcLC4b=2CThBudmS5Ne7?V@3XyPG$CvOM)c`zYQd2{ND1y1v-ctACaBVP= zDdrcPu~nwR1R2j)din~pbs#r-ZX$oINELvB_KI2o2eJ@fR}a~^ zLsqMe`5AN}#D!-+0WNLpbFkr+?g4Yn7mP8XrXt>S*~fo}irXVY^Fkb6^R9O$MCdLZ zF=o^eikvwwX=vkwDrN?D&SrOA^vbl}92(hL-Pay>3NQJrb0Vkve78Bi712)SvZhV{ zR^>nMa}c3qv{temyZ1ewMMiZIGj*X1Dd|&+WR0U*Bj(1Brw-vWvA8(EOGAuw!0>d4 zwo%Y($-RcPs%cw09267GArcU>A5H$^jh1}4MIREAmGtJ)G22bZ+w#3OWOUt==m%}& zF;hu6S=^1-*VK)n1}Oi<{PV*x5d*eAIwV4#5t4NL{9x>HHmh52F(fOSOrN$!@%c*) zTpq4$6;cw@%f38nqbwY)=ducE{8^xTm{$V@8My#-c&G)R;BGB<-#Q;}AQ!Q=IQ}fu zDC1I1rq{`=+`cX6uo?H`w7q$GG@odLHecyYwK^~3do+Z~+c)<{sbbza`w)Erag(>+ zPJ~YD#;8h^sdFLL?DM4#@60h!LZB!nAY*Nfe+*tt2XdfRBLGub&idTqDVzlaAqy58 z#Qy|fVXy3Apd}%h3F)~5Sm*)BPuhzQ?o2(b=A$Pso+G(r5l+zf{9?(9ap#eHM*_FX_zvX4#u*-VEp}jB3Oa1#NykkDpt%FjS4FrkAvlo z#6gtii{|r*>0qz1=bfA1lTWyR!<@qN>LL&YrZ2Fz@8l


DbqQ=V&hTD$$t>>7JlPBA|%aK?`QaizJp#jvMn!Qu??=Fv$BJIv)-g z^Ez_QJ&h>dVFI`AI3@0=Epw()uK}p+`0Jjv9aHcky1@o4vQ(fa=+27^<>Y@ zX{%vo$$oefH@c@bETIE33x+0nicM|b$7;$IB%sJ}30%va^_R@zK80frkw0F_F~-JY zbIk>1Or07pT$kOis-wAad4hT1Wy#P{J%2Y@WHNhHO@DvL&tZ%>_yJmtN?AJJmvq*` z`{y6OffpyHZ}SG_t8af$j@;Z20hVvcHa_z97ciX2w1eW;;_dygxW!Fw))<~0o83nN z@57%>le-L;PT%r8sdSqSI@;kX^qMpr<`o$`%GAnAUx=<@ZhY34XPT~Hnwq+P@Mz`j z=H_Mxy^>t%4dG$RAucdo)RQ@A=sC#r0G2n;%Wd6H} z2%Omb*PsxJBGbH5l~A$77q(NG_O$+Cql?8!39pM&gDRKaf^MLen1!D&={{Ewe(I_1 zX(6|?+IJ*+yg}Au*6XT#BKBrvi-jEn1_}k3x(%ooLi9&7=^E4 zi2`ce1u^m>aV4T#uFmwCAJ0O+=zD&;<2N#D!0}{TxRW%E$p($}%Gwr=;Su*SzZYT( z)KZ9>eBfjQdAUdq5PK$W_$I~#QlCQBQi3trcMO?qubFVaNc^cN% z3!buj{ASU)i~7iNav;-|xH+Vm`YK6Y6@KEu7hh=x=&w}BHp_8U zRV!-K-ozb@*HY`befPGHg2!|tXcx<D>AWEr#lz@bE zgLH#PcS?67A<~Uf!XZSurMtToDLHiak#3M~`0a!5_r33(xpU|KasPa0P|xgf6h5E5 z_gd>&&-1J*aizyxryBNx6$gA>3E)Q1ERgx;o;Vt){4*s=&F|*-;LJ;+coB(2M8vQcvRT4@l%MK?KCYPT3PbW@0d=4!rbb>xCeI7gyxPuLbJ>);8 zb?~-i#`BIi`*im^mN&(C>9%TKwR-@T*Fv*5La}(O#@3r2`Ayj>->_6lCY`SjPcS?Z z7CnX3=yHXc+H~22C%!u(zpu$~Ax44);AC{4O9$qb$!$G?FG1n@c?9h1zYlk4-aU_- zo?ZD}Hsj-AJQ~f08RssFYSv8kecfBo^YqE(7h7ApTwg`~%xbIA5G{pnTqu4PI{tv{ zMZZpU2593&57Y<&Y`C<${Yq1`TG_>5;%} zw(B3!D2X(R*Rq_2(7OYfS(p8x`ax=_O@W~DQSpH-!^LUrX$M8_fl#Q`0!Gz_|H6Du z@xH~KSXuLk6xi1Wa)}}o!qPbI__Uf|Znc|YfpFDy^;ifCe$kI6*SeentdCe$6A^&{ ze$mTheX8~IbAeyHK^^*YQ1$^dNmeel{loxQocRBH@L=r&VTuvv2ra2fe z`eMtKVBx{h9rbmbGWTe$FR1F59AKFF$2^6~OHl1zT2EVP4+e0Tek+nP27|^j3yMos zmOiJ7Q-F<(^Qsd1T8?A%I-1yN|8A*rFC2YndvNV*?7>Qaz0TD8UY~+|ej@^w$?ML! zu|_-n@)!@+E?u%X-B;Qqbv2P8-@E$wnL`@Sr<`rR zrW3v!>(>jLO}ViuX@ul+`5qU(<~}jCWgh_rWW}b1 zxDh?y_Z2=q$1X-_vajs9BTpxnqEoqiSt>VtZ?th74qM=ymVwI{wWYz2lNwnGO6(4= zhbo@o$KKoyswe$Qd*3>qD|qlF(7D$l_wjh;teDvzxzb-gRJqMsyFuq9=q=IDx^1z; zR8U&AvLCymFLjr+u)vFbm=^=gr_ZO~AkfVE%4)x?3_b%{2J>VdYv`y|zh;ZudUQ)Z z@yfvGCc04FS0aukt)r_;Ww^b;OgR_$(}~YFwz1%i9>0LVhmg%rf$+IG&%A5u^PgHX zuFh)I!z1f}p|V+c(k8Rg3<^DrQP^rdXWWI=Nj3t#G_Ll=72oDu@UoTiiu&aUb$g;D zYo_M?_72t>K)S==)0>pDAO66g-tr>qKocJs&eM~jBV3HCy7ciL!po4V@C#1-ofwyU zf!|8W0IJ_2vnW zF@?tVOoIbBBZXdP$eR*{ibCL0D+^&ZTedX7Oqa)X@sfgGkIae`Lo=XEaqVT6UiZF~ zOAXHl+>*Vn`8?yiPbHx<0R|DR=c14C-yUq(?0r*#@us(qJ{$S+tW&G{_39VPOnK(! zEnfFF`9EBZs;IpOceEdk3A&dV7@to8{>1!3oo;qlr@u_p#>?I5!G?sbb!U7lFcH&c zxMSzy)Ij6r#%ocU`UOLAy`GW)q*CK9i-`+c=Hw#KWIeM0+2jxXf#rMM9~wDsk2S8d{|+1%7>6wOI<`jPFal%K~(gNLf65`cJjN$Oji zU0ag;o9|K~uav|3*i9?#rsMx{>j^nt;;5I9M>6X+$Z%ddUszKQ#G_B_+B$`mcO1o+ zX}(o2d{>7*e2ot_9>w^$VM`;Y)&9c#x5&SLKP+LjfFT65s|WrKj^-o5-X6V&&t3{h zYgL)WuhOMHF`2bdFqyTT!H)dve0Z!Le^%0x(qsU3U!I9@MhJG7%$kouO&YygJ|)9hA8BF^j_lISwH?-k=JtY z44I)isMfWdO^28<|Aqrd1-@ANuOr>C7QjIEod)Dk$Jyw!|7ip5Yb?OCsSggyzdswP z>k>8$iphIzzil;3=MF)46WZ1e4PBLAmUq@6Zf!9Ou4ppTp*=+RK!Z}B(f_K=RfCx` zR~Nv}3Y5Oo4aaJJF;I=J#|)Re3^ki2w2lR|IzPhk4|r=#vrdVv+8&|SKy?n$&RyA0 zHc%YRJc*BCmUb__9LO@K6Bmu9=XDcd$z_qnx!t$@f=~ zb1jNRB#Gd+8Qr3ZqiVz9kDI!Y4;kAx-l&r%-`UKHmT?s_urCxkdnU0S$ZC-YE6;d* zJem+x%U8n6tBfG1YQ2lN^rnpb=6b%N)f+=sWuhE8I4kBWqvfBZ!*wt(D!n4j3N|K-c6O4QzA(!BE2#^`Z5{haeZk=^6J|Ld zyucL_wIqd88(I0GxFiddP31_ z$t_|QT;AUA&afMi8N1l#* zb&Qrgb=T7{epTb*ejzQ_2Pi_ER#9$#kVkKelp4ndK4&i&kQnL+Ett#(Qs)K!DxwYj zaoh4Cy-|KLBBg^;m&=>@!j!+U+Nxl=v&l7GB5)vnai_jHHhpC99W7pm&ChWT~t$<dTJKTSgjKkYgb^dBdqG_%G}$H&pv2 zcgk&}dUi4FRAa1T)g$PK>~@$N-EJzN=J}gVvJ^tPnyssB@>*Up=C5>uVmPXNAEBW; zFYtvPr8e$x5S!^J<|^RI3|4%x-RJ02q{HdGbv(y=nif^h^vrch-gjRxEQecY!R~!l z(Pb%l9Bvz5cPc zG_~>Aua=}yJYGwzYIe9n&aKz2{OY@h^u?*vsf_kQvP<&MQ*iRHeIDId}wD3 zi!Y8X>=k}e$Ru%~*%IdgkLT%2weKRYJZjCEJkI9RxPB(O&G(qtUlyoef$TVxa);+R z>sIUS7F3$U_}ozPtRsu2WxDuLD!*sYIb~u(eg4jRV4KQn@8MnR7qe=*E<}pE!jysYqc02LYG9F%Gx22yW8bK#^H+-BpbGUB%S&R!0cKkl2ZR}~es3fTtdksCJv+HuD<32A`BB%76U|WZwWV)4!7Zt64e_8A5HKyU&#QfT%QAn2LALcb>&ErR z^I(xl__>X-DcxPK562wM*oV7qL+LJ)suB-8?2=n3&HxreXQjtW&r!va83d!mca%om zQGQWpoG|SVf4{d@eld;Mtw@ijRSs=EKh#-LP70HPbE2kQNr81y2Ek}s96{32FVRAc zeO!>jQGzZQ8h)QN2FYBV#dNExk6vq1p;`&^Dlf@jT0<|QKA_y_Wxn}I9u&)Bpd7cp z8Nxj{b7&Ah!cVM2wfPy+z-==py|}nImgA_SUF#I3ww@EOpWATsd@u+7F)3(&uzm=i z3pr9JObj6S$87kYzmvjIqlW@&j}Xw|pzvpZ<8kT`Y-f;92+LelNe=ZybkgZ`eNdNh z3n={!QRqctoD(UGd36lUFAPPbW6oWi{mW}vZsRjrRYI^1tU~H<$RpFn%#WE1ygksN zI}!Ee#V4}vyLlt~d&@RISCZe3G>m*=sK8`_cJlbQ^2=Q*&PS{7Ubz^>8y9c~UB5j` zc+el;k>$+vQa_QrJvHl>_up{@JaOggDwhdZu2^| zICL;Lr$pfu8dj@NnnOY@?^KP(_35vVII$EXKJ+)I7A9?wc`&%7w5_@Cvoroi6E3(O zQhoHsHJ-#EsO>N ziCoTTPl@Jke&#HV6>znZ&we05MwKhD3gQcka`syQ;^z-&9a+A8+ZMrAu;DxhOxNfGz|mC{{>;$;M5kjm&EO5%P8qVnll-xxOH zXJT)nZ=S;xD)0PW)mpj>uu&_*`L5VBw>j#*#ns{un|y_5^mQ*!xQr8724|K!g;moR z<~N74Bvtr3{IzS+^2*v$#ewLYT)%dIgKQ|HQk#TAk> zB3G|f|3SI#TFjvJC1jaQBIT%)dTUGZ!4ViS9Rvov`u`{>VGp@m+}t`rHs?SP0tKZL z8KA5Ye{atY2Zd*38}|oQc&Gf_rTV(6v*OOz9pkLF zeNC@URzja8z@`Q(!;qP!IqVJmC_Yk+(MvazSpNqJUiWvt7Z_FNU?O?C6YHZxyLk6z z;95&_O-8Nj%7EOLFlnypiLjFl;Iums$oCeML&B15Alnxku38v*>>ZHQEe0zFE)LpVXqV(bOfj8CNs03{DrlR5LB_ zkq>P9V!lPqdR&Ys=G1ydgLV)1m{K<}e5WCuKEGbR=H>7hV{LT!mc=@R4%>2t=B?>7Ap+hAKG#iVsH4ClVnr{m>_~|YH!;ifzy(YY zw4mh<(^di}OYVZ*I0QMRAr`xo*v&U5lj%+yLkO4gA?%|$gCb_oxV*|$`l-wsDvON5 z3s{jCx*YS@Dw@|xMEFj=LRKlZMRHfpw?tS3((*|hS%62cqN$nSCOv9$PfwH|-m-pj zq~5p`=zz%@4&a;Ij9@S^Iu;a^PMt(!UH5#!&zJ8+*5%=7N66nrLL?{n9Iyeuhrb1= zx2j3|XI9x%gEbDZA{ADwk{Wk#nC27eS@j{)FXkHaRh@-U2kQEkb^bQUj8DaRr#mrb zxHX*Qr#h`pV9#=DkY_vF@V5;MztkvBXJ(5L|5I4#CST2jHv~MFzG?RCMWbKiJ=2Jg z7>~Ezt&c~&@RHV5>k5>P*o>Et--PDmy{!5@?~;H%RT}~;;aOG-w#dhlnSRRQ&YWl4 zByrVn6K~%#^UYSUAZE^1L#uAkyZ{Y`_AwiBwKdrva#pIgc!!*#9>g&K5ktRgm4Yz~ zQ{cLe!+=Di;MdeVPJivKQ@rlDMx(~e_@FG)HlO_)^L)QZj zHyj2z6~Me^9Ofm0_2+ z_wE+1_3RqcOv~(r_ZNtkv9U2u@}0}kL`Pt@hrKUE{Dt^+-0!gP@EjT3P-sA3R8)bM zX%lt~pK}uBY=ij;=@@92)_%5G3 zA$zM+w`u6oyNB4~>r6X1=dFQ{@rzf(RXel3gUw`Hz8+qFRYBy7?b8(R8BwV ziq#eSr3!6qDA2p{QaG`b>{hBW;!ip345O`OTCeklLbOH>BpKOe(tOj=iV)Q`Wd?q|<)y5+dloOix4J~etc`A>qsx~oWJ4s^ZOiLU(CSTImQ_uh%l|W;Fe9dg ziAAkP^hO7-B3-6!?>fdD>y+Asg((&nL(C|VVK_-szyAPanH!@QcQWeDn`LT=#Q6pL zTMMq;(#JVYDb(t;<7G*)g|R(SR7ZI^nAFUw(Vzx>3vFNwFdL9V6kPu$Bxtpll2~bX z$i#Yg`JVm2fC)R&=2$d!i|q|UoxRu?8^zUT1VMn=-o~FKZA1y!B(QMHz_aJh1;{)! zskiPA5uXjtxO*#ee=>J6wHH@XDH}qPiN{*vy5+5+ES_jI&)hZy z??!CC$t8v}Q+3^r2@CH@yQShu(DIUTQl$^gGYPZ-q?S z;T{t&>*CjR0!sDj!pXHbDybm&N|Ua$vhygYs1@S;%S)x+SEuEcGa+||g=fe&HaY<^ zft&*WXt|ih1G%6l3$$9u|Dn;>KSD?ah^U0ck2f~@aOO7S7keb9c{Kn&B!-d>yb;lW z!w{j|#^+5!)2EU@~}*20{&ZF>4Bs!xVSeLMH8`JvJABtuQur;Rnybha;U zII1g+6F#W#DJAGMev6EE27 zU*1O{$Bh0)bM3jji2ga?m2fyo`D($=xs0Iz-G<|R(8;ZpedqTZOn9&4<$!KCQ?c8d z+1$#*MnYK68Qc>ZreDkA{D#k*osI-?3HZu|4~Q5EuHqSIZ>JS?MRK?fP!hT$iK&>~uFqg5 zT*GWI4^H|*vMW`;(5e#V3$AFGH-GG7j4g)5bsh7MMg(WO(rjB={9fl|<3&2Ep_kot zow^6J+J%}2n`f4(+UgaxZSL~aGC+BAwwz3HGv!RHH2p2pbVf32CM$Oz zSBUJ|&V~ClE;?B=qR74{fxuE2m4S$I{s?Fl&O2Ez%qZ?7%k@W;;f)7?XRP($33=lK zL}qxdjrgQ871c0vATdOr*UPhSjb+8f>K0z`U322wOd?mD3!ttO_Ka!y_%Xf;b=pEu~;J| z1NtK%crkQyKru?hAG)qagC$j(1jotsT%{Ky8~CzA2)W%={tn7R&m*okhT^Y2qH->(&Zb1AX4kqugA&{aE$m;fpFkr_0{AARlP2 z^nC`){K+0cJE4eAAoG9qH9l^KjMe~PS7|%`kZ%>thxrfRMu`IN`SvDOMcCQRdWQN` zTlE>EjNcTAYq#t4XA#ZUOSj?rg!IN5)Vz zK}I|_Fa&58Ovgz9e3+IfJn={Qmv)VfOhtuaU3l%8QQuU^7@%id71*_n7sh3b=B3>V z_NT@$t42(emvGl8n4hT@2m`94@|!e5MDw{x3=)CwqK_(}wKGNkB)OB6$wD?g50bcS zLyKQVD)msLZbp@(WFf2D+SHo+?(^6gG<-Nf^VnhTk$Dqd7i--SJaqa zEec!nIq{1Ndo}8PQALP5Fz#d=D+@ew3BNWl=iX@xH(p8$b#H7T5f6XQ2YDZn2FXo} zK4VDCJuXlkYF`Yw+tOvk*=Vnn;H*?F<3sZmsB*GMz`7SxwS!; z?(PUwwa0)hCX`&xCEtcBjE$`?DKH;8$z5MqA07xF|8Zzurs_PB5g)CxG^4^Tvz_zx zU%PcrQ!wzMU#Z5wG*eR#RhnYMZfE0vweRza@hBo$czg-6-M?TX2JZ)OUS;|C7YqhJ zGriVsx>ugCjZu&Sj62G#*{)Uo^f?4p&YtTl z4*-^^nS$f%km%9oKi_};Dwy;nm2s}-1Hl})%`p^S&I0AjZP+3LQXgFZK`^$6jdV-{ zs>~Y#PY82U&z`&oqgkQAW*AjER&X!FN|G0PM1#gT9rqIfsx-u zD9OXCl+my%S)Br}a&oZ^c=9Jtwcx}u|LIdd-rhafN}aTvi&PX3bRk+e)&qgyz{|=~ zri|@$O}fp?C>QkJoo*DuV%GaVao^zHD;ilKgqXD5K1Rd9ASZz@06 zdW3mj46JWu8>#_gV0KUI@kT-Ug!7ymwNV2Q6GBzlO-N6?Bh3esn5()w19eUFEw)bW zkhPo7Eq;s7RBu}D-}=(Av8nVr3a}n(HM#CHkAoHovn~${=kn+vwQ7^gzSR1);anbt zRr~pCl?9fzTj}va=p)Ca6%Ll3JN4G36bmPUn`5^~S=cGwn--rmq z(?-=l2G~&FX=6oF52k%BmXUnD)LALU^mR_c&*F5g< zC5A34R2S7}PdGG-TkDup5+T`gQhnZpu}~WWUwPckyCl#|Yb1EM`DZLG0jXGUwe^+y zjO$_P+tMStNR=EMDoDK7c|z6HEAi-M_xs(G*ktLP^7A}h@vpgODku*&X0xW z+>Wi0gVp57>6V(oTIZaYi#z|%4dev|N9{4(I!HC9osp!%GG%Srk#-BsuikUQA|mW%E!2{3=Q#*D zlt|u~%}l~nqq&o;Mv#h*N7XIJ7#+nQU+keIcpI?jo>QD`P~$f;UYX&lmmL&0na`F| zl?(QwOPFN^V_;K6`b@c!o!nR|eRFQ1142Uk{7s$piIQZs3|(cd>^?Z3I?cN~L~?zE z;eghPGrdIW;2;F%q1V(R`70>WWpiZ1qJ-bG6t7|(nx+}BHZWtfcYBDC1t+89 zSe+vvn7|nonhQTyee@ zP|;)N%No^RYT~-lTSCK?fr)R1+aDb?Q`sYdJ3Zkp6QXEWXRMrFdLz7rJ;~xdStqb+ zf{2&XQCD>B)`ivRDEzKbx5ZR~@JB7ZTr8VdFE+-d0>6}}A|={)dVE>MEPgusWqfEY z^g0N2^|b1+Q!~3zV+ss#J9w#_htF*GKA|rh3{K@>zAwng9I;*#njrEgy zvs_A^1S93lq_*a%`EJTsgL2G=wGxrqqbY=n8FpNWM zr})eXiWUPYxj-RPYqoZDJm=_a>fDLla!Ggj_vA%8n*r)$18>3o_loHi*fbHN?Bh`A zAJ4|r)!x`Pm0*{CGw1c|@~}rN z#McGye@$90nUZ>MG(EOpR`9{j;>}bD1ZIW-F29_>DW0}^U1d|#aE+B>O^bg--wIxLzf2$!UK<&>EIe zwW|nJ9ympZU&LkOnX{uPgmS^3y}k9=dB+#uk#AVfJhd)>MN($3dg1TG^N_R~r;lrI z9|xET{XlOo^ngvK37K5$HArRX?zk&n2jhD2bouc8rnXZK6@!*JIw+1(KTX-%75?zK zvf+IHQQ5j|J9!w(adjCHHuhWGX&CNgseV+LW5(Zsc}X}OUnPwOS@)&)`49pcm2Ii>jSo%BgMSJ zqfi#^n1N1zK*b+{o>)t3)mRHEqT?~e4_v%CDm4uJN_c`bMSa%P;dto#bAH zT@YYl?9iu?h(cQWMnn=0tDxZLzWE^rBJyi2AHSx55&7>=i8Ds{oe6#Rl<+a45FDnn z2>5C80H_Kzv@RB#KkXY9oD!5BZQ(x%+xoxbHWTCWF5!GZ08`^j;ZrWS zZZF6uoi=mX1s+xnY`shKt|#QxM22fe9PaF&P1mxf9_nl5Knsrm-WD$R4gn6b`tcB4 z{KmXA?nTOL#bMG;5f#;gaCD;4{c6uQ&Y_3X!CoitkkfgZ2cpI1%ZzWu2zn~?rtq@Q zH#$Sa{dnb*xk~d)x>qu7^z*=^kLt^^e&#w+Ky0T!ptUf*G+p7@n#*ZQFyo)7N>>>0 z>M3U*bz~4BO$si=qX5j2k~IRNp}U7kyvsy1qMf0!-+>36%I&ps43myaXhZ}6^ae+J zSD_ncFb$qqSDHNs`W^Adct*{BxhApczL%doPIkzT{%*aO-)P!&G;>c&c|yeImn)xa zj4h@CK-WTb&mc5hW>JEXD$9PGqH)Ldfgv;(m;+XviN|862S>bk?{X$rPWD+9_2r6j zaa~f2#P;2-Y_HvLB@-}CDRkO%!z3b-jb(`Y4vlA-W_EZ@1CwZUh~~Ck*Oi;B?bpG< z$G6~T(JFibIQ`?pVbtsQjI$&%&JL8dq9;F}(2yDOfcX1F@>wvMAqu?o`^-z5dha;# zXqCxNK?g4J$9sXqfdCv!K;fWZ_;8pJ&T<@I+=VEItCZfYx~oj=gXD`OeLoArO~Qc3 zl)(NC&N~|sbF2NbXGs|(9u99Hl+3w|AAH+wMuD`S;6l1`s0Bm9X>w2$0EcnT1vqPM zoLIzCw0~*kjqLKji>e$84cx)4!HH|Iet0&1FgjnG@8HswcCBF2j7}#eyzJb4{UK~( zufd3YxwkA43+ndku$+m>9jWdw>*^zBo#p6rVKCieS$<{qXT*k*?#u#Ph&hzmm7pzH zLC;6Ze-TGz}QigD2<3mXX7ys+BW2oJ*FAtA4W!d^mi&{yso7hXXrLw*I0bUc$rL zZJ7VK|9x01UwE`pHw~~Jc2A@~q)5l`Lf^;c;Q$-_ZL2U>5=@l7SnbahvYw8}s9X03 z>r$zF*s|qVYB{6#7S8c*@aml1XliDWUVayK?x^*Nn1x|)v60Uno%P5b9Dlck+-kn z2hLWYP|GO$k8ugHv2mvIQQ&KMHetf5H)lBvhgf@4`6Fk|$1HT*_NJ?3-9|Gg==kmgZvzjD}u;n)AZE9zqyr;Hv=XG1d`C3(6@>gq~z2B&c zwi>PJfm6g&CU2ReKFz*pZPwfW9E)BceAqfhdnN(!q_L(7zG=n3W!+*63~VIVJNIsEKvnvx-w6Wn)p z5O{uUd^3RW6_y~>a3q8>IE0H^`=>Y{gb&u8+Fzt9Pkrf;qwNCEOxjiI7Y>2MT6hK; zpjD*-$O{&k>b&bZ?`qv%*UA4_Qb2OK8Nj{_7pG0Wn{=1?u%M?pYyoQYd;>^(3`12V z&)VN<%VdlzW2UuVFs;8r!+r7h! z9hFN5{7(;ub)JcmEljZBrB~LxW!(Pl5O-|ExTL|mWX#`9X;-o-4}+{p%P%i5NniKl1|OHQi++vRbN>u2yw^ z?2Rpxy1Dd~)7AVVeQC6JHr8ffU$D#TxK@e!JSKq7<8(B-)_>5p-tZo@~_k{OmE$(zSjC5h1y$9+$MKy;dD zo7Qmq=8f={u;G`RkKfw7ilFdxkklukvo^Jbh9R9sQGaQcv2DJ&hS6XffZM>dsbq7@ z0t3)0Dgwt{)!Dv{n}J0SE>@-G)8vdI;Ly z#JxBfzw<5AIAUT$f=BXDDVTFZ%|GWtxJgH;YUfvRPl<@`(iIh=*>4npDFN4OjL3v8 zai+5b%k>3+O}@?!5sT^+ZyVA0EIBooy(EDxEm~|W2P2$2 z@Alf+W=G+;DZUoTkgFc(Oh1Ky1J*PA@ei+G;?D@W?KJn`xAXORJJdRa5yO~|9OOnq zc?X1WA=I6#3eDlJ1f+_y8&gqmU%Jnzo8PKxJGySV-MVLdh@l0%>)vQ4-b-BWZ9K@` zx1OV}KE6{nRac+U2|$$23+}6J>X@jsaXxS9C>)~TdNv$Zl@|hGa5Q~Vhl=fJhMMOj zm)&*M-W>`fvM3YCmfcxUq<0@R7|ty_X<+j41q!ijuW8lkuE6z%CgBTb&n08%^|Xqz z0`*W|8ePt=kf6(+P-?xKfy?0GdJy~483(L1PPpxwMC33HypV;exAK*?oz7skcBAtZ z9+hHT$`bZcfygIOAl!QeCjn`EaSH$nr2(MIr(EriPglwQ3UO^=vo@vzCS?H_lc7jn z?p=Tg*&7S3wKzufRB&Hf%9xY;(@yc+d>}=9I4>;`^v*9&PS;adjs3T+(oy7nE-+k1wS>$}wCDI7+MI9|Gl0@1UhU+xc?HTG z|L$?nw|@$)3l;KM!OSteVbW`4H0#S}rmw3DyNAx2b1c08bVe}vlH@-YU<5)UKiuGn zdYXH=8_qp+7N;yJTmt6|6osSAJOnaHz`Em)L$F5$hFZcM8)Wx}T5xqFqR*G%H_?D7 zX@2s=g6{_uultV&Olp zumaKGcCzmT;NRnTi~5$#kQZL8+DR49lF5x}x!Me|{UgE+!tZnfnixdzjet)~ykid$ z22l*Ly4V$HA0aM0zi$K|#bq9xuo{>NIJzMrP{4s4B(w7e2+MFF$8GKBlJY%}qbWgr zQ%wj5a=6GXF;Fbw?n=9wkDIB0&D%9*mOq>hiuo6O!|3O)B#`CdRFmHiADkg50%IZg z6Zro7pE;i#$rIc?pb$gE3;paz3a`K;AEV1ZLcoP9#K2-9`9B9cG-5P=KXZ6v>Iv18 zPkyWL@2lZeg`GdEvc-JG8z|hz>j9DgJcqGJQ9?s%rUIYpR+KQn8bHJbc`|TN++_c` zv*?6&P5$zVJ?LA+`j5BN;zOh`I5@tXhzybZ2aXdsACLYIw?Ja>vsRlB{EY)nO@H5p zJ%byaiu?ct7~`Md7sMQiV6RhSJeWfkfLrvzp8)kgms56kR<(MdoJG^5MML~=^B7zt zHMo5PSS$?vCpDsXqJ4sx1m7p@F|0_4aqypHHK?QUX}egebN6GWhxevvf5X84lja~w zhxs=Se!9NB6~qKuaC zXf`&i_&>zgF7SsNVfI6(T}%(Y1ySIXUhux!EB#1~orX-|D6znU52SzLE?e*?kR_Jf6DyAp$t|OOZb`SS8B&Z(To7! ze;m>CZ7vjS=Luq>>L>SBeLvX2|Kr|;nj`W<2mVR+*@*~P1Fe%VY?)7fb^mtF{~p5s zJ%s;z2>J{SWXUic#V z`%(M(J%eW+z}UAM>t37wOCI6>S7+2X_K|!Em#q_tH(E_yH*P8K_M4fZzoh?w+K%x< zH=ZE69mph6_YNkj&hG1Sk8eS{*(f`JWpKJXFAth989URCLq%nr87p9xq&gE>De%h1 z{Pjh_&kybei&H_S8uEa8D<+=|<6l5chbMiCS%I~e6!6##w|(>_2Pu&+Ayf4@De67? zd@+c!C1?;!&OxBg5EWHvA!p@(2=f&K(;2LeekLFDP`}}%ZOuJa$tmvB=g~2gkr>7> z*&HOE+}QKy8LvfbKm=A?0*z@WPutlBc?y`E!B7Eh;0QibVL}9`*@>l{OL{% zAGP0lds+h1BB!k}R4_#s$ANjW%pmK_7ZiHUa#mb=-2gOvW*HVhg#udeG7Htu11{ga zN6(=xrZpBykwgYw@fZ?D(>1_<>CPM0Z1qsD-Yu=J)oi=y!3@X_# z#=SSqW_`DtiT%&d-7YO=@wBVVad(Xn3jtSa>h^=D`_Y<-Z#<4M_?4|e*epXO6LUBb z4)v(Bo6inJ_sOoZP@E0W0oL?YCwUL9>|IB5?cJ|k@$dF;+V-N=dt9}uO|_5ZDsjU@uGd?tSvp~;yrVH5uVc|$lDuV zxo)urm?=nk^=blve-c1!X1bBo)3O=0s)m1jdb_#1R^lB|32Y@^ZH+cH$@frQK0`&# zkk!}=(P|_m750gN8>s<9wRQ>vx`YR%-oXR^9PCV}Be%YP^+f!1D8H zX`utG00lG@`3sgv^wtr7$8V2kwlESVs1O3Oek2mK%3|>QryJq#^*pP-Q$O!~2nEd% zYu>}8e}_W_m@A9m?q5E;g=#@(-q2ca91;@d)klX2_gi^GryQQzPwhXzy_xjPR1jBH z!nr?A50IMSNP@s87mm~+!UdvM z6e_f}r++p*xf~Lg#PJhzGDk+TNpj3I){FTh9q$BKpy;RA_b-tQm>MU0`boOD*E#Y> zK0=PrFH-jn!ehAz2iAEq#`3pSZl8;FZtkLZbKB^}8EdXg?=A1R)|cJt?a|0FT6Wic z{3iXDx$Fp?6yx?w>&+TNo!Jh4)7ggn+n|W*bn1)QRz1hO15Mx%1*bWGD<+}^bW8M@ zC^2D?AMk2vKFChg;@RHEfwbLvSBri2w)DNkv%Ws} z^}Do|CeO7+;^*ZuexMlFw4_8R!$JWrKV?7vh*16km3b#E8r18-l;qpXOZV}1`%rQP z#@WxI`{t<~!k%`#f=xZ-jL>L0=1Z@%rw4Cgp@(}y9wE2Uk&DN%Gzt}&<$ZK=LiQ_G zF9jXG0`P33WqVd$%P&2HvBOiP(Rts0Pw=vlqho-0c1ZlUiVL{Dl5g5oHL2NRIBl;B zrb5a#w1(|ZJP#O@L1*# z;BDZdK@kPpQw&V0MU1peBU&MjXD9xA`13}N&&d$rUmp@51e!5Zm>@s@5CZ?SXlw%3 z{B|I$%!&!bQe-KpmiSq;jOZ5UB)S8WgGDb

wm-rZ0u?Pb99mKbC@y6zo%_~Hk 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 hacks to make client-ready presentations | Avinash's Blog

+

Avinash's Blog

Quick hacks to make client-ready presentations

Premise

When I worked in healthcare consulting, I often spent a LOT of my time creating PowerPoint presentations (decks in consulting lingo - not even slide decks). However, it was rather repetitive. Thus, was born PowerPointSnap.

What is it?

I’ll write this down as pointers.

  1. It’s a VBA based PowerPoint add-on. Just a set of commands that work well with each other.
  2. It’s Windows only - it’s unlikely to work on MacOS.
  3. It’s installation-free and is not an executable, which makes it perfect for locked-down corporate environments, as long as you have the permission to download files.

How do I get it?

The project is available on this Github repo. The instructions to install it are available there, but here’s the down-low:

  1. Download the Snap.ppam file to your system.
  2. Enable the developer options.
  3. Go to the Developer tab, and click on PowerPoint Add-ins.
  4. Click on Add New. Choose the location of the file you just dowloaded. Click Close.
  5. To uninstall, repeat the process, and simply click on Remove this time.

What can I do with it?

Frankly, a LOT. The base concept of this tool is:

  1. “Set” a shape as the one you want to copy a property from.
  2. Select any property from the list to automatically apply it.

Here’s a non-exhaustive list of all the options available.

Apply properties of shapes directly

This is the part of the interface that can be used for shapes (which include charts and tables).

The UI for copying shape properties

To use, first select a shape object, click on “Set”. Then, choose the object you want to Snap its properties to (see how I got the inspiration for the name?). You should be able to copy all compatible properties - if something is not copy-able, the tool will show an error, and then let you exit.

Note that it’s probably not to apply a property of a shape to a table - if you want to make the entire table orange, there are probably better built-in ways to do it than to use Snap.

Beautify charts with Snappable properties

Charts are also supported, with dedicated features for it.

The UI for copying chart properties

What do these features do? You should be able to hover over the option and get a tooltip that shows what it’s capable of, but here’s another summary just in case:

  1. Sync Value/Date Axis: this will try to align the range, the ticks, the numeric values etc. of the “set” chart to the one you’ve selected. I couldn’t put in just $x$ and $y$ here because Microsoft internally doesn’t label them that way. Try either of these two options (you can undo!) and see what works best for your chart. This doesn’t work well yet for 3D charts.
  2. Sync Plot/Title/Legend: often, you want to centre a title, or make sure that multiple charts that show nearly identical things for different variables all look exactly the same from a client perspective. But that’s usually difficult if you’ve already configured the charts a little - which can be remedied with this option!
  3. Format Painter: this is simply a helper for the normal format painter to align the formats of the text that you’ve selected with the way it originally is in the “set” chart. The reason for this feature is simply to avoid going back to Home to click on the Format Painter option again.
  4. Reset Axes Scales: in case you messed up somewhere, you can use this to rever to PowerPoint defaults.

The next two options deserve their own section.

Customize the labels programmatically

Your immediate senior in a consulting environment would frown at your chart, and then exclaim, “I think that’s too many labels for the data points. Can you show them every two/three/four labels? I know this is manual work, but it’s a one time thing!”

It’s never a one time affair. But don’t worry, we have this nice feature to help us. If you click on the Customize Label option, you will get this (without the “Set” option):

The UI for customizing labels.

Never mind the rather unfriendly legend entries. They’re just here to demonstrate that you can do the following kinds of whacky abilities with your own chart!

Screenshots of the chart snapability

Of course, visuals will do it more justice. For example, look at this image:

There’s a lot wrong with this image. But primarily, the charts are of different sizes, the axes are different, the labels are too clustered, and the titles aren’t centered.

Here’s what you can do:

  1. Click on the left chart. Press “Set” in the toolbar for Snap.
  2. Click on the right chart, and then go through the following:
    1. In Shapes, click on Dim. This will align the shapes of the chart.
    2. Use the guides that you get while moving the chart to align the positions of the two charts now that their shapes are equal.
    3. You’ll notice that the chart area doesn’t still match, nor does the title.
    4. In Charts, click on Sync Plot Area and Sync Title Area, and watch the magic unfold.
    5. Now, click on the second chart, and click on “Set”. Let’s align the axes of the first chart to the second one.
    6. Click on the first chart, and then in Charts, click Sync Value Axis.
  3. Let’s bring that senior’s exclamation back into play - (s)he wants you to highlight only Profit labels, and that too every 2 iterations. To do this:
    1. Click on Customize Labels after clicking on either chart.
    2. You’ll get the screen shown in the previous section. Make sure to adjust the values such that it’s exactly like the screenshot there.
    3. Click on “Save and Run”. This will save the configuration you’ve selected, and run it on the chart you’ve selected.
    4. Click the other chart. Then, in Charts, click on Rerun Customization.

This is what your results should look like:

Everything almost consistent. Your senior rests their eyes, and secretly wonder how you managed to do it quickly… maybe they should change some requirements…

Of course, getting those calculations right is a whole different thing that will need some work.

Align table dimensions

Oftentimes, you have two tables that show similar values… you know the drill. Here’s what you can do in a scenario such as this:

Similar data, but vastly different tables.

This is what the Tables section of the tool looks like:

The UI for Tables

To align these tables together,

  1. Click on the left table. Press “Set” in the toolbar for Snap.
  2. Click on the right table.
  3. Click on Shapes, inside it, Dim. Now the shapes of the table are the same.
  4. In Tables, click on Sync Column Widths. Now the columns are also the same.
  5. If you try to align by rows, it fails because the number of rows are not the same in the two tables.

Here’s what you’ll end up with:

Similar data, and similar enough tables.

Pretty neat, eh?

#powerpoint +#ppt +#vba

© Avinash Mallya | Design via Bear Cub.
\ No newline at end of file diff --git a/public/blog/index.html b/public/blog/index.html new file mode 100644 index 0000000..28fd00b --- /dev/null +++ b/public/blog/index.html @@ -0,0 +1,21 @@ +blog | Avinash's Blog
+

Avinash's Blog

© Avinash Mallya | Design via Bear Cub.
\ No newline at end of file diff --git a/public/blog/index.xml b/public/blog/index.xml new file mode 100644 index 0000000..c4f27cf --- /dev/null +++ b/public/blog/index.xml @@ -0,0 +1,927 @@ +blog on Avinash's Bloghttps://avimallu.dev/blog/Recent content in blog on Avinash's BlogHugo -- gohugo.ioen-US© Avinash MallyaFri, 20 Oct 2023 00:00:00 +0000Quick hacks to make client-ready presentationshttps://avimallu.dev/blog/003_powerpointsnap/Fri, 20 Oct 2023 00:00:00 +0000https://avimallu.dev/blog/003_powerpointsnap/<h1 id="premise">Premise</h1> +<p>When I worked in healthcare consulting, I often spent a LOT of my time creating PowerPoint presentations (<em>decks</em> in consulting lingo - not even <em>slide decks</em>). However, it was rather repetitive. Thus, was born PowerPointSnap.</p> +<h1 id="what-is-it">What is it?</h1> +<p>I&rsquo;ll write this down as pointers.</p> +<ol> +<li>It&rsquo;s a VBA based PowerPoint add-on. Just a set of commands that work well with each other.</li> +<li>It&rsquo;s Windows only - it&rsquo;s unlikely to work on MacOS.</li> +<li>It&rsquo;s installation-free and is not an executable, which makes it perfect for locked-down corporate environments, as long as you have the permission to download files.</li> +</ol> +<h1 id="how-do-i-get-it">How do I get it?</h1> +<p>The project is available on this <a href="https://github.com/avimallu/PowerPointSnap">Github repo</a>. The instructions to install it are available there, but here&rsquo;s the down-low:</p>Premise +

When I worked in healthcare consulting, I often spent a LOT of my time creating PowerPoint presentations (decks in consulting lingo - not even slide decks). However, it was rather repetitive. Thus, was born PowerPointSnap.

+

What is it?

+

I’ll write this down as pointers.

+
    +
  1. It’s a VBA based PowerPoint add-on. Just a set of commands that work well with each other.
  2. +
  3. It’s Windows only - it’s unlikely to work on MacOS.
  4. +
  5. It’s installation-free and is not an executable, which makes it perfect for locked-down corporate environments, as long as you have the permission to download files.
  6. +
+

How do I get it?

+

The project is available on this Github repo. The instructions to install it are available there, but here’s the down-low:

+
    +
  1. Download the Snap.ppam file to your system.
  2. +
  3. Enable the developer options.
  4. +
  5. Go to the Developer tab, and click on PowerPoint Add-ins.
  6. +
  7. Click on Add New. Choose the location of the file you just dowloaded. Click Close.
  8. +
  9. To uninstall, repeat the process, and simply click on Remove this time.
  10. +
+

What can I do with it?

+

Frankly, a LOT. The base concept of this tool is:

+
    +
  1. “Set” a shape as the one you want to copy a property from.
  2. +
  3. Select any property from the list to automatically apply it.
  4. +
+

Here’s a non-exhaustive list of all the options available.

+

Apply properties of shapes directly

+

This is the part of the interface that can be used for shapes (which include charts and tables).

+

The UI for copying shape properties

+

To use, first select a shape object, click on “Set”. Then, choose the object you want to Snap its properties to (see how I got the inspiration for the name?). You should be able to copy all compatible properties - if something is not copy-able, the tool will show an error, and then let you exit.

+

Note that it’s probably not to apply a property of a shape to a table - if you want to make the entire table orange, there are probably better built-in ways to do it than to use Snap.

+

Beautify charts with Snappable properties

+

Charts are also supported, with dedicated features for it.

+

The UI for copying chart properties

+

What do these features do? You should be able to hover over the option and get a tooltip that shows what it’s capable of, but here’s another summary just in case:

+
    +
  1. Sync Value/Date Axis: this will try to align the range, the ticks, the numeric values etc. of the “set” chart to the one you’ve selected. I couldn’t put in just $x$ and $y$ here because Microsoft internally doesn’t label them that way. Try either of these two options (you can undo!) and see what works best for your chart. This doesn’t work well yet for 3D charts.
  2. +
  3. Sync Plot/Title/Legend: often, you want to centre a title, or make sure that multiple charts that show nearly identical things for different variables all look exactly the same from a client perspective. But that’s usually difficult if you’ve already configured the charts a little - which can be remedied with this option!
  4. +
  5. Format Painter: this is simply a helper for the normal format painter to align the formats of the text that you’ve selected with the way it originally is in the “set” chart. The reason for this feature is simply to avoid going back to Home to click on the Format Painter option again.
  6. +
  7. Reset Axes Scales: in case you messed up somewhere, you can use this to rever to PowerPoint defaults.
  8. +
+

The next two options deserve their own section.

+

Customize the labels programmatically

+

Your immediate senior in a consulting environment would frown at your chart, and then exclaim, “I think that’s too many labels for the data points. Can you show them every two/three/four labels? I know this is manual work, but it’s a one time thing!”

+

It’s never a one time affair. But don’t worry, we have this nice feature to help us. If you click on the Customize Label option, you will get this (without the “Set” option):

+

The UI for customizing labels.

+

Never mind the rather unfriendly legend entries. They’re just here to demonstrate that you can do the following kinds of whacky abilities with your own chart!

+

Screenshots of the chart snapability

+

Of course, visuals will do it more justice. For example, look at this image:

+

There’s a lot wrong with this image. But primarily, the charts are of different sizes, the axes are different, the labels are too clustered, and the titles aren’t centered.

+

Here’s what you can do:

+
    +
  1. Click on the left chart. Press “Set” in the toolbar for Snap.
  2. +
  3. Click on the right chart, and then go through the following: +
      +
    1. In Shapes, click on Dim. This will align the shapes of the chart.
    2. +
    3. Use the guides that you get while moving the chart to align the positions of the two charts now that their shapes are equal.
    4. +
    5. You’ll notice that the chart area doesn’t still match, nor does the title.
    6. +
    7. In Charts, click on Sync Plot Area and Sync Title Area, and watch the magic unfold.
    8. +
    9. Now, click on the second chart, and click on “Set”. Let’s align the axes of the first chart to the second one.
    10. +
    11. Click on the first chart, and then in Charts, click Sync Value Axis.
    12. +
    +
  4. +
  5. Let’s bring that senior’s exclamation back into play - (s)he wants you to highlight only Profit labels, and that too every 2 iterations. To do this: +
      +
    1. Click on Customize Labels after clicking on either chart.
    2. +
    3. You’ll get the screen shown in the previous section. Make sure to adjust the values such that it’s exactly like the screenshot there.
    4. +
    5. Click on “Save and Run”. This will save the configuration you’ve selected, and run it on the chart you’ve selected.
    6. +
    7. Click the other chart. Then, in Charts, click on Rerun Customization.
    8. +
    +
  6. +
+

This is what your results should look like:

+

Everything almost consistent. Your senior rests their eyes, and secretly wonder how you managed to do it quickly… maybe they should change some requirements…

+

Of course, getting those calculations right is a whole different thing that will need some work.

+

Align table dimensions

+

Oftentimes, you have two tables that show similar values… you know the drill. Here’s what you can do in a scenario such as this:

+

Similar data, but vastly different tables.

+

This is what the Tables section of the tool looks like:

+

The UI for Tables

+

To align these tables together,

+
    +
  1. Click on the left table. Press “Set” in the toolbar for Snap.
  2. +
  3. Click on the right table.
  4. +
  5. Click on Shapes, inside it, Dim. Now the shapes of the table are the same.
  6. +
  7. In Tables, click on Sync Column Widths. Now the columns are also the same.
  8. +
  9. If you try to align by rows, it fails because the number of rows are not the same in the two tables.
  10. +
+

Here’s what you’ll end up with:

+

Similar data, and similar enough tables.

+

Pretty neat, eh?

+]]>
Finding representative samples efficiently for large datasetshttps://avimallu.dev/blog/002_representative_samples/Thu, 19 Oct 2023 00:00:00 +0000https://avimallu.dev/blog/002_representative_samples/<h1 id="premise">Premise</h1> +<p>In this day and age, we&rsquo;re not short on data. <em>Good</em> data, on the other hand, is very valuable. When you&rsquo;ve got a large amount of improperly labelled data, it may become hard to find to find a representative dataset to train a model on such that it generalizes well.</p> +<p>Let&rsquo;s formalize the problem a little so that a proper approach can be developed. Here&rsquo;s the problem statement:</p> +<ol> +<li>You have a large-ish set of (imperfectly) labelled data points. These data points can be represented as a 2D matrix.</li> +<li>You need to train a model to classify these data points on either these labels, or on labels dervied from imperfect labels.</li> +<li>You need a good (but not perfect) representative sample for the model to be generalizable, but there are too many data points for each label to manually pick representative examples.</li> +</ol> +<h2 id="in-a-hurry">In a hurry?</h2> +<p>Here&rsquo;s what you need to do:</p>Premise +

In this day and age, we’re not short on data. Good data, on the other hand, is very valuable. When you’ve got a large amount of improperly labelled data, it may become hard to find to find a representative dataset to train a model on such that it generalizes well.

+

Let’s formalize the problem a little so that a proper approach can be developed. Here’s the problem statement:

+
    +
  1. You have a large-ish set of (imperfectly) labelled data points. These data points can be represented as a 2D matrix.
  2. +
  3. You need to train a model to classify these data points on either these labels, or on labels dervied from imperfect labels.
  4. +
  5. You need a good (but not perfect) representative sample for the model to be generalizable, but there are too many data points for each label to manually pick representative examples.
  6. +
+

In a hurry?

+

Here’s what you need to do:

+
    +
  1. Read the premise and see if it fits your problem.
  2. +
  3. Go to the For the folks in a hurry! section at the end to find the generic solution and how it works.
  4. +
+

Why do we need representative samples?

+

Generally, three things come to mind:

+
    +
  1. Allows the model to be generalizable for all kinds of data points within a category.
  2. +
  3. Allows for faster training of the model - you need fewer data points to get the same accuracy!
  4. +
  5. Allows maintaining the training set - if your training set needs validation by experts or annotations, this keeps your costs low!
  6. +
+

Define the data

+

This data can be practically anything that can be represented as a 2D matrix.

+

There are exceptions. Raw image data (as numbers) might get difficult because even if you flatten them, they’ll be significant correlation between features. For example, a face can appear practically anywhere in the image, and all pixels centered around the face will be highly correlated, even if they are on different lines. A workaround in this case would be to pipe the image through a CNN model that has been trained on some generic task and produces a 1D representation of a single image in the final hidden layer before the output. Other data will need further processing along similar lines.

+

Get a specific dataset

+

For this specific article, I will use the ShopMania dataset on Kaggle. I apologize in advance for not using a more easily accessible dataset (you need to sign into Kaggle to download it) - and I’m not 100% sure if the GPL allows me to create a copy of the data and place it in my own repository. Nevertheless, the data (if you download it and choose to use it instead of some other dataset) will look like this:

+
+

NOTE: whenever I want to show an output along with the code I used for it, you’ll see the characters >> indicating the command used, and the output to be without those prefixes.

+
+ + + + + +
 1>> import polars as pl
+ 2>> data = pl.read_csv("archive/shopmania.csv")
+ 3>> data
+ 4shape: (313_705, 4)
+ 5┌────────────┬──────────────────────────────────────────────────────┬─────────────┬────────────────┐
+ 6 product_ID  product_title                                         category_ID  category_label 
+ 7 ---         ---                                                   ---          ---            
+ 8 i64         str                                                   i64          str            
+ 9╞════════════╪══════════════════════════════════════════════════════╪═════════════╪════════════════╡
+10 2           twilight central park print                           2            Collectibles   
+11 3           fox print                                             2            Collectibles   
+12 4           circulo de papel wall art                             2            Collectibles   
+13 5           hidden path print                                     2            Collectibles   
+14                                                                                           
+15 313703      deago anti fog swimming diving full face mask         229          Water Sports   
+16             surface snorkel scuba fr gopro black s/m                                          
+17 313704      etc buys full face gopro compatible snorkel scuba     229          Water Sports   
+18             diving mask blue large/xtralarge blue                                             
+19 313705      men 039 s full face breathe free diving snorkel mask  229          Water Sports   
+20             scuba optional hd camera blue mask only adult men                                 
+21 313706      women 039 s full face breathe free diving snorkel     229          Water Sports   
+22             mask scuba optional hd camera black mask only                                     
+23             children and women                                                                
+24└────────────┴──────────────────────────────────────────────────────┴─────────────┴────────────────┘

The data documentation on Kaggle states:

+
+

The first dataset originates from ShopMania, a popular online product comparison platform. It enlists tens of millions of products organized in a three-level hierarchy that includes 230 categories. The two higher levels of the hierarchy include 39 categories, whereas the third lower level accommodates the rest 191 leaf categories. Each product is categorized into this tree structure by being mapped to only one leaf category. Some of these 191 leaf categories contain millions of products. However, shopmania.com allows only the first 10,000 products to be retrieved from each category. Under this restriction, our crawler managed to collect 313,706 products.

+
+

For demonstration, I’ll just limit the categories to those that have exactly 10,000 occurences.

+ + + + + +
1data = (
+2    data
+3    .filter(pl.count().over("category_ID") == 10000)
+4)

You’ll notice that there are only 17 categories in this dataset. Run this to verify that fact.

+ + + + + +
 1>>> data.get_column("category_label").unique()
+ 2shape: (17,)
+ 3Series: 'category_label' [str]
+ 4[
+ 5    "Kitchen & Dining"
+ 6    "Scarves and wraps"
+ 7    "Handbags & Wallets"
+ 8    "Rugs  Tapestry & Linens"
+ 9    "Cell Phones Accessories"
+10    "Men's Clothing"
+11    "Jewelry"
+12    "Belts"
+13    "Men Lingerie"
+14    "Crafts"
+15    "Football"
+16    "Medical Supplies"
+17    "Adult"
+18    "Hunting"
+19    "Women's Clothing"
+20    "Pet Supply"
+21    "Office Supplies"
+22]

Note that this is very easy in Polars, which is the package I typically use for data manipulation. I recommend using it over Pandas.

+

Specify the task

+

Okay - so now we have exactly 10,000 products per category. We only have the title of the product that can be leveraged for categorization. So let me define the task this way:

+
+

Craft a small representative sample for each category.

+
+

Why small? It helps that it’ll make the model faster to train - and keep the training data manageable in size.

+

Finding representative samples

+

I mentioned earlier that we need to represent data as a 2D matrix for the technique I have in mind to work. How can I translate a list of text to a matrix? The answer’s rather simple: use SentenceTransformers to get a string’s embedding. You could also use more classic techniques like computing TF-IDF values, or use more advanced transformers, but I’ve noticed that SentenceTransformers are able to capture semantic meaning of sentences rather well (assuming you use a good model suited for the language the data is in) - they are trained on sentence similarity after all.

+

Getting SentenceTransformer embeddings

+

This part is rather simple. If you’re unable to install SentenceTransformers, please check their website.

+ + + + + +
1import sentence_transformers
+2# See list of models at www.sbert.net/docs/pretrained_models.html
+3ST = sentence_transformers.SentenceTransformer("all-mpnet-base-v2")
+4title_embeddings = (
+5    ST.encode(
+6        data.get_column("product_title").to_list(),
+7        show_progress_bar=True, convert_to_tensor=True)
+8    .numpy())

This process will be slow (~30 minutes) if you don’t have a GPU. There are faster approaches, but they are slightly more involved than would be beneficial for a blog post. The wait will be worth it, I promise! In addition, the call to .numpy() at the end is to directly get a single numpy array - otherwise you get a list of numpy arrays, which is rather inefficient. Further, SentenceTransformers will try to run on the GPU if available, and if so, you will need to write .cpu().numpy() so that the tensor is copied from the GPU to the CPU.

+
+

NOTE: for a proof-of-concept implementation, or if you’re on the CPU, try the all-MiniLM-L6-v2 model. It’s a much smaller and much faster model, although you sacrifice a little in terms of accuracy.

+
+

The concept of approximate nearest neighbors

+

Performing any kind of nearest neighbor algorithm on medium scale datasets (even bordering 10,000 rows and tens of columns) tends to be slow. A primary driver of this was the need to calculate all, or nearly all distances between all data points. Approximate nearest neighbor (ANN) algorithms work around this through various approaches, which warrant their own blog post. For now, it would suffice to understand that there are shortcuts that ANN algorithms take to give you if not the exact nearest neighbor, at least one of the nearest neighbors (hence the term approximate).

+

There are several algorithms that you can use - I shall proceed with faiss, because it has a nice Python interface and is rather easy to work with. You can use any algorithm - a full list of the major ones are available here.

+

I’ll explain why we’re in the nearest neighbor territory in due course.

+

Building the database

+

To build the database, all we need is the title_embeddings matrix.

+ + + + + +
1import faiss
+2def create_index(title_embeddings):
+3    d = title_embeddings.shape[1]    # Number of dimensions
+4    ann_index = faiss.IndexFlatL2(d) # Index using Eucledian Matrix
+5    ann_index.add(title_embeddings)  # Build the index
+6    
+7    return ann_index # Faiss considers databases an "index"

This does create a database. But remember, we’re trying to find representative samples - which means we need to do this by the category (or label). So let’s design a function that sends only the necessary data as that for a particular category, and then create the database. We’ll need three pieces of information from this function:

+
    +
  1. The actual faiss database.
  2. +
  3. The actual subset of data that was used to build this index.
  4. +
  5. The label indices with respect to the original data that went into the faiss database.
  6. +
+

(2) and (3) will help us later in rebuilding a “network graph” that will allow us to reference the original data points.

+ + + + + +
 1import faiss
+ 2import numpy as np
+ 3import polars as pl
+ 4
+ 5def create_index(label):
+ 6    faiss_indices = (
+ 7        data # this needs to be an argument if you want to create a generic function
+ 8        .with_row_count("row_idx")
+ 9        .filter(pl.col("category_label") == label)
+10        .get_column("row_idx")
+11        .to_list()
+12    )
+13    
+14    faiss_data = title_embeddings[faiss_indices]
+15    d = data.shape[1]               # Number of dimensions
+16    faiss_DB = faiss.IndexFlatIP(d) # Index using Inner Product
+17    faiss.normalize_L2(data)        # Normalized L2 with Inner Product search = cosine similarity
+18    # Why cosine similarity? It's easier to specify thresholds - they'll always be between 0 and 1.4.
+19    # If using Eucledian or other distance, we'll have to spend some time finding a good range
+20    # where distances are reasonable. See https://stats.stackexchange.com/a/146279 for details.
+21    faiss_DB.add(data)              # Build the index
+22    
+23    return faiss_DB, faiss_data, faiss_indices

Identifying the nearest neighbors

+

To proceed with getting a representative sample, the next step is to find the nearest neighbors for all data points in the database. This isn’t too hard - faiss index objects have a built-in search method to find the k nearest neighbors for a given index, along with the (approximate) distance to it. Let’s then write a function to get the following information: the label index for whom nearest neighbors are being searched, the indices of said nearest neighbors and the distance between them. In network graph parlance, this kind of data is called an edge list i.e. a list of pair of nodes that are connected, along with any additional information that specifies a property (in this case distance) of the edge that connects these nodes.

+ + + + + +
 1def get_edge_list(label, k=5):
+ 2    faiss_DB, faiss_data, faiss_indices = create_index(label)
+ 3    # To map the data back to the original `train[b'data']` array
+ 4    faiss_indices_map = {i: x for i,x in enumerate(faiss_indices)}
+ 5    # To map the indices back to the original strings
+ 6    title_name_map = {i: x for i,x in data.select("row_idx", "product_title").rows()}
+ 7    distances, neighbors = faiss_DB.search(faiss_data, k)
+ 8    
+ 9    return (
+10        pl.DataFrame({
+11            "from": faiss_indices})
+12        .with_columns(
+13            pl.Series("to", neighbors),
+14            pl.Series("distance", distances))
+15        .explode("to", "distance")
+16        .with_columns(
+17            pl.col("from")
+18            .map_dict(title_name_map),
+19            pl.col("to")
+20            .map_dict(faiss_indices_map)
+21            .map_dict(title_name_map))
+22        .filter(pl.col("from") != pl.col("to"))
+23    )                   

NetworkX and Connected Components

+

The next step in the process is to create a network graph using the edge-list. But why?

+

Remember that we have identified the (k=5) nearest neighbors of each data point. Let’s say that we have a point A that has a nearest neighbor B. C is not a nearest neighbor of A, but it is a nearest neighbor of B. In a network graph, if A and C are sufficiently similar enough to B within a particular minimum thershold, then A will be connected to C through B! Hopefully a small visual below would help.

+

How a network component is formed.

+

What happens when such a concept is extended for many data points? Not all of them would be connected - because we’re applying a minimum threshold that they have to meet. This is the only hueristic part of the rather fast process. Here’s one more helpful visual:

+

How a network cluster is formed.

+

Very starry night-eque vibes here. Let’s get to the code.

+ + + + + +
1import networkx as nx
+2def get_cluster_map(label, k=5, min_cosine_distance=0.95):
+3    edge_list = (
+4        get_edge_list(label, k=k)
+5        .filter(pl.col("distance") >= min_cosine_distance)
+6    )
+7    graph = nx.from_pandas_edgelist(edge_list.to_pandas(), source="from", target="to")
+8    return {i: list(x) for i,x in enumerate(nx.connected_components(graph))}

Getting clusters

+

Now that all the parts of the puzzle are together, let’s run it to see what kind of clusters you get for Cell Phone Accessories.

+ + + + + +
1clusters = get_cluster_map("Cell Phones Accessories", 5, 0.95)

Make sure to configure the following if your results aren’t good enough:

+
    +
  1. Relax the min_cosine_distance value if you want bigger clusters.
  2. +
  3. Increase the number of nearest neighbors if you want more matches.
  4. +
+

Viewing the components

+

There will likely be many clusters (you can see how many exactly with len(clusters)). Let’s look at a random cluster:

+ + + + + +
1>> clusters[3]
+2['smartphone lanyard with card slot for any phone up to 6 yellow 72570099',
+3 'smartphone lanyard with card slot for any phone up to 6 black 72570093',
+4 'smartphone lanyard with card slot for any phone up to 6 lightblue 72570097',
+5 'smartphone lanyard with card slot for any phone up to 6 blue 72570095',
+6 'smartphone lanyard with card slot for any phone up to 6 green 72570101',
+7 'smartphone lanyard with card slot for any phone up to 6 pink 72570091']

Let’s see another cluster that had 172(!) members in my run (the clusters themselves will be stable, but their indices may change in each run owing to some inherent randomness in the process).

+ + + + + +
 1>>> clusters[6]
+ 2['otm essentials iphone 8/7 modern clear printed phone case snowflakes iphone 8/7 op qq z051a',
+ 3 'otm essentials iphone 8/7 modern clear printed phone case iphone 8/7 arrows blue op qq a02 58',
+ 4 'otm essentials iphone 8/7/6s clear printed phone case single iphone 8/7/6s golden pineapple op qq z089a',
+ 5 'otm essentials iphone 8/7/6s clear printed phone case single iphone 8/7/6s butteryfly delight yellow op qq z029d',
+ 6 'otm essentials iphone 8/7 modern clear printed phone case iphone 8/7 luck of the irish op qq a01 45',
+ 7 'otm essentials iphone 8/7 modern clear printed phone case iphone 8/7 brides maid white op qq a02 16',
+ 8 ...
+ 9 'otm essentials iphone 8/7 modern clear printed phone case iphone 8/7 flying arrows white op qq hip 20',
+10 'otm essentials iphone 8/7 modern clear printed phone case iphone 8/7 brides maid pink white op qq a02 17',
+11 'otm essentials iphone 8/7 modern clear printed phone case iphone 8/7 anemone flowers white op qq z036a',
+12 'otm essentials iphone 8/7 modern clear printed phone case mustache iphone 8/7 op qq hip 08',
+13 'otm essentials iphone 8/7 modern clear printed phone case oh snap iphone 8/7 op qq z053a',
+14 'otm essentials iphone 8/7/6s clear printed phone case single iphone 8/7/6s desert cacti orange pink op qq a02 22']

Running for all categories

+

This isn’t that hard (although it may take more than a moment). Just iterate it for each category!

+ + + + + +
1clusters = [get_cluster_map(x, 5, 0.95) for x in data.get_column("category_label").unique()]

For the folks in a hurry!

+

I get it - you often want a solution that “just works”. I can come close to it. See below for code and a succinct explanation. For those of my readers who aren’t in a hurry, this also serves as a nice summary (and copy-pastable code)!

+

The code

+ + + + + +
 1import sentence_transformers
+ 2import faiss
+ 3import polars as pl
+ 4import numpy as np
+ 5
+ 6# Data is read here. You download the files from Kaggle here: 
+ 7# https://www.kaggle.com/datasets/lakritidis/product-classification-and-categorization
+ 8data = pl.read_csv("archive/shopmania.csv", new_columns=[
+ 9    "product_ID", "product_title", "category_ID", "category_label"])
+10data = (
+11    data
+12    .filter(pl.count().over("category_ID") == 10000)
+13    .with_row_count("row_idx")
+14)
+15
+16
+17# See list of models at www.sbert.net/docs/pretrained_models.html
+18ST = sentence_transformers.SentenceTransformer("all-mpnet-base-v2")
+19title_embeddings = (
+20    ST.encode(
+21        data.get_column("product_title").to_list(),
+22        # I'm on a MacBook, you should use `cuda` or `cpu`
+23        # if you've got different hardware.
+24        device="mps",
+25        show_progress_bar=True, convert_to_tensor=True)
+26    .cpu().numpy())
+27
+28# Code to create a FAISS index
+29def create_index(label):
+30    faiss_indices = (
+31        data # this needs to be an argument if you want to create a generic function
+32        .filter(pl.col("category_label") == label)
+33        .get_column("row_idx")
+34        .to_list()
+35    )
+36    
+37    faiss_data = title_embeddings[faiss_indices]
+38    d = faiss_data.shape[1]         # Number of dimensions
+39    faiss_DB = faiss.IndexFlatIP(d) # Index using Inner Product
+40    faiss.normalize_L2(faiss_data)  # Normalized L2 with Inner Product search = cosine similarity
+41    faiss_DB.add(faiss_data)        # Build the index
+42    
+43    return faiss_DB, faiss_data, faiss_indices
+44
+45# Code to create an edge-list
+46def get_edge_list(label, k=5):
+47    faiss_DB, faiss_data, faiss_indices = create_index(label)
+48    # To map the data back to the original `train[b'data']` array
+49    faiss_indices_map = {i: x for i,x in enumerate(faiss_indices)}
+50    # To map the indices back to the original strings
+51    title_name_map = {i: x for i,x in data.select("row_idx", "product_title").rows()}
+52    distances, neighbors = faiss_DB.search(faiss_data, k)
+53    
+54    return (
+55        pl.DataFrame({
+56            "from": faiss_indices})
+57        .with_columns(
+58            pl.Series("to", neighbors),
+59            pl.Series("distance", distances))
+60        .explode("to", "distance")
+61        .with_columns(
+62            pl.col("from")
+63            .map_dict(title_name_map),
+64            pl.col("to")
+65            .map_dict(faiss_indices_map)
+66            .map_dict(title_name_map))
+67        .filter(pl.col("from") != pl.col("to"))
+68    )
+69
+70# Code to extract components from a Network Graph
+71import networkx as nx
+72def get_cluster_map(label, k=5, min_cosine_distance=0.95):
+73    edge_list = (
+74        get_edge_list(label, k=k)
+75        .filter(pl.col("distance") >= min_cosine_distance)
+76    )
+77    graph = nx.from_pandas_edgelist(edge_list.to_pandas(), source="from", target="to")
+78    return {i: list(x) for i,x in enumerate(nx.connected_components(graph))}
+79
+80# Example call to a single category to obtain its clusters
+81clusters = get_cluster_map("Cell Phones Accessories", 5, 0.95)
+82# Example call to **all** categories to obtain all clusters
+83clusters = [get_cluster_map(x, 5, 0.95) for x in data.get_column("category_label").unique()]

How the code works

+

If you want to write down an algorithmic way of looking at this approach,

+
    +
  1. Obtain a 2D representation of the labelled/categorized data. This can be embeddings for strings, the final hidden state output from a generic CNN model for images, or a good ol’ tabular dataset where all numbers are normalized and can be expressed as such.
  2. +
  3. Create an ANN database (based on a package such as faiss) that allows you fast nearest neighbor searches. Use cosine similarity for an easy threshold determination step.
  4. +
  5. Obtain an edge-list of k (from 5 to 100) nearest neighbors for all (or a sample of data points in case your dataset is incredibly HUGE) data points in the ANN database.
  6. +
  7. Apply a minimum threshold on similarity (completely based on heuristics), and obtain the connected components of the network graph from the filtered edge-list you just created.
  8. +
  9. Map all indices back to their source data-points that make sense, and pick any number of items from each cluster (usually, I end up picking one element from each cluster), and you now have your representative sample!
  10. +
+]]>
Overlap Joins: Number of docker trucks in an intervalhttps://avimallu.dev/blog/001_overlap_joins/Thu, 22 Jun 2023 00:00:00 +0000https://avimallu.dev/blog/001_overlap_joins/<h1 id="premise">Premise</h1> +<p>I stumbled upon an interesting <a href="https://stackoverflow.com/questions/76488314/polars-count-unique-values-over-a-time-period">Stackoverflow question</a> that was linked <a href="https://github.com/pola-rs/polars/issues/9467">via an issue</a> on Polars github repo. The OP asked for a pure Polars solution. At the time of answering the question Polars did not have support for non-equi joins, and any solution using it would be pretty cumbersome.</p> +<p>I&rsquo;m more of a right-tool-for-the-job person, so I tried to find a better solution.</p> +<h1 id="problem-statement">Problem Statement</h1> +<p>Suppose we have a dataset that captures the arrival and departure times of trucks at a station, along with the truck&rsquo;s ID.</p>Premise +

I stumbled upon an interesting Stackoverflow question that was linked via an issue on Polars github repo. The OP asked for a pure Polars solution. At the time of answering the question Polars did not have support for non-equi joins, and any solution using it would be pretty cumbersome.

+

I’m more of a right-tool-for-the-job person, so I tried to find a better solution.

+

Problem Statement

+

Suppose we have a dataset that captures the arrival and departure times of trucks at a station, along with the truck’s ID.

+ + + + + +
 1import polars as pl # if you don't have polars, run 
+ 2                    # pip install 'polars[all]'
+ 3data = pl.from_repr("""
+ 4┌─────────────────────┬─────────────────────┬─────┐
+ 5│ arrival_time        ┆ departure_time      ┆ ID  │
+ 6│ ---                 ┆ ---                 ┆ --- │
+ 7│ datetime[μs]        ┆ datetime[μs]        ┆ str │
+ 8╞═════════════════════╪═════════════════════╪═════╡
+ 9│ 2023-01-01 06:23:47 ┆ 2023-01-01 06:25:08 ┆ A1  │
+10│ 2023-01-01 06:26:42 ┆ 2023-01-01 06:28:02 ┆ A1  │
+11│ 2023-01-01 06:30:20 ┆ 2023-01-01 06:35:01 ┆ A5  │
+12│ 2023-01-01 06:32:06 ┆ 2023-01-01 06:33:48 ┆ A6  │
+13│ 2023-01-01 06:33:09 ┆ 2023-01-01 06:36:01 ┆ B3  │
+14│ 2023-01-01 06:34:08 ┆ 2023-01-01 06:39:49 ┆ C3  │
+15│ 2023-01-01 06:36:40 ┆ 2023-01-01 06:38:34 ┆ A6  │
+16│ 2023-01-01 06:37:43 ┆ 2023-01-01 06:40:48 ┆ A5  │
+17│ 2023-01-01 06:39:48 ┆ 2023-01-01 06:46:10 ┆ A6  │
+18└─────────────────────┴─────────────────────┴─────┘
+19""")

We want to identify the number of trucks docked at any given time within a threshold of 1 minute prior to the arrival time of a truck, and 1 minute after the departure of a truck. Equivalently, this means that we need to calculate the number of trucks within a specific window for each row of the data.

+

Finding a solution to the problem

+

Evaluate for a specific row

+

Before we find a general solution to this problem, let’s consider a specific row to understand the problem better:

+ + + + + +
1"""
+2┌─────────────────────┬─────────────────────┬─────┐
+3│ arrival_time        ┆ departure_time      ┆ ID  │
+4│ ---                 ┆ ---                 ┆ --- │
+5│ datetime[μs]        ┆ datetime[μs]        ┆ str │
+6╞═════════════════════╪═════════════════════╪═════╡
+7│ 2023-01-01 06:32:06 ┆ 2023-01-01 06:33:48 ┆ A6  │
+8└─────────────────────┴─────────────────────┴─────┘
+9"""

For this row, we need to find the number of trucks that are there between 2023-01-01 06:31:06 (1 minute prior to the arrival_time and 2023-01-01 06:34:48 (1 minute post the departure_time). Manually going through the original dataset, we see that B3, C3, A6 and A5 are the truck IDs that qualify - they all are at the station in a duration that is between 2023-01-01 06:31:06 and 2023-01-01 06:34:48.

+

Visually deriving an algorithm

+

There are many cases that will qualify a truck to be present in the overlap window defined by a particular row. Specifically for the example above, we have (this visualization is generalizable, because for each row we can calculate without much difficulty the overlap window relative to the arrival and departure times):

+

The five different ways a period can overlap.

+

Take some time to absorb these cases - it’s important for the part where we write the code for the solution. Note that we need to actually tell our algorithm to filter only for Cases 2, 3 and 4, since Cases 1 and 5 will not satisfy our requirements.

+

Writing an SQL query based on the algorithm

+

In theory, we can use any language that has the capability to define rules that meet our algorithmic requirements outlined in the above section to find the solution. Why choose SQL? It’s often able to convey elegantly the logic that was used to execute the algorithm; and while it does come with excessive verbosity at times, it doesn’t quite in this case.

+

Note here that we run SQL in Python with almost no setup or boilerplate code - so this is a Python based solution as well (although not quite Pythonic!).

+

Introducing the DuckDB package

+

Once again, in theory, any SQL package or language can be used. Far too few however meet the ease-of-use that DuckDB provides:

+
    +
  1. no expensive set-up time (meaning no need for setting up databases, even temporary ones),
  2. +
  3. no dependencies (other than DuckDB itself, just pip install duckdb),
  4. +
  5. some very friendly SQL extensions, and
  6. +
  7. ability to work directly on Polars and Pandas DataFrames without conversions
  8. +
+

all with mind-blowing speed that stands shoulder-to-shoulder with Polars. We’ll also use a few advanced SQL concepts noted below.

+

Self-joins

+

This should be a familiar, albeit not often used concept - a join of a table with itself is a self join. There are few cases where such an operation would make sense, and this happens to be one of them.

+

A bullet train recap of non-equi joins

+

A key concept that we’ll use is the idea of joining on a range of values rather than a specific value. That is, instead of the usual LEFT JOIN ON A.column = B.column, we can do LEFT JOIN ON A.column <= B.column for one row in table A to match to multiple rows in B. DuckDB has a blog post that outlines this join in detail, including fast implementation.

+

The concept of LIST columns

+

DuckDB has first class support for LIST columns - that is, each row in a LIST column can have a varying length (much like a Python list), but must have the exact same datatype (like R’s vector). Using list columns allow us to eschew the use of an additional GROUP BY operation on top of a WHERE filter or SELECT DISTINCT operation, since we can directly perform those on the LIST column itself.

+

Date algebra

+

Dates can be rather difficult to handle well in most tools and languages, with several packages purpose built to make handling them easier - lubridate from the tidyverse is a stellar example. Thankfully, DuckDB provides a similar swiss-knife set of tools to deal with it, including specifying INTERVALs (a special data type that represent a period of time independent of specific time values) to modify TIMESTAMP values using addition or subtraction.

+

Tell me the query, PLEASE!

+

Okay - had a lot of background. Let’s have at it! The query by itself in SQL is (see immediately below for runnable code in Python):

+ + + + + +
 1SELECT
+ 2     A.arrival_time
+ 3    ,A.departure_time
+ 4    ,A.window_open
+ 5    ,A.window_close
+ 6    ,LIST_DISTINCT(LIST(B.ID)) AS docked_trucks
+ 7    ,LIST_UNIQUE(LIST(B.ID))   AS docked_truck_count
+ 8
+ 9FROM (
+10    SELECT *
+11        ,arrival_time   - (INTERVAL 1 MINUTE) AS window_open
+12        ,departure_time + (INTERVAL 1 MINUTE) AS window_close
+13    FROM data) A
+14
+15LEFT JOIN (
+16    SELECT *
+17        ,DATEDIFF('seconds', arrival_time, departure_time) AS duration
+18    FROM data) B
+19
+20ON ((B.arrival_time <= A.window_open AND 
+21    	(B.arrival_time   + TO_SECONDS(B.duration)) >=  A.window_open) OR
+22    (B.arrival_time >= A.window_open AND 
+23                                  B.departure_time  <= A.window_close) OR
+24    (B.arrival_time >= A.window_open AND
+25    	(B.departure_time - TO_SECONDS(B.duration)) <= A.window_close))
+26GROUP BY 1, 2, 3, 4

A small, succinct query such as this will need a bit of explanation to take it all in. Here’s one below, reproducible in Python (make sure to install duckdb first!). Expand it to view.

+
SQL with explanation. + + + + + +
 1import duckdb as db
+ 2db.query("""
+ 3    SELECT
+ 4        A.arrival_time
+ 5        ,A.departure_time
+ 6        ,A.window_open
+ 7        ,A.window_close
+ 8        -- LIST aggregates the values into a LIST column
+ 9        -- and LIST_DISTINCT finds the unique values in it
+10        ,LIST_DISTINCT(LIST(B.ID)) AS docked_trucks
+11        -- finally, LIST_UNIQUE calculates the unique number of values in it
+12        ,LIST_UNIQUE(LIST(B.ID))   AS docked_truck_count
+13
+14    FROM (
+15        SELECT
+16            *
+17            ,arrival_time   - (INTERVAL 1 MINUTE) AS window_open
+18            ,departure_time + (INTERVAL 1 MINUTE) AS window_close
+19        FROM data -- remember we defined data as the Polars DataFrame with our truck station data
+20    ) A
+21
+22    LEFT JOIN (
+23        SELECT
+24            *
+25            -- This is the time, in seconds between the arrival and departure of
+26            -- each truck PER ROW in the original data-frame 
+27            ,DATEDIFF('seconds', arrival_time, departure_time) AS duration
+28        FROM data -- this is where we perform a self-join
+29    ) B
+30
+31    ON (
+32        -- Case 2 in the diagram;
+33        (B.arrival_time <= A.window_open AND 
+34            -- Adding the duration here makes sure that the second interval
+35            -- is at least ENDING AFTER the start of the overlap window
+36            (B.arrival_time   + TO_SECONDS(B.duration)) >=  A.window_open) OR
+37
+38        -- Case 3 in the diagram - the simplest of all five cases
+39        (B.arrival_time >= A.window_open AND 
+40                                      B.departure_time  <= A.window_close) OR
+41
+42        -- Case 4 in the digram;
+43        (B.arrival_time >= A.window_open AND
+44            -- Subtracting the duration here makes sure that the second interval
+45            -- STARTS BEFORE the end of the overlap window.
+46            (B.departure_time - TO_SECONDS(B.duration)) <= A.window_close)
+47    )
+48    GROUP BY 1, 2, 3, 4
+49""")
+

The output of this query is:

+ + + + + +
"""
+┌─────────────────────┬─────────────────────┬─────────────────────┬───┬──────────────────┬────────────────────┐
+│    arrival_time     │   departure_time    │     window_open     │ … │  docked_trucks   │ docked_truck_count │
+│      timestamp      │      timestamp      │      timestamp      │   │    varchar[]     │       uint64       │
+├─────────────────────┼─────────────────────┼─────────────────────┼───┼──────────────────┼────────────────────┤
+│ 2023-01-01 06:23:47 │ 2023-01-01 06:25:08 │ 2023-01-01 06:22:47 │ … │ [A1]             │                  1 │
+│ 2023-01-01 06:26:42 │ 2023-01-01 06:28:02 │ 2023-01-01 06:25:42 │ … │ [A1]             │                  1 │
+│ 2023-01-01 06:30:20 │ 2023-01-01 06:35:01 │ 2023-01-01 06:29:20 │ … │ [B3, C3, A6, A5] │                  4 │
+│ 2023-01-01 06:32:06 │ 2023-01-01 06:33:48 │ 2023-01-01 06:31:06 │ … │ [B3, C3, A6, A5] │                  4 │
+│ 2023-01-01 06:33:09 │ 2023-01-01 06:36:01 │ 2023-01-01 06:32:09 │ … │ [B3, C3, A6, A5] │                  4 │
+│ 2023-01-01 06:34:08 │ 2023-01-01 06:39:49 │ 2023-01-01 06:33:08 │ … │ [B3, C3, A6, A5] │                  4 │
+│ 2023-01-01 06:36:40 │ 2023-01-01 06:38:34 │ 2023-01-01 06:35:40 │ … │ [A5, A6, C3, B3] │                  4 │
+│ 2023-01-01 06:37:43 │ 2023-01-01 06:40:48 │ 2023-01-01 06:36:43 │ … │ [A5, A6, C3]     │                  3 │
+│ 2023-01-01 06:39:48 │ 2023-01-01 06:46:10 │ 2023-01-01 06:38:48 │ … │ [A6, A5, C3]     │                  3 │
+├─────────────────────┴─────────────────────┴─────────────────────┴───┴──────────────────┴────────────────────┤
+│ 9 rows                                                                                  6 columns (5 shown) │
+└─────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
+"""

We clearly see the strengths of DuckDB in how succintly we were able to express this operation. We also find how DuckDB is able to seamlessly integrate with an existing Pandas or Polars pipeline with zero-conversion costs. In fact, we can convert this back to a Polars or Pandas dataframe by appending the ending bracket with db.query(...).pl() and db.query(...).pd() respectively.

+

Can we make the SQL simpler?

+

Now that we’ve understood the logic that goes into the query, let’s try to optimize the algorithm. We have the three conditions:

+ + + + + +
1-- Case 2 in the diagram
+2(B.arrival_time <= A.window_open AND 
+3    (B.arrival_time   + TO_SECONDS(B.duration)) >=  A.window_open) OR
+4-- Case 3 in the diagram
+5(B.arrival_time >= A.window_open AND 
+6                              B.departure_time  <= A.window_close) OR
+7-- Case 4 in the diagram
+8(B.arrival_time >= A.window_open AND
+9    (B.departure_time - TO_SECONDS(B.duration)) <= A.window_close)

What is common between these three conditions? It takes a while to see it; but it becomes clear that all these cases require the start of the overlap to be before the window ends, and the end of the overlap to be after the window starts. This can be simplified to just:

+ + + + + +
1B.arrival_time   <= A.window_close AND
+2B.departure_time >= A.window_open

making our query much simpler!

+

Simplified SQL: Part 1

+

We’ve removed the need for the duration calculation algother now. Therefore, we can write:

+ + + + + +
 1SELECT
+ 2     A.arrival_time
+ 3    ,A.departure_time
+ 4    ,A.window_open
+ 5    ,A.window_close
+ 6    ,LIST_DISTINCT(LIST(B.ID)) AS docked_trucks
+ 7    ,LIST_UNIQUE(LIST(B.ID))   AS docked_truck_count
+ 8
+ 9FROM (
+10    SELECT *
+11        ,arrival_time   - (INTERVAL 1 MINUTE) AS window_open
+12        ,departure_time + (INTERVAL 1 MINUTE) AS window_close
+13    FROM data) A
+14
+15LEFT JOIN data B
+16
+17ON (
+18    B.arrival_time   <= A.window_close AND
+19    B.departure_time >= A.window_open
+20)
+21GROUP BY 1, 2, 3, 4

Can we simplify this even further?

+

Simplification: Part 2

+

I think the SQL query in the above section is very easy to ready already. However, it is a little clunky overall, and there is a way that we can leverage DuckDB’s extensive optimizations to simplify our legibility by rewriting the query as a cross join:

+ + + + + +
 1SELECT
+ 2    A.arrival_time
+ 3    ,A.departure_time
+ 4    ,A.arrival_time - (INTERVAL 1 MINUTE)   AS window_open
+ 5    ,A.departure_time + (INTERVAL 1 MINUTE) AS window_close
+ 6    ,LIST_DISTINCT(LIST(B.ID)) AS docked_trucks
+ 7    ,LIST_UNIQUE(LIST(B.ID))   AS docked_truck_count
+ 8FROM  data A, data B
+ 9WHERE B.arrival_time   <= window_close
+10AND   B.departure_time >= window_open
+11GROUP BY 1, 2, 3, 4

Why does this work? Before optimization on DuckDB, this is what the query plan looks like:

+
DuckDB query plan before optimization + + + + + +
 1"""
+ 2┌───────────────────────────┐                             
+ 3│         PROJECTION        │                             
+ 4│   ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─   │                             
+ 5│             0             │                             
+ 6│             1             │                             
+ 7│             2             │                             
+ 8│             3             │                             
+ 9│       docked_trucks       │                             
+10│     docked_truck_count    │                             
+11└─────────────┬─────────────┘                                                          
+12┌─────────────┴─────────────┐                             
+13│         AGGREGATE         │                             
+14│   ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─   │                             
+15│        arrival_time       │                             
+16│       departure_time      │                             
+17│        window_open        │                             
+18│        window_close       │                             
+19│          list(ID)         │                             
+20└─────────────┬─────────────┘                                                          
+21┌─────────────┴─────────────┐                             
+22│           FILTER          │                             
+23│   ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─   │                             
+24│     (arrival_time <=      │                             
+25│(departure_time + to_m...  │                             
+26│        AS BIGINT))))      │                             
+27│    (departure_time >=     │                             
+28│(arrival_time - to_min...  │                             
+29│        AS BIGINT))))      │                             
+30└─────────────┬─────────────┘                                                          
+31┌─────────────┴─────────────┐                             
+32│       CROSS_PRODUCT       ├──────────────┐              
+33└─────────────┬─────────────┘              │                                           
+34┌─────────────┴─────────────┐┌─────────────┴─────────────┐
+35│         ARROW_SCAN        ││         ARROW_SCAN        │
+36└───────────────────────────┘└───────────────────────────┘ 
+37"""                            
+

After optimization, the CROSS_PRODUCT is automatically optimized to an interval join!

+
DuckDB query after before optimization + + + + + +
 1"""
+ 2┌───────────────────────────┐                             
+ 3│         PROJECTION        │                             
+ 4│   ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─   │                             
+ 5│             0             │                             
+ 6│             1             │                             
+ 7│             2             │                             
+ 8│             3             │                             
+ 9│       docked_trucks       │                             
+10│     docked_truck_count    │                             
+11└─────────────┬─────────────┘                                                          
+12┌─────────────┴─────────────┐                             
+13│         AGGREGATE         │                             
+14│   ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─   │                             
+15│        arrival_time       │                             
+16│       departure_time      │                             
+17│        window_open        │                             
+18│        window_close       │                             
+19│          list(ID)         │                             
+20└─────────────┬─────────────┘                                                          
+21┌─────────────┴─────────────┐                             
+22│      COMPARISON_JOIN      │                             
+23│   ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─   │                             
+24│           INNER           │                             
+25│ ((departure_time + '00:01 │                             
+26│     :00'::INTERVAL) >=    ├──────────────┐              
+27│        arrival_time)      │              │              
+28│((arrival_time - '00:01:00'│              │              
+29│       ::INTERVAL) <=      │              │              
+30│       departure_time)     │              │              
+31└─────────────┬─────────────┘              │                                           
+32┌─────────────┴─────────────┐┌─────────────┴─────────────┐
+33│         ARROW_SCAN        ││         ARROW_SCAN        │
+34└───────────────────────────┘└───────────────────────────┘
+35"""                      
+

So in effect, we’re actually exploiting a feature of DuckDB to allow us to write our queries in a suboptimal manner for greater readability, and allowing the optmizer to do a good chunk of our work for us. I wouldn’t recommend using this generally, because not all SQL engine optmizers will be able to find an efficient route to these calculations for large datasets.

+

How to get query plans?

+

I’m glad you asked. Here’s the DuckDB page explaining EXPLAIN (heh). Here’s the code I used:

+ + + + + +
 1import duckdb as db
+ 2db.sql("SET EXPLAIN_OUTPUT='all';")
+ 3print(db.query("""
+ 4EXPLAIN
+ 5SELECT
+ 6    A.arrival_time
+ 7    ,A.departure_time
+ 8    ,A.arrival_time - (INTERVAL 1 MINUTE) AS window_open
+ 9    ,A.departure_time + (INTERVAL 1 MINUTE) AS window_close
+10    ,LIST_DISTINCT(LIST(B.ID)) AS docked_trucks
+11    ,LIST_UNIQUE(LIST(B.ID))   AS docked_truck_count
+12FROM  data A, data B
+13WHERE B.arrival_time   <= window_close
+14AND   B.departure_time >= window_open
+15GROUP BY 1, 2, 3, 4
+16""").pl()[1, 1])

What are the alternatives?

+

The data.table way

+

data.table is a package that has historically been ahead of its time - in both speed and features that it has had. Developement has taken a hit recently, but will likely pick back up. It’s my favourite package on all fronts for data manipulation, but suffers simply from the lack of broader R support across the ML and DL space.

+

The foverlaps function

+

If this kind of overlapping join is common, shouldn’t someone have developed a package for it? Turns out, data.table has, and with very specific constraints that make it the perfect solution to our problem (if you don’t mind switching over to R, that is).

+

The foverlaps function has these requirements:

+
    +
  1. The input data.table objects have to be keyed for automatic recognition of columns.
  2. +
  3. The default match type is that it matches all three cases from the image above. Side note: it also has matches for within overlap, matching start and end windows,
  4. +
  5. The last two matching columns in the join condition in by must specify the start and end points of the overlapping window. This isn’t a problem for us now, but does restrict for future uses where we may want non-equi joins on other cases.
  6. +
+

The code, si, the code!

+

Without further ado:

+ + + + + +
 1library(data.table)
+ 2library(lubridate)
+ 3
+ 4######### BOILERPLATE CODE, NO LOGIC HERE ####################
+ 5arrival_time = as_datetime(c(
+ 6  '2023-01-01 06:23:47.000000', '2023-01-01 06:26:42.000000',
+ 7  '2023-01-01 06:30:20.000000', '2023-01-01 06:32:06.000000',
+ 8  '2023-01-01 06:33:09.000000', '2023-01-01 06:34:08.000000',
+ 9  '2023-01-01 06:36:40.000000', '2023-01-01 06:37:43.000000',
+10  '2023-01-01 06:39:48.000000'))
+11departure_time = as_datetime(c(
+12  '2023-01-01 06:25:08.000000', '2023-01-01 06:28:02.000000',
+13  '2023-01-01 06:35:01.000000', '2023-01-01 06:33:48.000000',
+14  '2023-01-01 06:36:01.000000', '2023-01-01 06:39:49.000000',
+15  '2023-01-01 06:38:34.000000', '2023-01-01 06:40:48.000000',
+16  '2023-01-01 06:46:10.000000'))
+17ID = c('A1', 'A1', 'A5', 'A6', 'B3', 'C3', 'A6', 'A5', 'A6')
+18
+19DT = data.table(
+20  arrival_time = arrival_time,
+21  departure_time = departure_time,
+22  ID = ID)
+23######### BOILERPLATE CODE, NO LOGIC HERE ####################
+24
+25# A copy(DT) creates a copy of a data.table that isn't linked
+26# to the original one, so that changes in it don't reflect in
+27# the original DT object.
+28# The `:=` allow assignment by reference (i.e. "in place").
+29DT_with_windows = copy(DT)[, `:=`(
+30  window_start   = arrival_time   - minutes(1),
+31  window_end = departure_time + minutes(1))]
+32
+33# This step is necessary for the second table, but not the first, but we
+34# key both data.tables to make the foverlap code very succinct.
+35setkeyv(DT, c("arrival_time", "departure_time"))
+36setkeyv(DT_with_windows, c("window_start", "window_end"))
+37
+38# The foverlap function returns a data.table, so we can simply apply
+39# the usual data.table syntax on it!
+40# Since we have the same name of some columns in both data.tables,
+41# the latter table's columns are prefixed with "i." to avoid conflicts.
+42foverlaps(DT, DT_with_windows)[
+43  , .(docked_trucks = list(unique(i.ID)),
+44      docked_truck_count = uniqueN(i.ID))
+45  , .(arrival_time, departure_time)]

provides us the output:

+ + + + + +
 1          arrival_time      departure_time docked_trucks docked_truck_count
+ 2                <POSc>              <POSc>        <list>              <int>
+ 31: 2023-01-01 06:23:47 2023-01-01 06:25:08            A1                  1
+ 42: 2023-01-01 06:26:42 2023-01-01 06:28:02            A1                  1
+ 53: 2023-01-01 06:30:20 2023-01-01 06:35:01   A5,A6,B3,C3                  4
+ 64: 2023-01-01 06:32:06 2023-01-01 06:33:48   A5,A6,B3,C3                  4
+ 75: 2023-01-01 06:33:09 2023-01-01 06:36:01   A5,A6,B3,C3                  4
+ 86: 2023-01-01 06:34:08 2023-01-01 06:39:49   A5,A6,B3,C3                  4
+ 97: 2023-01-01 06:36:40 2023-01-01 06:38:34   B3,C3,A6,A5                  4
+108: 2023-01-01 06:37:43 2023-01-01 06:40:48      C3,A6,A5                  3
+119: 2023-01-01 06:39:48 2023-01-01 06:46:10      C3,A5,A6                  3

Considerations for using data.table

+

The package offers a wonderful, nearly one-stop solution that doesn’t require you to write the logic out for the query or command yourself, but has a major problem for a lot of users - it requires you to switch your codebase to R, and a lot of your tasks may be on Python or in an SQL pipeline. So, what do you do?

+

Consider the effort in maintaining an additional dependency for your analytics pipeline (i.e. R), and the effort that you’ll need to invest to run R from Python, or run an R script in your pipeline and pull the output from it back into the pipeline, and make your call.

+]]>
\ No newline at end of file diff --git a/public/categories/index.html b/public/categories/index.html new file mode 100644 index 0000000..8db3705 --- /dev/null +++ b/public/categories/index.html @@ -0,0 +1,5 @@ +Categories | Avinash's Blog
+

Avinash's Blog

Filtering for "Categories"

  • No posts yet
© Avinash Mallya | Design via Bear Cub.
\ No newline at end of file diff --git a/public/categories/index.xml b/public/categories/index.xml new file mode 100644 index 0000000..96562d3 --- /dev/null +++ b/public/categories/index.xml @@ -0,0 +1 @@ +Categories on Avinash's Bloghttps://avimallu.dev/categories/Recent content in Categories on Avinash's BlogHugo -- gohugo.ioen-US© Avinash Mallya \ No newline at end of file diff --git a/public/favicon.ico b/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..5c7d39b3ad1f83ca8ab030fedb36bb3e6e922b10 GIT binary patch literal 4286 zcmchaOD|+W6vwL{9zmi7lNPT=yqkrE1>MOkSP3E?(f9yjBeAra4R;|D*X`R)Mn}uvx%XDp`JFmdx2moX4*BQv3H%okj}YI4 z5Oq@Wk@zl!=jtcR?0y3S147C(I5-%Rib*|5QHlkh@ErmRO#I|M*j{PFQop5A&9(Xi zBWy6i&c(gd-=U!)`U-&srol$ee@Rh$dpr64eyzsFMq)KIG?1O@>gouxmT@~+vrjO< zGMGHxs^3*rRg{*Nrsa0I$>nm9(+N4191bTr91bNpeB|@_lyJ>;V9^e8yWQF!e1m}; z8!_m)hG!KO6}rs}mzl3Ta9D_AdU~41$H(TucWC2XuUVOjA=+aeTzf{@5q_Xv+T^etCJh^1*Ri`)j=~D=VX! znHid$ou$pqOf64ua7b_GqvyS?QPoH+EVv;2RAl0 z=;`T+CMG7RyStl4Mn<&Y6YSE`(uDbckH5FKNA>mfn!miftb8Fqp-_nMdw6)Dv$Hcg zKR>74-CeC{G)lohkT7T88~;T4MqgJ}Ry2QZZjKN$>bJJG($UcoH8(fYvfOfGORzi{s^Dza$B|q1qF0*aY6Fjp!j%4x$Hg5K0nU4 zU;FW%BloZ$<@4H$7?bgR{i`S+6~I_4pb4)BGg+ANFR{OLq3Csi~pU(^EAMaIRyHoduiu>@(T^k22I_ zam+%zoeNm^vESJ-`I(i?KHuZxoW$ao*%vJQgAXywY`Lyeo>MuOd9I|HG26zCYl%si{fH?{CuI4d!nNTw@MG$-X(v-yQ4| z77X+kOt7VLr55G=AB@3Q2rMuSw&?Hg_Zl&%JQ(qDoT;|x_oBg+Q&->{RDFj^i?N7G gtG`Q96^r2$zB%WLeJF(MhkU`+%@_Uy^H8$?0bHIQqW}N^ literal 0 HcmV?d00001 diff --git a/public/herman.min.css b/public/herman.min.css new file mode 100644 index 0000000..def88db --- /dev/null +++ b/public/herman.min.css @@ -0,0 +1 @@ +:root{font-size:62.5%;--color-dark:#181a20;--color-light:#fafafa;--color-primary:#1a8fe3;--size:1rem;--spacing:calc(var(--size) * 2.4)}body{background:var(--color-dark);color:var(--color-light);padding:4rem;font-family:Avenir,avenir next lt pro,Montserrat,Corbel,urw gothic,source-sans-pro,sans-serif,apple color emoji,segoe ui emoji,segoe ui symbol,noto color emoji;font-size:calc(var(--size) * 1.8);line-height:1.5;min-height:80vh;max-width:1600px;margin:0 auto;word-wrap:break-word}header,main,footer{max-width:70ch;margin-inline:auto}header{padding-bottom:var(--spacing)}nav a,a.blog-tags{margin-right:calc(var(--spacing)/2)}a.blog-tags{line-height:2}main{padding-bottom:var(--spacing)}footer{text-align:center;padding-top:var(--spacing)}a{color:currentColor;text-decoration-color:var(--color-primary);text-decoration-thickness:.3ex;text-underline-offset:.3ex}a:hover{text-decoration-thickness:.4ex}img{display:block;max-width:100%;height:auto}h1,h2,h3,h4{font-weight:700;line-height:1.3}h1{font-size:calc(var(--size) * 4.2)}h2{font-size:calc(var(--size) * 3.4)}h3{font-size:calc(var(--size) * 2.6)}h4{font-size:calc(var(--size) * 1.8)}ul,ol{padding-inline-start:var(--spacing)}li{margin-block-start:var(--spacing)}blockquote{padding-inline-start:var(--spacing);border-inline-start:.2em solid;font-style:italic;max-width:50ch}:is(h1,h2,h3,h4,blockquote){margin-block-end:calc(var(--spacing)/2)}:is(h1,h2,h3,h4)+*{margin-block-start:calc(var(--spacing)/3)}:is(h1,h2,h3,h4)+:where(h2,h3,h4){margin-block-start:calc(var(--spacing) * 2)}.title{text-decoration:none}.title h1{font-size:calc(var(--size) * 3.4);margin-top:calc(var(--spacing)/2)}ul.blog-posts{list-style-type:none;padding:unset}ul.blog-posts li{display:flex;flex-direction:column}ul.blog-posts li span{min-width:11ch}p.byline{opacity:.5}code{font-family:ui-monospace,cascadia code,source code pro,Menlo,Consolas,dejavu sans mono,monospace;padding:2px calc(var(--spacing)/4);background-color:#282a36;font-size:calc(var(--size) * 1.4)}pre code{display:block;padding:var(--spacing);overflow-x:auto;-webkit-text-size-adjust:100%;-moz-text-size-adjust:100%}table{width:100%}table,th,td{border:1px solid;border-collapse:collapse;border-color:var(--color-light);padding:calc(var(--spacing)/2)}.disabled{color:currentColor;cursor:not-allowed;opacity:.5}@media screen and (min-width:600px){ul.blog-posts li{flex-direction:row;gap:calc(var(--spacing)/2)}}.skip-link{position:absolute;top:5;transform:translateY(-600%);transition:transform .5s;background-color:#181a20;padding:6px}.skip-link:focus{transform:translateY(0%)}figure{margin-inline-start:0;margin-inline-end:0}figcaption>p{margin-block-start:9px;text-align:center;font-style:italic} \ No newline at end of file diff --git a/public/index.html b/public/index.html new file mode 100644 index 0000000..e58d664 --- /dev/null +++ b/public/index.html @@ -0,0 +1,11 @@ +about | Avinash's Blog
+

Avinash's Blog

Hi there!

My name is Avinash Mallya (pronounced Uh-vin-aash Muh-ll-yeah), and I’m a data scientist by profession. This website is a creative outlet, and my piece of the internet where I show off.

What’s here?

You’ll find the following:

  • A few posts where I show up some creative ways that I’ve solved complex problems.
  • Links to projects that I’ve worked on, or have contributed to.
  • An assortment of random things I’ve found interesting.

Contact

You can find me on:

Please reach out via one of the above if you want to talk.

© Avinash Mallya | Design via Bear Cub.
\ No newline at end of file diff --git a/public/index.xml b/public/index.xml new file mode 100644 index 0000000..5b7510e --- /dev/null +++ b/public/index.xml @@ -0,0 +1,950 @@ +Avinash's Bloghttps://avimallu.dev/Recent content on Avinash's BlogHugo -- gohugo.ioen-US© Avinash MallyaFri, 20 Oct 2023 00:00:00 +0000projectshttps://avimallu.dev/projects/Mon, 01 Jan 0001 00:00:00 +0000https://avimallu.dev/projects/<p>Most of my work is on private repositories, but I do find some time to learn new topics, contribute back to some of the open source packages I frequently use, or to create interesting tools.</p> +<h1 id="featured-projects">Featured projects</h1> +<ol> +<li><a href="https://avimallu.github.io/BorrowChecker/">BorrowChecker</a>: A play on the same concept in Rust, this is a simple web-app that allows you to split complex receipts with multiple people in a simple manner. Runs entirely in-browser. Made with Dioxus and Rust. <a href="https://github.com/avimallu/BorrowChecker">Repository link</a>.</li> +<li><a href="https://github.com/avimallu/PowerPointSnap">PowerPointSnap</a>: A mostly feature complete tool for PowerPoint on VBA that is filled with a lot of tricks to make it easy to consistently format presentations to impress clients - from my consulting days. Written in VBA. See accompanying <a href="https://avimallu.dev/blog/003_powerpointsnap/">blog post</a>.</li> +</ol> +<h1 id="other-work-or-contributions">Other work or contributions</h1> +<ol> +<li><a href="https://github.com/avimallu/IntelligentReceiptSplitter">IntelligentReceiptSplitter</a>: A relatively simple predecessor to <a href="https://avimallu.github.io/BorrowChecker/">BorrowChecker</a> that focussed on using an OCR framework followed by an LLM based parser to read receipts that could be further split manually. This combination significantly reduced hallucinations from LLMs but was still very computationally intensive to run.</li> +<li><a href="https://github.com/avimallu/r.data.table.funs">r.data.table.funs</a>: A very small set of R functions that use <code>data.table</code>, that I found very useful earlier in my career to quicky churn out analyses. It is not ground-breaking, but rather something that anybody with sufficient basic skills in R and understand, and save an immense amount of time.</li> +<li>I <a href="https://github.com/pola-rs/polars-book/pull/364">wrote</a> <a href="https://github.com/pola-rs/polars-book/pull/358">several</a> <a href="https://github.com/pola-rs/polars-book/pull/365/files">chapters</a> of the Polars Book, which have since been moved to the main Polars repository. Polars was a breadth of fresh air in terms of speed and ergonomics, which I had been sorely missing after switching to Python from R (where projects like <code>data.table</code> and <code>dplyr</code> dominated), so I was eager to make it better for everybody making the switch.</li> +</ol>Most of my work is on private repositories, but I do find some time to learn new topics, contribute back to some of the open source packages I frequently use, or to create interesting tools.

+

Featured projects

+
    +
  1. BorrowChecker: A play on the same concept in Rust, this is a simple web-app that allows you to split complex receipts with multiple people in a simple manner. Runs entirely in-browser. Made with Dioxus and Rust. Repository link.
  2. +
  3. PowerPointSnap: A mostly feature complete tool for PowerPoint on VBA that is filled with a lot of tricks to make it easy to consistently format presentations to impress clients - from my consulting days. Written in VBA. See accompanying blog post.
  4. +
+

Other work or contributions

+
    +
  1. IntelligentReceiptSplitter: A relatively simple predecessor to BorrowChecker that focussed on using an OCR framework followed by an LLM based parser to read receipts that could be further split manually. This combination significantly reduced hallucinations from LLMs but was still very computationally intensive to run.
  2. +
  3. r.data.table.funs: A very small set of R functions that use data.table, that I found very useful earlier in my career to quicky churn out analyses. It is not ground-breaking, but rather something that anybody with sufficient basic skills in R and understand, and save an immense amount of time.
  4. +
  5. I wrote several chapters of the Polars Book, which have since been moved to the main Polars repository. Polars was a breadth of fresh air in terms of speed and ergonomics, which I had been sorely missing after switching to Python from R (where projects like data.table and dplyr dominated), so I was eager to make it better for everybody making the switch.
  6. +
+]]>
Quick hacks to make client-ready presentationshttps://avimallu.dev/blog/003_powerpointsnap/Fri, 20 Oct 2023 00:00:00 +0000https://avimallu.dev/blog/003_powerpointsnap/<h1 id="premise">Premise</h1> +<p>When I worked in healthcare consulting, I often spent a LOT of my time creating PowerPoint presentations (<em>decks</em> in consulting lingo - not even <em>slide decks</em>). However, it was rather repetitive. Thus, was born PowerPointSnap.</p> +<h1 id="what-is-it">What is it?</h1> +<p>I&rsquo;ll write this down as pointers.</p> +<ol> +<li>It&rsquo;s a VBA based PowerPoint add-on. Just a set of commands that work well with each other.</li> +<li>It&rsquo;s Windows only - it&rsquo;s unlikely to work on MacOS.</li> +<li>It&rsquo;s installation-free and is not an executable, which makes it perfect for locked-down corporate environments, as long as you have the permission to download files.</li> +</ol> +<h1 id="how-do-i-get-it">How do I get it?</h1> +<p>The project is available on this <a href="https://github.com/avimallu/PowerPointSnap">Github repo</a>. The instructions to install it are available there, but here&rsquo;s the down-low:</p>Premise +

When I worked in healthcare consulting, I often spent a LOT of my time creating PowerPoint presentations (decks in consulting lingo - not even slide decks). However, it was rather repetitive. Thus, was born PowerPointSnap.

+

What is it?

+

I’ll write this down as pointers.

+
    +
  1. It’s a VBA based PowerPoint add-on. Just a set of commands that work well with each other.
  2. +
  3. It’s Windows only - it’s unlikely to work on MacOS.
  4. +
  5. It’s installation-free and is not an executable, which makes it perfect for locked-down corporate environments, as long as you have the permission to download files.
  6. +
+

How do I get it?

+

The project is available on this Github repo. The instructions to install it are available there, but here’s the down-low:

+
    +
  1. Download the Snap.ppam file to your system.
  2. +
  3. Enable the developer options.
  4. +
  5. Go to the Developer tab, and click on PowerPoint Add-ins.
  6. +
  7. Click on Add New. Choose the location of the file you just dowloaded. Click Close.
  8. +
  9. To uninstall, repeat the process, and simply click on Remove this time.
  10. +
+

What can I do with it?

+

Frankly, a LOT. The base concept of this tool is:

+
    +
  1. “Set” a shape as the one you want to copy a property from.
  2. +
  3. Select any property from the list to automatically apply it.
  4. +
+

Here’s a non-exhaustive list of all the options available.

+

Apply properties of shapes directly

+

This is the part of the interface that can be used for shapes (which include charts and tables).

+

The UI for copying shape properties

+

To use, first select a shape object, click on “Set”. Then, choose the object you want to Snap its properties to (see how I got the inspiration for the name?). You should be able to copy all compatible properties - if something is not copy-able, the tool will show an error, and then let you exit.

+

Note that it’s probably not to apply a property of a shape to a table - if you want to make the entire table orange, there are probably better built-in ways to do it than to use Snap.

+

Beautify charts with Snappable properties

+

Charts are also supported, with dedicated features for it.

+

The UI for copying chart properties

+

What do these features do? You should be able to hover over the option and get a tooltip that shows what it’s capable of, but here’s another summary just in case:

+
    +
  1. Sync Value/Date Axis: this will try to align the range, the ticks, the numeric values etc. of the “set” chart to the one you’ve selected. I couldn’t put in just $x$ and $y$ here because Microsoft internally doesn’t label them that way. Try either of these two options (you can undo!) and see what works best for your chart. This doesn’t work well yet for 3D charts.
  2. +
  3. Sync Plot/Title/Legend: often, you want to centre a title, or make sure that multiple charts that show nearly identical things for different variables all look exactly the same from a client perspective. But that’s usually difficult if you’ve already configured the charts a little - which can be remedied with this option!
  4. +
  5. Format Painter: this is simply a helper for the normal format painter to align the formats of the text that you’ve selected with the way it originally is in the “set” chart. The reason for this feature is simply to avoid going back to Home to click on the Format Painter option again.
  6. +
  7. Reset Axes Scales: in case you messed up somewhere, you can use this to rever to PowerPoint defaults.
  8. +
+

The next two options deserve their own section.

+

Customize the labels programmatically

+

Your immediate senior in a consulting environment would frown at your chart, and then exclaim, “I think that’s too many labels for the data points. Can you show them every two/three/four labels? I know this is manual work, but it’s a one time thing!”

+

It’s never a one time affair. But don’t worry, we have this nice feature to help us. If you click on the Customize Label option, you will get this (without the “Set” option):

+

The UI for customizing labels.

+

Never mind the rather unfriendly legend entries. They’re just here to demonstrate that you can do the following kinds of whacky abilities with your own chart!

+

Screenshots of the chart snapability

+

Of course, visuals will do it more justice. For example, look at this image:

+

There’s a lot wrong with this image. But primarily, the charts are of different sizes, the axes are different, the labels are too clustered, and the titles aren’t centered.

+

Here’s what you can do:

+
    +
  1. Click on the left chart. Press “Set” in the toolbar for Snap.
  2. +
  3. Click on the right chart, and then go through the following: +
      +
    1. In Shapes, click on Dim. This will align the shapes of the chart.
    2. +
    3. Use the guides that you get while moving the chart to align the positions of the two charts now that their shapes are equal.
    4. +
    5. You’ll notice that the chart area doesn’t still match, nor does the title.
    6. +
    7. In Charts, click on Sync Plot Area and Sync Title Area, and watch the magic unfold.
    8. +
    9. Now, click on the second chart, and click on “Set”. Let’s align the axes of the first chart to the second one.
    10. +
    11. Click on the first chart, and then in Charts, click Sync Value Axis.
    12. +
    +
  4. +
  5. Let’s bring that senior’s exclamation back into play - (s)he wants you to highlight only Profit labels, and that too every 2 iterations. To do this: +
      +
    1. Click on Customize Labels after clicking on either chart.
    2. +
    3. You’ll get the screen shown in the previous section. Make sure to adjust the values such that it’s exactly like the screenshot there.
    4. +
    5. Click on “Save and Run”. This will save the configuration you’ve selected, and run it on the chart you’ve selected.
    6. +
    7. Click the other chart. Then, in Charts, click on Rerun Customization.
    8. +
    +
  6. +
+

This is what your results should look like:

+

Everything almost consistent. Your senior rests their eyes, and secretly wonder how you managed to do it quickly… maybe they should change some requirements…

+

Of course, getting those calculations right is a whole different thing that will need some work.

+

Align table dimensions

+

Oftentimes, you have two tables that show similar values… you know the drill. Here’s what you can do in a scenario such as this:

+

Similar data, but vastly different tables.

+

This is what the Tables section of the tool looks like:

+

The UI for Tables

+

To align these tables together,

+
    +
  1. Click on the left table. Press “Set” in the toolbar for Snap.
  2. +
  3. Click on the right table.
  4. +
  5. Click on Shapes, inside it, Dim. Now the shapes of the table are the same.
  6. +
  7. In Tables, click on Sync Column Widths. Now the columns are also the same.
  8. +
  9. If you try to align by rows, it fails because the number of rows are not the same in the two tables.
  10. +
+

Here’s what you’ll end up with:

+

Similar data, and similar enough tables.

+

Pretty neat, eh?

+]]>
Finding representative samples efficiently for large datasetshttps://avimallu.dev/blog/002_representative_samples/Thu, 19 Oct 2023 00:00:00 +0000https://avimallu.dev/blog/002_representative_samples/<h1 id="premise">Premise</h1> +<p>In this day and age, we&rsquo;re not short on data. <em>Good</em> data, on the other hand, is very valuable. When you&rsquo;ve got a large amount of improperly labelled data, it may become hard to find to find a representative dataset to train a model on such that it generalizes well.</p> +<p>Let&rsquo;s formalize the problem a little so that a proper approach can be developed. Here&rsquo;s the problem statement:</p> +<ol> +<li>You have a large-ish set of (imperfectly) labelled data points. These data points can be represented as a 2D matrix.</li> +<li>You need to train a model to classify these data points on either these labels, or on labels dervied from imperfect labels.</li> +<li>You need a good (but not perfect) representative sample for the model to be generalizable, but there are too many data points for each label to manually pick representative examples.</li> +</ol> +<h2 id="in-a-hurry">In a hurry?</h2> +<p>Here&rsquo;s what you need to do:</p>Premise +

In this day and age, we’re not short on data. Good data, on the other hand, is very valuable. When you’ve got a large amount of improperly labelled data, it may become hard to find to find a representative dataset to train a model on such that it generalizes well.

+

Let’s formalize the problem a little so that a proper approach can be developed. Here’s the problem statement:

+
    +
  1. You have a large-ish set of (imperfectly) labelled data points. These data points can be represented as a 2D matrix.
  2. +
  3. You need to train a model to classify these data points on either these labels, or on labels dervied from imperfect labels.
  4. +
  5. You need a good (but not perfect) representative sample for the model to be generalizable, but there are too many data points for each label to manually pick representative examples.
  6. +
+

In a hurry?

+

Here’s what you need to do:

+
    +
  1. Read the premise and see if it fits your problem.
  2. +
  3. Go to the For the folks in a hurry! section at the end to find the generic solution and how it works.
  4. +
+

Why do we need representative samples?

+

Generally, three things come to mind:

+
    +
  1. Allows the model to be generalizable for all kinds of data points within a category.
  2. +
  3. Allows for faster training of the model - you need fewer data points to get the same accuracy!
  4. +
  5. Allows maintaining the training set - if your training set needs validation by experts or annotations, this keeps your costs low!
  6. +
+

Define the data

+

This data can be practically anything that can be represented as a 2D matrix.

+

There are exceptions. Raw image data (as numbers) might get difficult because even if you flatten them, they’ll be significant correlation between features. For example, a face can appear practically anywhere in the image, and all pixels centered around the face will be highly correlated, even if they are on different lines. A workaround in this case would be to pipe the image through a CNN model that has been trained on some generic task and produces a 1D representation of a single image in the final hidden layer before the output. Other data will need further processing along similar lines.

+

Get a specific dataset

+

For this specific article, I will use the ShopMania dataset on Kaggle. I apologize in advance for not using a more easily accessible dataset (you need to sign into Kaggle to download it) - and I’m not 100% sure if the GPL allows me to create a copy of the data and place it in my own repository. Nevertheless, the data (if you download it and choose to use it instead of some other dataset) will look like this:

+
+

NOTE: whenever I want to show an output along with the code I used for it, you’ll see the characters >> indicating the command used, and the output to be without those prefixes.

+
+ + + + + +
 1>> import polars as pl
+ 2>> data = pl.read_csv("archive/shopmania.csv")
+ 3>> data
+ 4shape: (313_705, 4)
+ 5┌────────────┬──────────────────────────────────────────────────────┬─────────────┬────────────────┐
+ 6 product_ID  product_title                                         category_ID  category_label 
+ 7 ---         ---                                                   ---          ---            
+ 8 i64         str                                                   i64          str            
+ 9╞════════════╪══════════════════════════════════════════════════════╪═════════════╪════════════════╡
+10 2           twilight central park print                           2            Collectibles   
+11 3           fox print                                             2            Collectibles   
+12 4           circulo de papel wall art                             2            Collectibles   
+13 5           hidden path print                                     2            Collectibles   
+14                                                                                           
+15 313703      deago anti fog swimming diving full face mask         229          Water Sports   
+16             surface snorkel scuba fr gopro black s/m                                          
+17 313704      etc buys full face gopro compatible snorkel scuba     229          Water Sports   
+18             diving mask blue large/xtralarge blue                                             
+19 313705      men 039 s full face breathe free diving snorkel mask  229          Water Sports   
+20             scuba optional hd camera blue mask only adult men                                 
+21 313706      women 039 s full face breathe free diving snorkel     229          Water Sports   
+22             mask scuba optional hd camera black mask only                                     
+23             children and women                                                                
+24└────────────┴──────────────────────────────────────────────────────┴─────────────┴────────────────┘

The data documentation on Kaggle states:

+
+

The first dataset originates from ShopMania, a popular online product comparison platform. It enlists tens of millions of products organized in a three-level hierarchy that includes 230 categories. The two higher levels of the hierarchy include 39 categories, whereas the third lower level accommodates the rest 191 leaf categories. Each product is categorized into this tree structure by being mapped to only one leaf category. Some of these 191 leaf categories contain millions of products. However, shopmania.com allows only the first 10,000 products to be retrieved from each category. Under this restriction, our crawler managed to collect 313,706 products.

+
+

For demonstration, I’ll just limit the categories to those that have exactly 10,000 occurences.

+ + + + + +
1data = (
+2    data
+3    .filter(pl.count().over("category_ID") == 10000)
+4)

You’ll notice that there are only 17 categories in this dataset. Run this to verify that fact.

+ + + + + +
 1>>> data.get_column("category_label").unique()
+ 2shape: (17,)
+ 3Series: 'category_label' [str]
+ 4[
+ 5    "Kitchen & Dining"
+ 6    "Scarves and wraps"
+ 7    "Handbags & Wallets"
+ 8    "Rugs  Tapestry & Linens"
+ 9    "Cell Phones Accessories"
+10    "Men's Clothing"
+11    "Jewelry"
+12    "Belts"
+13    "Men Lingerie"
+14    "Crafts"
+15    "Football"
+16    "Medical Supplies"
+17    "Adult"
+18    "Hunting"
+19    "Women's Clothing"
+20    "Pet Supply"
+21    "Office Supplies"
+22]

Note that this is very easy in Polars, which is the package I typically use for data manipulation. I recommend using it over Pandas.

+

Specify the task

+

Okay - so now we have exactly 10,000 products per category. We only have the title of the product that can be leveraged for categorization. So let me define the task this way:

+
+

Craft a small representative sample for each category.

+
+

Why small? It helps that it’ll make the model faster to train - and keep the training data manageable in size.

+

Finding representative samples

+

I mentioned earlier that we need to represent data as a 2D matrix for the technique I have in mind to work. How can I translate a list of text to a matrix? The answer’s rather simple: use SentenceTransformers to get a string’s embedding. You could also use more classic techniques like computing TF-IDF values, or use more advanced transformers, but I’ve noticed that SentenceTransformers are able to capture semantic meaning of sentences rather well (assuming you use a good model suited for the language the data is in) - they are trained on sentence similarity after all.

+

Getting SentenceTransformer embeddings

+

This part is rather simple. If you’re unable to install SentenceTransformers, please check their website.

+ + + + + +
1import sentence_transformers
+2# See list of models at www.sbert.net/docs/pretrained_models.html
+3ST = sentence_transformers.SentenceTransformer("all-mpnet-base-v2")
+4title_embeddings = (
+5    ST.encode(
+6        data.get_column("product_title").to_list(),
+7        show_progress_bar=True, convert_to_tensor=True)
+8    .numpy())

This process will be slow (~30 minutes) if you don’t have a GPU. There are faster approaches, but they are slightly more involved than would be beneficial for a blog post. The wait will be worth it, I promise! In addition, the call to .numpy() at the end is to directly get a single numpy array - otherwise you get a list of numpy arrays, which is rather inefficient. Further, SentenceTransformers will try to run on the GPU if available, and if so, you will need to write .cpu().numpy() so that the tensor is copied from the GPU to the CPU.

+
+

NOTE: for a proof-of-concept implementation, or if you’re on the CPU, try the all-MiniLM-L6-v2 model. It’s a much smaller and much faster model, although you sacrifice a little in terms of accuracy.

+
+

The concept of approximate nearest neighbors

+

Performing any kind of nearest neighbor algorithm on medium scale datasets (even bordering 10,000 rows and tens of columns) tends to be slow. A primary driver of this was the need to calculate all, or nearly all distances between all data points. Approximate nearest neighbor (ANN) algorithms work around this through various approaches, which warrant their own blog post. For now, it would suffice to understand that there are shortcuts that ANN algorithms take to give you if not the exact nearest neighbor, at least one of the nearest neighbors (hence the term approximate).

+

There are several algorithms that you can use - I shall proceed with faiss, because it has a nice Python interface and is rather easy to work with. You can use any algorithm - a full list of the major ones are available here.

+

I’ll explain why we’re in the nearest neighbor territory in due course.

+

Building the database

+

To build the database, all we need is the title_embeddings matrix.

+ + + + + +
1import faiss
+2def create_index(title_embeddings):
+3    d = title_embeddings.shape[1]    # Number of dimensions
+4    ann_index = faiss.IndexFlatL2(d) # Index using Eucledian Matrix
+5    ann_index.add(title_embeddings)  # Build the index
+6    
+7    return ann_index # Faiss considers databases an "index"

This does create a database. But remember, we’re trying to find representative samples - which means we need to do this by the category (or label). So let’s design a function that sends only the necessary data as that for a particular category, and then create the database. We’ll need three pieces of information from this function:

+
    +
  1. The actual faiss database.
  2. +
  3. The actual subset of data that was used to build this index.
  4. +
  5. The label indices with respect to the original data that went into the faiss database.
  6. +
+

(2) and (3) will help us later in rebuilding a “network graph” that will allow us to reference the original data points.

+ + + + + +
 1import faiss
+ 2import numpy as np
+ 3import polars as pl
+ 4
+ 5def create_index(label):
+ 6    faiss_indices = (
+ 7        data # this needs to be an argument if you want to create a generic function
+ 8        .with_row_count("row_idx")
+ 9        .filter(pl.col("category_label") == label)
+10        .get_column("row_idx")
+11        .to_list()
+12    )
+13    
+14    faiss_data = title_embeddings[faiss_indices]
+15    d = data.shape[1]               # Number of dimensions
+16    faiss_DB = faiss.IndexFlatIP(d) # Index using Inner Product
+17    faiss.normalize_L2(data)        # Normalized L2 with Inner Product search = cosine similarity
+18    # Why cosine similarity? It's easier to specify thresholds - they'll always be between 0 and 1.4.
+19    # If using Eucledian or other distance, we'll have to spend some time finding a good range
+20    # where distances are reasonable. See https://stats.stackexchange.com/a/146279 for details.
+21    faiss_DB.add(data)              # Build the index
+22    
+23    return faiss_DB, faiss_data, faiss_indices

Identifying the nearest neighbors

+

To proceed with getting a representative sample, the next step is to find the nearest neighbors for all data points in the database. This isn’t too hard - faiss index objects have a built-in search method to find the k nearest neighbors for a given index, along with the (approximate) distance to it. Let’s then write a function to get the following information: the label index for whom nearest neighbors are being searched, the indices of said nearest neighbors and the distance between them. In network graph parlance, this kind of data is called an edge list i.e. a list of pair of nodes that are connected, along with any additional information that specifies a property (in this case distance) of the edge that connects these nodes.

+ + + + + +
 1def get_edge_list(label, k=5):
+ 2    faiss_DB, faiss_data, faiss_indices = create_index(label)
+ 3    # To map the data back to the original `train[b'data']` array
+ 4    faiss_indices_map = {i: x for i,x in enumerate(faiss_indices)}
+ 5    # To map the indices back to the original strings
+ 6    title_name_map = {i: x for i,x in data.select("row_idx", "product_title").rows()}
+ 7    distances, neighbors = faiss_DB.search(faiss_data, k)
+ 8    
+ 9    return (
+10        pl.DataFrame({
+11            "from": faiss_indices})
+12        .with_columns(
+13            pl.Series("to", neighbors),
+14            pl.Series("distance", distances))
+15        .explode("to", "distance")
+16        .with_columns(
+17            pl.col("from")
+18            .map_dict(title_name_map),
+19            pl.col("to")
+20            .map_dict(faiss_indices_map)
+21            .map_dict(title_name_map))
+22        .filter(pl.col("from") != pl.col("to"))
+23    )                   

NetworkX and Connected Components

+

The next step in the process is to create a network graph using the edge-list. But why?

+

Remember that we have identified the (k=5) nearest neighbors of each data point. Let’s say that we have a point A that has a nearest neighbor B. C is not a nearest neighbor of A, but it is a nearest neighbor of B. In a network graph, if A and C are sufficiently similar enough to B within a particular minimum thershold, then A will be connected to C through B! Hopefully a small visual below would help.

+

How a network component is formed.

+

What happens when such a concept is extended for many data points? Not all of them would be connected - because we’re applying a minimum threshold that they have to meet. This is the only hueristic part of the rather fast process. Here’s one more helpful visual:

+

How a network cluster is formed.

+

Very starry night-eque vibes here. Let’s get to the code.

+ + + + + +
1import networkx as nx
+2def get_cluster_map(label, k=5, min_cosine_distance=0.95):
+3    edge_list = (
+4        get_edge_list(label, k=k)
+5        .filter(pl.col("distance") >= min_cosine_distance)
+6    )
+7    graph = nx.from_pandas_edgelist(edge_list.to_pandas(), source="from", target="to")
+8    return {i: list(x) for i,x in enumerate(nx.connected_components(graph))}

Getting clusters

+

Now that all the parts of the puzzle are together, let’s run it to see what kind of clusters you get for Cell Phone Accessories.

+ + + + + +
1clusters = get_cluster_map("Cell Phones Accessories", 5, 0.95)

Make sure to configure the following if your results aren’t good enough:

+
    +
  1. Relax the min_cosine_distance value if you want bigger clusters.
  2. +
  3. Increase the number of nearest neighbors if you want more matches.
  4. +
+

Viewing the components

+

There will likely be many clusters (you can see how many exactly with len(clusters)). Let’s look at a random cluster:

+ + + + + +
1>> clusters[3]
+2['smartphone lanyard with card slot for any phone up to 6 yellow 72570099',
+3 'smartphone lanyard with card slot for any phone up to 6 black 72570093',
+4 'smartphone lanyard with card slot for any phone up to 6 lightblue 72570097',
+5 'smartphone lanyard with card slot for any phone up to 6 blue 72570095',
+6 'smartphone lanyard with card slot for any phone up to 6 green 72570101',
+7 'smartphone lanyard with card slot for any phone up to 6 pink 72570091']

Let’s see another cluster that had 172(!) members in my run (the clusters themselves will be stable, but their indices may change in each run owing to some inherent randomness in the process).

+ + + + + +
 1>>> clusters[6]
+ 2['otm essentials iphone 8/7 modern clear printed phone case snowflakes iphone 8/7 op qq z051a',
+ 3 'otm essentials iphone 8/7 modern clear printed phone case iphone 8/7 arrows blue op qq a02 58',
+ 4 'otm essentials iphone 8/7/6s clear printed phone case single iphone 8/7/6s golden pineapple op qq z089a',
+ 5 'otm essentials iphone 8/7/6s clear printed phone case single iphone 8/7/6s butteryfly delight yellow op qq z029d',
+ 6 'otm essentials iphone 8/7 modern clear printed phone case iphone 8/7 luck of the irish op qq a01 45',
+ 7 'otm essentials iphone 8/7 modern clear printed phone case iphone 8/7 brides maid white op qq a02 16',
+ 8 ...
+ 9 'otm essentials iphone 8/7 modern clear printed phone case iphone 8/7 flying arrows white op qq hip 20',
+10 'otm essentials iphone 8/7 modern clear printed phone case iphone 8/7 brides maid pink white op qq a02 17',
+11 'otm essentials iphone 8/7 modern clear printed phone case iphone 8/7 anemone flowers white op qq z036a',
+12 'otm essentials iphone 8/7 modern clear printed phone case mustache iphone 8/7 op qq hip 08',
+13 'otm essentials iphone 8/7 modern clear printed phone case oh snap iphone 8/7 op qq z053a',
+14 'otm essentials iphone 8/7/6s clear printed phone case single iphone 8/7/6s desert cacti orange pink op qq a02 22']

Running for all categories

+

This isn’t that hard (although it may take more than a moment). Just iterate it for each category!

+ + + + + +
1clusters = [get_cluster_map(x, 5, 0.95) for x in data.get_column("category_label").unique()]

For the folks in a hurry!

+

I get it - you often want a solution that “just works”. I can come close to it. See below for code and a succinct explanation. For those of my readers who aren’t in a hurry, this also serves as a nice summary (and copy-pastable code)!

+

The code

+ + + + + +
 1import sentence_transformers
+ 2import faiss
+ 3import polars as pl
+ 4import numpy as np
+ 5
+ 6# Data is read here. You download the files from Kaggle here: 
+ 7# https://www.kaggle.com/datasets/lakritidis/product-classification-and-categorization
+ 8data = pl.read_csv("archive/shopmania.csv", new_columns=[
+ 9    "product_ID", "product_title", "category_ID", "category_label"])
+10data = (
+11    data
+12    .filter(pl.count().over("category_ID") == 10000)
+13    .with_row_count("row_idx")
+14)
+15
+16
+17# See list of models at www.sbert.net/docs/pretrained_models.html
+18ST = sentence_transformers.SentenceTransformer("all-mpnet-base-v2")
+19title_embeddings = (
+20    ST.encode(
+21        data.get_column("product_title").to_list(),
+22        # I'm on a MacBook, you should use `cuda` or `cpu`
+23        # if you've got different hardware.
+24        device="mps",
+25        show_progress_bar=True, convert_to_tensor=True)
+26    .cpu().numpy())
+27
+28# Code to create a FAISS index
+29def create_index(label):
+30    faiss_indices = (
+31        data # this needs to be an argument if you want to create a generic function
+32        .filter(pl.col("category_label") == label)
+33        .get_column("row_idx")
+34        .to_list()
+35    )
+36    
+37    faiss_data = title_embeddings[faiss_indices]
+38    d = faiss_data.shape[1]         # Number of dimensions
+39    faiss_DB = faiss.IndexFlatIP(d) # Index using Inner Product
+40    faiss.normalize_L2(faiss_data)  # Normalized L2 with Inner Product search = cosine similarity
+41    faiss_DB.add(faiss_data)        # Build the index
+42    
+43    return faiss_DB, faiss_data, faiss_indices
+44
+45# Code to create an edge-list
+46def get_edge_list(label, k=5):
+47    faiss_DB, faiss_data, faiss_indices = create_index(label)
+48    # To map the data back to the original `train[b'data']` array
+49    faiss_indices_map = {i: x for i,x in enumerate(faiss_indices)}
+50    # To map the indices back to the original strings
+51    title_name_map = {i: x for i,x in data.select("row_idx", "product_title").rows()}
+52    distances, neighbors = faiss_DB.search(faiss_data, k)
+53    
+54    return (
+55        pl.DataFrame({
+56            "from": faiss_indices})
+57        .with_columns(
+58            pl.Series("to", neighbors),
+59            pl.Series("distance", distances))
+60        .explode("to", "distance")
+61        .with_columns(
+62            pl.col("from")
+63            .map_dict(title_name_map),
+64            pl.col("to")
+65            .map_dict(faiss_indices_map)
+66            .map_dict(title_name_map))
+67        .filter(pl.col("from") != pl.col("to"))
+68    )
+69
+70# Code to extract components from a Network Graph
+71import networkx as nx
+72def get_cluster_map(label, k=5, min_cosine_distance=0.95):
+73    edge_list = (
+74        get_edge_list(label, k=k)
+75        .filter(pl.col("distance") >= min_cosine_distance)
+76    )
+77    graph = nx.from_pandas_edgelist(edge_list.to_pandas(), source="from", target="to")
+78    return {i: list(x) for i,x in enumerate(nx.connected_components(graph))}
+79
+80# Example call to a single category to obtain its clusters
+81clusters = get_cluster_map("Cell Phones Accessories", 5, 0.95)
+82# Example call to **all** categories to obtain all clusters
+83clusters = [get_cluster_map(x, 5, 0.95) for x in data.get_column("category_label").unique()]

How the code works

+

If you want to write down an algorithmic way of looking at this approach,

+
    +
  1. Obtain a 2D representation of the labelled/categorized data. This can be embeddings for strings, the final hidden state output from a generic CNN model for images, or a good ol’ tabular dataset where all numbers are normalized and can be expressed as such.
  2. +
  3. Create an ANN database (based on a package such as faiss) that allows you fast nearest neighbor searches. Use cosine similarity for an easy threshold determination step.
  4. +
  5. Obtain an edge-list of k (from 5 to 100) nearest neighbors for all (or a sample of data points in case your dataset is incredibly HUGE) data points in the ANN database.
  6. +
  7. Apply a minimum threshold on similarity (completely based on heuristics), and obtain the connected components of the network graph from the filtered edge-list you just created.
  8. +
  9. Map all indices back to their source data-points that make sense, and pick any number of items from each cluster (usually, I end up picking one element from each cluster), and you now have your representative sample!
  10. +
+]]>
Overlap Joins: Number of docker trucks in an intervalhttps://avimallu.dev/blog/001_overlap_joins/Thu, 22 Jun 2023 00:00:00 +0000https://avimallu.dev/blog/001_overlap_joins/<h1 id="premise">Premise</h1> +<p>I stumbled upon an interesting <a href="https://stackoverflow.com/questions/76488314/polars-count-unique-values-over-a-time-period">Stackoverflow question</a> that was linked <a href="https://github.com/pola-rs/polars/issues/9467">via an issue</a> on Polars github repo. The OP asked for a pure Polars solution. At the time of answering the question Polars did not have support for non-equi joins, and any solution using it would be pretty cumbersome.</p> +<p>I&rsquo;m more of a right-tool-for-the-job person, so I tried to find a better solution.</p> +<h1 id="problem-statement">Problem Statement</h1> +<p>Suppose we have a dataset that captures the arrival and departure times of trucks at a station, along with the truck&rsquo;s ID.</p>Premise +

I stumbled upon an interesting Stackoverflow question that was linked via an issue on Polars github repo. The OP asked for a pure Polars solution. At the time of answering the question Polars did not have support for non-equi joins, and any solution using it would be pretty cumbersome.

+

I’m more of a right-tool-for-the-job person, so I tried to find a better solution.

+

Problem Statement

+

Suppose we have a dataset that captures the arrival and departure times of trucks at a station, along with the truck’s ID.

+ + + + + +
 1import polars as pl # if you don't have polars, run 
+ 2                    # pip install 'polars[all]'
+ 3data = pl.from_repr("""
+ 4┌─────────────────────┬─────────────────────┬─────┐
+ 5│ arrival_time        ┆ departure_time      ┆ ID  │
+ 6│ ---                 ┆ ---                 ┆ --- │
+ 7│ datetime[μs]        ┆ datetime[μs]        ┆ str │
+ 8╞═════════════════════╪═════════════════════╪═════╡
+ 9│ 2023-01-01 06:23:47 ┆ 2023-01-01 06:25:08 ┆ A1  │
+10│ 2023-01-01 06:26:42 ┆ 2023-01-01 06:28:02 ┆ A1  │
+11│ 2023-01-01 06:30:20 ┆ 2023-01-01 06:35:01 ┆ A5  │
+12│ 2023-01-01 06:32:06 ┆ 2023-01-01 06:33:48 ┆ A6  │
+13│ 2023-01-01 06:33:09 ┆ 2023-01-01 06:36:01 ┆ B3  │
+14│ 2023-01-01 06:34:08 ┆ 2023-01-01 06:39:49 ┆ C3  │
+15│ 2023-01-01 06:36:40 ┆ 2023-01-01 06:38:34 ┆ A6  │
+16│ 2023-01-01 06:37:43 ┆ 2023-01-01 06:40:48 ┆ A5  │
+17│ 2023-01-01 06:39:48 ┆ 2023-01-01 06:46:10 ┆ A6  │
+18└─────────────────────┴─────────────────────┴─────┘
+19""")

We want to identify the number of trucks docked at any given time within a threshold of 1 minute prior to the arrival time of a truck, and 1 minute after the departure of a truck. Equivalently, this means that we need to calculate the number of trucks within a specific window for each row of the data.

+

Finding a solution to the problem

+

Evaluate for a specific row

+

Before we find a general solution to this problem, let’s consider a specific row to understand the problem better:

+ + + + + +
1"""
+2┌─────────────────────┬─────────────────────┬─────┐
+3│ arrival_time        ┆ departure_time      ┆ ID  │
+4│ ---                 ┆ ---                 ┆ --- │
+5│ datetime[μs]        ┆ datetime[μs]        ┆ str │
+6╞═════════════════════╪═════════════════════╪═════╡
+7│ 2023-01-01 06:32:06 ┆ 2023-01-01 06:33:48 ┆ A6  │
+8└─────────────────────┴─────────────────────┴─────┘
+9"""

For this row, we need to find the number of trucks that are there between 2023-01-01 06:31:06 (1 minute prior to the arrival_time and 2023-01-01 06:34:48 (1 minute post the departure_time). Manually going through the original dataset, we see that B3, C3, A6 and A5 are the truck IDs that qualify - they all are at the station in a duration that is between 2023-01-01 06:31:06 and 2023-01-01 06:34:48.

+

Visually deriving an algorithm

+

There are many cases that will qualify a truck to be present in the overlap window defined by a particular row. Specifically for the example above, we have (this visualization is generalizable, because for each row we can calculate without much difficulty the overlap window relative to the arrival and departure times):

+

The five different ways a period can overlap.

+

Take some time to absorb these cases - it’s important for the part where we write the code for the solution. Note that we need to actually tell our algorithm to filter only for Cases 2, 3 and 4, since Cases 1 and 5 will not satisfy our requirements.

+

Writing an SQL query based on the algorithm

+

In theory, we can use any language that has the capability to define rules that meet our algorithmic requirements outlined in the above section to find the solution. Why choose SQL? It’s often able to convey elegantly the logic that was used to execute the algorithm; and while it does come with excessive verbosity at times, it doesn’t quite in this case.

+

Note here that we run SQL in Python with almost no setup or boilerplate code - so this is a Python based solution as well (although not quite Pythonic!).

+

Introducing the DuckDB package

+

Once again, in theory, any SQL package or language can be used. Far too few however meet the ease-of-use that DuckDB provides:

+
    +
  1. no expensive set-up time (meaning no need for setting up databases, even temporary ones),
  2. +
  3. no dependencies (other than DuckDB itself, just pip install duckdb),
  4. +
  5. some very friendly SQL extensions, and
  6. +
  7. ability to work directly on Polars and Pandas DataFrames without conversions
  8. +
+

all with mind-blowing speed that stands shoulder-to-shoulder with Polars. We’ll also use a few advanced SQL concepts noted below.

+

Self-joins

+

This should be a familiar, albeit not often used concept - a join of a table with itself is a self join. There are few cases where such an operation would make sense, and this happens to be one of them.

+

A bullet train recap of non-equi joins

+

A key concept that we’ll use is the idea of joining on a range of values rather than a specific value. That is, instead of the usual LEFT JOIN ON A.column = B.column, we can do LEFT JOIN ON A.column <= B.column for one row in table A to match to multiple rows in B. DuckDB has a blog post that outlines this join in detail, including fast implementation.

+

The concept of LIST columns

+

DuckDB has first class support for LIST columns - that is, each row in a LIST column can have a varying length (much like a Python list), but must have the exact same datatype (like R’s vector). Using list columns allow us to eschew the use of an additional GROUP BY operation on top of a WHERE filter or SELECT DISTINCT operation, since we can directly perform those on the LIST column itself.

+

Date algebra

+

Dates can be rather difficult to handle well in most tools and languages, with several packages purpose built to make handling them easier - lubridate from the tidyverse is a stellar example. Thankfully, DuckDB provides a similar swiss-knife set of tools to deal with it, including specifying INTERVALs (a special data type that represent a period of time independent of specific time values) to modify TIMESTAMP values using addition or subtraction.

+

Tell me the query, PLEASE!

+

Okay - had a lot of background. Let’s have at it! The query by itself in SQL is (see immediately below for runnable code in Python):

+ + + + + +
 1SELECT
+ 2     A.arrival_time
+ 3    ,A.departure_time
+ 4    ,A.window_open
+ 5    ,A.window_close
+ 6    ,LIST_DISTINCT(LIST(B.ID)) AS docked_trucks
+ 7    ,LIST_UNIQUE(LIST(B.ID))   AS docked_truck_count
+ 8
+ 9FROM (
+10    SELECT *
+11        ,arrival_time   - (INTERVAL 1 MINUTE) AS window_open
+12        ,departure_time + (INTERVAL 1 MINUTE) AS window_close
+13    FROM data) A
+14
+15LEFT JOIN (
+16    SELECT *
+17        ,DATEDIFF('seconds', arrival_time, departure_time) AS duration
+18    FROM data) B
+19
+20ON ((B.arrival_time <= A.window_open AND 
+21    	(B.arrival_time   + TO_SECONDS(B.duration)) >=  A.window_open) OR
+22    (B.arrival_time >= A.window_open AND 
+23                                  B.departure_time  <= A.window_close) OR
+24    (B.arrival_time >= A.window_open AND
+25    	(B.departure_time - TO_SECONDS(B.duration)) <= A.window_close))
+26GROUP BY 1, 2, 3, 4

A small, succinct query such as this will need a bit of explanation to take it all in. Here’s one below, reproducible in Python (make sure to install duckdb first!). Expand it to view.

+
SQL with explanation. + + + + + +
 1import duckdb as db
+ 2db.query("""
+ 3    SELECT
+ 4        A.arrival_time
+ 5        ,A.departure_time
+ 6        ,A.window_open
+ 7        ,A.window_close
+ 8        -- LIST aggregates the values into a LIST column
+ 9        -- and LIST_DISTINCT finds the unique values in it
+10        ,LIST_DISTINCT(LIST(B.ID)) AS docked_trucks
+11        -- finally, LIST_UNIQUE calculates the unique number of values in it
+12        ,LIST_UNIQUE(LIST(B.ID))   AS docked_truck_count
+13
+14    FROM (
+15        SELECT
+16            *
+17            ,arrival_time   - (INTERVAL 1 MINUTE) AS window_open
+18            ,departure_time + (INTERVAL 1 MINUTE) AS window_close
+19        FROM data -- remember we defined data as the Polars DataFrame with our truck station data
+20    ) A
+21
+22    LEFT JOIN (
+23        SELECT
+24            *
+25            -- This is the time, in seconds between the arrival and departure of
+26            -- each truck PER ROW in the original data-frame 
+27            ,DATEDIFF('seconds', arrival_time, departure_time) AS duration
+28        FROM data -- this is where we perform a self-join
+29    ) B
+30
+31    ON (
+32        -- Case 2 in the diagram;
+33        (B.arrival_time <= A.window_open AND 
+34            -- Adding the duration here makes sure that the second interval
+35            -- is at least ENDING AFTER the start of the overlap window
+36            (B.arrival_time   + TO_SECONDS(B.duration)) >=  A.window_open) OR
+37
+38        -- Case 3 in the diagram - the simplest of all five cases
+39        (B.arrival_time >= A.window_open AND 
+40                                      B.departure_time  <= A.window_close) OR
+41
+42        -- Case 4 in the digram;
+43        (B.arrival_time >= A.window_open AND
+44            -- Subtracting the duration here makes sure that the second interval
+45            -- STARTS BEFORE the end of the overlap window.
+46            (B.departure_time - TO_SECONDS(B.duration)) <= A.window_close)
+47    )
+48    GROUP BY 1, 2, 3, 4
+49""")
+

The output of this query is:

+ + + + + +
"""
+┌─────────────────────┬─────────────────────┬─────────────────────┬───┬──────────────────┬────────────────────┐
+│    arrival_time     │   departure_time    │     window_open     │ … │  docked_trucks   │ docked_truck_count │
+│      timestamp      │      timestamp      │      timestamp      │   │    varchar[]     │       uint64       │
+├─────────────────────┼─────────────────────┼─────────────────────┼───┼──────────────────┼────────────────────┤
+│ 2023-01-01 06:23:47 │ 2023-01-01 06:25:08 │ 2023-01-01 06:22:47 │ … │ [A1]             │                  1 │
+│ 2023-01-01 06:26:42 │ 2023-01-01 06:28:02 │ 2023-01-01 06:25:42 │ … │ [A1]             │                  1 │
+│ 2023-01-01 06:30:20 │ 2023-01-01 06:35:01 │ 2023-01-01 06:29:20 │ … │ [B3, C3, A6, A5] │                  4 │
+│ 2023-01-01 06:32:06 │ 2023-01-01 06:33:48 │ 2023-01-01 06:31:06 │ … │ [B3, C3, A6, A5] │                  4 │
+│ 2023-01-01 06:33:09 │ 2023-01-01 06:36:01 │ 2023-01-01 06:32:09 │ … │ [B3, C3, A6, A5] │                  4 │
+│ 2023-01-01 06:34:08 │ 2023-01-01 06:39:49 │ 2023-01-01 06:33:08 │ … │ [B3, C3, A6, A5] │                  4 │
+│ 2023-01-01 06:36:40 │ 2023-01-01 06:38:34 │ 2023-01-01 06:35:40 │ … │ [A5, A6, C3, B3] │                  4 │
+│ 2023-01-01 06:37:43 │ 2023-01-01 06:40:48 │ 2023-01-01 06:36:43 │ … │ [A5, A6, C3]     │                  3 │
+│ 2023-01-01 06:39:48 │ 2023-01-01 06:46:10 │ 2023-01-01 06:38:48 │ … │ [A6, A5, C3]     │                  3 │
+├─────────────────────┴─────────────────────┴─────────────────────┴───┴──────────────────┴────────────────────┤
+│ 9 rows                                                                                  6 columns (5 shown) │
+└─────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
+"""

We clearly see the strengths of DuckDB in how succintly we were able to express this operation. We also find how DuckDB is able to seamlessly integrate with an existing Pandas or Polars pipeline with zero-conversion costs. In fact, we can convert this back to a Polars or Pandas dataframe by appending the ending bracket with db.query(...).pl() and db.query(...).pd() respectively.

+

Can we make the SQL simpler?

+

Now that we’ve understood the logic that goes into the query, let’s try to optimize the algorithm. We have the three conditions:

+ + + + + +
1-- Case 2 in the diagram
+2(B.arrival_time <= A.window_open AND 
+3    (B.arrival_time   + TO_SECONDS(B.duration)) >=  A.window_open) OR
+4-- Case 3 in the diagram
+5(B.arrival_time >= A.window_open AND 
+6                              B.departure_time  <= A.window_close) OR
+7-- Case 4 in the diagram
+8(B.arrival_time >= A.window_open AND
+9    (B.departure_time - TO_SECONDS(B.duration)) <= A.window_close)

What is common between these three conditions? It takes a while to see it; but it becomes clear that all these cases require the start of the overlap to be before the window ends, and the end of the overlap to be after the window starts. This can be simplified to just:

+ + + + + +
1B.arrival_time   <= A.window_close AND
+2B.departure_time >= A.window_open

making our query much simpler!

+

Simplified SQL: Part 1

+

We’ve removed the need for the duration calculation algother now. Therefore, we can write:

+ + + + + +
 1SELECT
+ 2     A.arrival_time
+ 3    ,A.departure_time
+ 4    ,A.window_open
+ 5    ,A.window_close
+ 6    ,LIST_DISTINCT(LIST(B.ID)) AS docked_trucks
+ 7    ,LIST_UNIQUE(LIST(B.ID))   AS docked_truck_count
+ 8
+ 9FROM (
+10    SELECT *
+11        ,arrival_time   - (INTERVAL 1 MINUTE) AS window_open
+12        ,departure_time + (INTERVAL 1 MINUTE) AS window_close
+13    FROM data) A
+14
+15LEFT JOIN data B
+16
+17ON (
+18    B.arrival_time   <= A.window_close AND
+19    B.departure_time >= A.window_open
+20)
+21GROUP BY 1, 2, 3, 4

Can we simplify this even further?

+

Simplification: Part 2

+

I think the SQL query in the above section is very easy to ready already. However, it is a little clunky overall, and there is a way that we can leverage DuckDB’s extensive optimizations to simplify our legibility by rewriting the query as a cross join:

+ + + + + +
 1SELECT
+ 2    A.arrival_time
+ 3    ,A.departure_time
+ 4    ,A.arrival_time - (INTERVAL 1 MINUTE)   AS window_open
+ 5    ,A.departure_time + (INTERVAL 1 MINUTE) AS window_close
+ 6    ,LIST_DISTINCT(LIST(B.ID)) AS docked_trucks
+ 7    ,LIST_UNIQUE(LIST(B.ID))   AS docked_truck_count
+ 8FROM  data A, data B
+ 9WHERE B.arrival_time   <= window_close
+10AND   B.departure_time >= window_open
+11GROUP BY 1, 2, 3, 4

Why does this work? Before optimization on DuckDB, this is what the query plan looks like:

+
DuckDB query plan before optimization + + + + + +
 1"""
+ 2┌───────────────────────────┐                             
+ 3│         PROJECTION        │                             
+ 4│   ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─   │                             
+ 5│             0             │                             
+ 6│             1             │                             
+ 7│             2             │                             
+ 8│             3             │                             
+ 9│       docked_trucks       │                             
+10│     docked_truck_count    │                             
+11└─────────────┬─────────────┘                                                          
+12┌─────────────┴─────────────┐                             
+13│         AGGREGATE         │                             
+14│   ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─   │                             
+15│        arrival_time       │                             
+16│       departure_time      │                             
+17│        window_open        │                             
+18│        window_close       │                             
+19│          list(ID)         │                             
+20└─────────────┬─────────────┘                                                          
+21┌─────────────┴─────────────┐                             
+22│           FILTER          │                             
+23│   ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─   │                             
+24│     (arrival_time <=      │                             
+25│(departure_time + to_m...  │                             
+26│        AS BIGINT))))      │                             
+27│    (departure_time >=     │                             
+28│(arrival_time - to_min...  │                             
+29│        AS BIGINT))))      │                             
+30└─────────────┬─────────────┘                                                          
+31┌─────────────┴─────────────┐                             
+32│       CROSS_PRODUCT       ├──────────────┐              
+33└─────────────┬─────────────┘              │                                           
+34┌─────────────┴─────────────┐┌─────────────┴─────────────┐
+35│         ARROW_SCAN        ││         ARROW_SCAN        │
+36└───────────────────────────┘└───────────────────────────┘ 
+37"""                            
+

After optimization, the CROSS_PRODUCT is automatically optimized to an interval join!

+
DuckDB query after before optimization + + + + + +
 1"""
+ 2┌───────────────────────────┐                             
+ 3│         PROJECTION        │                             
+ 4│   ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─   │                             
+ 5│             0             │                             
+ 6│             1             │                             
+ 7│             2             │                             
+ 8│             3             │                             
+ 9│       docked_trucks       │                             
+10│     docked_truck_count    │                             
+11└─────────────┬─────────────┘                                                          
+12┌─────────────┴─────────────┐                             
+13│         AGGREGATE         │                             
+14│   ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─   │                             
+15│        arrival_time       │                             
+16│       departure_time      │                             
+17│        window_open        │                             
+18│        window_close       │                             
+19│          list(ID)         │                             
+20└─────────────┬─────────────┘                                                          
+21┌─────────────┴─────────────┐                             
+22│      COMPARISON_JOIN      │                             
+23│   ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─   │                             
+24│           INNER           │                             
+25│ ((departure_time + '00:01 │                             
+26│     :00'::INTERVAL) >=    ├──────────────┐              
+27│        arrival_time)      │              │              
+28│((arrival_time - '00:01:00'│              │              
+29│       ::INTERVAL) <=      │              │              
+30│       departure_time)     │              │              
+31└─────────────┬─────────────┘              │                                           
+32┌─────────────┴─────────────┐┌─────────────┴─────────────┐
+33│         ARROW_SCAN        ││         ARROW_SCAN        │
+34└───────────────────────────┘└───────────────────────────┘
+35"""                      
+

So in effect, we’re actually exploiting a feature of DuckDB to allow us to write our queries in a suboptimal manner for greater readability, and allowing the optmizer to do a good chunk of our work for us. I wouldn’t recommend using this generally, because not all SQL engine optmizers will be able to find an efficient route to these calculations for large datasets.

+

How to get query plans?

+

I’m glad you asked. Here’s the DuckDB page explaining EXPLAIN (heh). Here’s the code I used:

+ + + + + +
 1import duckdb as db
+ 2db.sql("SET EXPLAIN_OUTPUT='all';")
+ 3print(db.query("""
+ 4EXPLAIN
+ 5SELECT
+ 6    A.arrival_time
+ 7    ,A.departure_time
+ 8    ,A.arrival_time - (INTERVAL 1 MINUTE) AS window_open
+ 9    ,A.departure_time + (INTERVAL 1 MINUTE) AS window_close
+10    ,LIST_DISTINCT(LIST(B.ID)) AS docked_trucks
+11    ,LIST_UNIQUE(LIST(B.ID))   AS docked_truck_count
+12FROM  data A, data B
+13WHERE B.arrival_time   <= window_close
+14AND   B.departure_time >= window_open
+15GROUP BY 1, 2, 3, 4
+16""").pl()[1, 1])

What are the alternatives?

+

The data.table way

+

data.table is a package that has historically been ahead of its time - in both speed and features that it has had. Developement has taken a hit recently, but will likely pick back up. It’s my favourite package on all fronts for data manipulation, but suffers simply from the lack of broader R support across the ML and DL space.

+

The foverlaps function

+

If this kind of overlapping join is common, shouldn’t someone have developed a package for it? Turns out, data.table has, and with very specific constraints that make it the perfect solution to our problem (if you don’t mind switching over to R, that is).

+

The foverlaps function has these requirements:

+
    +
  1. The input data.table objects have to be keyed for automatic recognition of columns.
  2. +
  3. The default match type is that it matches all three cases from the image above. Side note: it also has matches for within overlap, matching start and end windows,
  4. +
  5. The last two matching columns in the join condition in by must specify the start and end points of the overlapping window. This isn’t a problem for us now, but does restrict for future uses where we may want non-equi joins on other cases.
  6. +
+

The code, si, the code!

+

Without further ado:

+ + + + + +
 1library(data.table)
+ 2library(lubridate)
+ 3
+ 4######### BOILERPLATE CODE, NO LOGIC HERE ####################
+ 5arrival_time = as_datetime(c(
+ 6  '2023-01-01 06:23:47.000000', '2023-01-01 06:26:42.000000',
+ 7  '2023-01-01 06:30:20.000000', '2023-01-01 06:32:06.000000',
+ 8  '2023-01-01 06:33:09.000000', '2023-01-01 06:34:08.000000',
+ 9  '2023-01-01 06:36:40.000000', '2023-01-01 06:37:43.000000',
+10  '2023-01-01 06:39:48.000000'))
+11departure_time = as_datetime(c(
+12  '2023-01-01 06:25:08.000000', '2023-01-01 06:28:02.000000',
+13  '2023-01-01 06:35:01.000000', '2023-01-01 06:33:48.000000',
+14  '2023-01-01 06:36:01.000000', '2023-01-01 06:39:49.000000',
+15  '2023-01-01 06:38:34.000000', '2023-01-01 06:40:48.000000',
+16  '2023-01-01 06:46:10.000000'))
+17ID = c('A1', 'A1', 'A5', 'A6', 'B3', 'C3', 'A6', 'A5', 'A6')
+18
+19DT = data.table(
+20  arrival_time = arrival_time,
+21  departure_time = departure_time,
+22  ID = ID)
+23######### BOILERPLATE CODE, NO LOGIC HERE ####################
+24
+25# A copy(DT) creates a copy of a data.table that isn't linked
+26# to the original one, so that changes in it don't reflect in
+27# the original DT object.
+28# The `:=` allow assignment by reference (i.e. "in place").
+29DT_with_windows = copy(DT)[, `:=`(
+30  window_start   = arrival_time   - minutes(1),
+31  window_end = departure_time + minutes(1))]
+32
+33# This step is necessary for the second table, but not the first, but we
+34# key both data.tables to make the foverlap code very succinct.
+35setkeyv(DT, c("arrival_time", "departure_time"))
+36setkeyv(DT_with_windows, c("window_start", "window_end"))
+37
+38# The foverlap function returns a data.table, so we can simply apply
+39# the usual data.table syntax on it!
+40# Since we have the same name of some columns in both data.tables,
+41# the latter table's columns are prefixed with "i." to avoid conflicts.
+42foverlaps(DT, DT_with_windows)[
+43  , .(docked_trucks = list(unique(i.ID)),
+44      docked_truck_count = uniqueN(i.ID))
+45  , .(arrival_time, departure_time)]

provides us the output:

+ + + + + +
 1          arrival_time      departure_time docked_trucks docked_truck_count
+ 2                <POSc>              <POSc>        <list>              <int>
+ 31: 2023-01-01 06:23:47 2023-01-01 06:25:08            A1                  1
+ 42: 2023-01-01 06:26:42 2023-01-01 06:28:02            A1                  1
+ 53: 2023-01-01 06:30:20 2023-01-01 06:35:01   A5,A6,B3,C3                  4
+ 64: 2023-01-01 06:32:06 2023-01-01 06:33:48   A5,A6,B3,C3                  4
+ 75: 2023-01-01 06:33:09 2023-01-01 06:36:01   A5,A6,B3,C3                  4
+ 86: 2023-01-01 06:34:08 2023-01-01 06:39:49   A5,A6,B3,C3                  4
+ 97: 2023-01-01 06:36:40 2023-01-01 06:38:34   B3,C3,A6,A5                  4
+108: 2023-01-01 06:37:43 2023-01-01 06:40:48      C3,A6,A5                  3
+119: 2023-01-01 06:39:48 2023-01-01 06:46:10      C3,A5,A6                  3

Considerations for using data.table

+

The package offers a wonderful, nearly one-stop solution that doesn’t require you to write the logic out for the query or command yourself, but has a major problem for a lot of users - it requires you to switch your codebase to R, and a lot of your tasks may be on Python or in an SQL pipeline. So, what do you do?

+

Consider the effort in maintaining an additional dependency for your analytics pipeline (i.e. R), and the effort that you’ll need to invest to run R from Python, or run an R script in your pipeline and pull the output from it back into the pipeline, and make your call.

+]]>
\ No newline at end of file diff --git a/public/original.min.css b/public/original.min.css new file mode 100644 index 0000000..f10e29a --- /dev/null +++ b/public/original.min.css @@ -0,0 +1 @@ +code{text-size-adjust:100%;-ms-text-size-adjust:100%;-moz-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{font-family:Verdana,sans-serif;margin:auto;padding:20px;max-width:720px;text-align:left;background-color:#1d1f27;word-wrap:break-word;overflow-wrap:break-word;line-height:1.5;color:#c9d1d9}h1,h2,h3,h4,h5,h6,strong,b{color:#eee}a{color:#8cc2dd}.title{text-decoration:none;border:0}.title h1{font-size:24px;margin:19.92px 0}.title span{font-weight:400}nav a{margin-right:10px}textarea{background-color:#252525;color:#ddd;width:100%;font-size:16px}input{background-color:#252525;color:#ddd;font-size:16px}content{line-height:1.6}table{width:100%}table,th,td{border:1px solid;border-collapse:collapse;border-color:#c9d1d9;padding:5px}img{max-width:100%;height:auto}code{padding:2px 5px;color:#f8f8f2;background-color:#282a36}pre code{display:block;padding:20px;white-space:pre-wrap;font-size:14px;overflow-x:auto;text-wrap:nowrap}blockquote{border-left:1px solid #999;color:#ccc;padding-left:20px;font-style:italic}footer{padding:25px;text-align:center}.helptext{color:#aaa;font-size:small}.errorlist{color:#eba613;font-size:small}ul.blog-posts{list-style-type:none;padding:unset}ul.blog-posts li{display:flex;margin-bottom:10px}ul.blog-posts li span{flex:0 0 130px}ul.blog-posts li a:visited{color:#8b6fcb}a.blog-tags{line-height:2;margin-right:12px}h3.blog-filter{margin-bottom:0}.disabled{color:currentColor;cursor:not-allowed;opacity:.7}p.byline{font-style:italic}.skip-link{position:absolute;top:5;transform:translateY(-600%);transition:transform .5s;background-color:#1d1f27;padding:6px}.skip-link:focus{transform:translateY(0%)}figure{margin-inline-start:0;margin-inline-end:0}figcaption>p{margin-block-start:0;text-align:center;font-style:italic;color:#ccc} \ No newline at end of file diff --git a/public/posts/001_overlap_joins/index.html b/public/posts/001_overlap_joins/index.html new file mode 100644 index 0000000..fd9ca39 --- /dev/null +++ b/public/posts/001_overlap_joins/index.html @@ -0,0 +1,562 @@ + + + + + + + +Overlap Joins | Avinash's Blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +

Avinash's Blog

+ +
+
+ +

Overlap Joins

+ + + +

Premise

+

I stumbled upon an interesting Stackoverflow question that was linked via an issue on Polars github repo. The OP asked for a pure Polars solution. At the time of answering the question Polars did not have support for non-equi joins, and any solution using it would be pretty cumbersome.

+

I’m more of a right-tool-for-the-job person, so I tried to find a better solution.

+

Problem Statement

+

Suppose we have a dataset that captures the arrival and departure times of trucks at a station, along with the truck’s ID.

+ + + + + +
 1import polars as pl # if you don't have polars, run 
+ 2                    # pip install 'polars[all]'
+ 3data = pl.from_repr("""
+ 4┌─────────────────────┬─────────────────────┬─────┐
+ 5│ arrival_time        ┆ departure_time      ┆ ID  │
+ 6│ ---                 ┆ ---                 ┆ --- │
+ 7│ datetime[μs]        ┆ datetime[μs]        ┆ str │
+ 8╞═════════════════════╪═════════════════════╪═════╡
+ 9│ 2023-01-01 06:23:47 ┆ 2023-01-01 06:25:08 ┆ A1  │
+10│ 2023-01-01 06:26:42 ┆ 2023-01-01 06:28:02 ┆ A1  │
+11│ 2023-01-01 06:30:20 ┆ 2023-01-01 06:35:01 ┆ A5  │
+12│ 2023-01-01 06:32:06 ┆ 2023-01-01 06:33:48 ┆ A6  │
+13│ 2023-01-01 06:33:09 ┆ 2023-01-01 06:36:01 ┆ B3  │
+14│ 2023-01-01 06:34:08 ┆ 2023-01-01 06:39:49 ┆ C3  │
+15│ 2023-01-01 06:36:40 ┆ 2023-01-01 06:38:34 ┆ A6  │
+16│ 2023-01-01 06:37:43 ┆ 2023-01-01 06:40:48 ┆ A5  │
+17│ 2023-01-01 06:39:48 ┆ 2023-01-01 06:46:10 ┆ A6  │
+18└─────────────────────┴─────────────────────┴─────┘
+19""")

We want to identify the number of trucks docked at any given time within a threshold of 1 minute prior to the arrival time of a truck, and 1 minute after the departure of a truck. Equivalently, this means that we need to calculate the number of trucks within a specific window for each row of the data.

+

Finding a solution to the problem

+

Evaluate for a specific row

+

Before we find a general solution to this problem, let’s consider a specific row to understand the problem better:

+ + + + + +
1"""
+2┌─────────────────────┬─────────────────────┬─────┐
+3│ arrival_time        ┆ departure_time      ┆ ID  │
+4│ ---                 ┆ ---                 ┆ --- │
+5│ datetime[μs]        ┆ datetime[μs]        ┆ str │
+6╞═════════════════════╪═════════════════════╪═════╡
+7│ 2023-01-01 06:32:06 ┆ 2023-01-01 06:33:48 ┆ A6  │
+8└─────────────────────┴─────────────────────┴─────┘
+9"""

For this row, we need to find the number of trucks that are there between 2023-01-01 06:31:06 (1 minute prior to the arrival_time and 2023-01-01 06:34:48 (1 minute post the departure_time). Manually going through the original dataset, we see that B3, C3, A6 and A5 are the truck IDs that qualify - they all are at the station in a duration that is between 2023-01-01 06:31:06 and 2023-01-01 06:34:48.

+

Visually deriving an algorithm

+

There are many cases that will qualify a truck to be present in the overlap window defined by a particular row. Specifically for the example above, we have (this visualization is generalizable, because for each row we can calculate without much difficulty the overlap window relative to the arrival and departure times):

+

The five different ways a period can overlap.

+

Take some time to absorb these cases - it’s important for the part where we write the code for the solution. Note that we need to actually tell our algorithm to filter only for Cases 2, 3 and 4, since Cases 1 and 5 will not satisfy our requirements.

+

Writing an SQL query based on the algorithm

+

In theory, we can use any language that has the capability to define rules that meet our algorithmic requirements outlined in the above section to find the solution. Why choose SQL? It’s often able to convey elegantly the logic that was used to execute the algorithm; and while it does come with excessive verbosity at times, it doesn’t quite in this case.

+

Note here that we run SQL in Python with almost no setup or boilerplate code - so this is a Python based solution as well (although not quite Pythonic!).

+

Introducing the DuckDB package

+

Once again, in theory, any SQL package or language can be used. Far too few however meet the ease-of-use that DuckDB provides:

+
    +
  1. no expensive set-up time (meaning no need for setting up databases, even temporary ones),
  2. +
  3. no dependencies (other than DuckDB itself, just pip install duckdb),
  4. +
  5. some very friendly SQL extensions, and
  6. +
  7. ability to work directly on Polars and Pandas DataFrames without conversions
  8. +
+

all with mind-blowing speed that stands shoulder-to-shoulder with Polars. We’ll also use a few advanced SQL concepts noted below.

+

Self-joins

+

This should be a familiar, albeit not often used concept - a join of a table with itself is a self join. There are few cases where such an operation would make sense, and this happens to be one of them.

+

A bullet train recap of non-equi joins

+

A key concept that we’ll use is the idea of joining on a range of values rather than a specific value. That is, instead of the usual LEFT JOIN ON A.column = B.column, we can do LEFT JOIN ON A.column <= B.column for one row in table A to match to multiple rows in B. DuckDB has a blog post that outlines this join in detail, including fast implementation.

+

The concept of LIST columns

+

DuckDB has first class support for LIST columns - that is, each row in a LIST column can have a varying length (much like a Python list), but must have the exact same datatype (like R’s vector). Using list columns allow us to eschew the use of an additional GROUP BY operation on top of a WHERE filter or SELECT DISTINCT operation, since we can directly perform those on the LIST column itself.

+

Date algebra

+

Dates can be rather difficult to handle well in most tools and languages, with several packages purpose built to make handling them easier - lubridate from the tidyverse is a stellar example. Thankfully, DuckDB provides a similar swiss-knife set of tools to deal with it, including specifying INTERVALs (a special data type that represent a period of time independent of specific time values) to modify TIMESTAMP values using addition or subtraction.

+

Tell me the query, PLEASE!

+

Okay - had a lot of background. Let’s have at it! The query by itself in SQL is (see immediately below for runnable code in Python):

+ + + + + +
 1SELECT
+ 2     A.arrival_time
+ 3    ,A.departure_time
+ 4    ,A.window_open
+ 5    ,A.window_close
+ 6    ,LIST_DISTINCT(LIST(B.ID)) AS docked_trucks
+ 7    ,LIST_UNIQUE(LIST(B.ID))   AS docked_truck_count
+ 8
+ 9FROM (
+10    SELECT *
+11        ,arrival_time   - (INTERVAL 1 MINUTE) AS window_open
+12        ,departure_time + (INTERVAL 1 MINUTE) AS window_close
+13    FROM data) A
+14
+15LEFT JOIN (
+16    SELECT *
+17        ,DATEDIFF('seconds', arrival_time, departure_time) AS duration
+18    FROM data) B
+19
+20ON ((B.arrival_time <= A.window_open AND 
+21    	(B.arrival_time   + TO_SECONDS(B.duration)) >=  A.window_open) OR
+22    (B.arrival_time >= A.window_open AND 
+23                                  B.departure_time  <= A.window_close) OR
+24    (B.arrival_time >= A.window_open AND
+25    	(B.departure_time - TO_SECONDS(B.duration)) <= A.window_close))
+26GROUP BY 1, 2, 3, 4

A small, succinct query such as this will need a bit of explanation to take it all in. Here’s one below, reproducible in Python (make sure to install duckdb first!). Expand it to view.

+
SQL with explanation. + + + + + +
 1import duckdb as db
+ 2db.query("""
+ 3    SELECT
+ 4        A.arrival_time
+ 5        ,A.departure_time
+ 6        ,A.window_open
+ 7        ,A.window_close
+ 8        -- LIST aggregates the values into a LIST column
+ 9        -- and LIST_DISTINCT finds the unique values in it
+10        ,LIST_DISTINCT(LIST(B.ID)) AS docked_trucks
+11        -- finally, LIST_UNIQUE calculates the unique number of values in it
+12        ,LIST_UNIQUE(LIST(B.ID))   AS docked_truck_count
+13
+14    FROM (
+15        SELECT
+16            *
+17            ,arrival_time   - (INTERVAL 1 MINUTE) AS window_open
+18            ,departure_time + (INTERVAL 1 MINUTE) AS window_close
+19        FROM data -- remember we defined data as the Polars DataFrame with our truck station data
+20    ) A
+21
+22    LEFT JOIN (
+23        SELECT
+24            *
+25            -- This is the time, in seconds between the arrival and departure of
+26            -- each truck PER ROW in the original data-frame 
+27            ,DATEDIFF('seconds', arrival_time, departure_time) AS duration
+28        FROM data -- this is where we perform a self-join
+29    ) B
+30
+31    ON (
+32        -- Case 2 in the diagram;
+33        (B.arrival_time <= A.window_open AND 
+34            -- Adding the duration here makes sure that the second interval
+35            -- is at least ENDING AFTER the start of the overlap window
+36            (B.arrival_time   + TO_SECONDS(B.duration)) >=  A.window_open) OR
+37
+38        -- Case 3 in the diagram - the simplest of all five cases
+39        (B.arrival_time >= A.window_open AND 
+40                                      B.departure_time  <= A.window_close) OR
+41
+42        -- Case 4 in the digram;
+43        (B.arrival_time >= A.window_open AND
+44            -- Subtracting the duration here makes sure that the second interval
+45            -- STARTS BEFORE the end of the overlap window.
+46            (B.departure_time - TO_SECONDS(B.duration)) <= A.window_close)
+47    )
+48    GROUP BY 1, 2, 3, 4
+49""")
+

The output of this query is:

+ + + + + +
"""
+┌─────────────────────┬─────────────────────┬─────────────────────┬───┬──────────────────┬────────────────────┐
+│    arrival_time     │   departure_time    │     window_open     │ … │  docked_trucks   │ docked_truck_count │
+│      timestamp      │      timestamp      │      timestamp      │   │    varchar[]     │       uint64       │
+├─────────────────────┼─────────────────────┼─────────────────────┼───┼──────────────────┼────────────────────┤
+│ 2023-01-01 06:23:47 │ 2023-01-01 06:25:08 │ 2023-01-01 06:22:47 │ … │ [A1]             │                  1 │
+│ 2023-01-01 06:26:42 │ 2023-01-01 06:28:02 │ 2023-01-01 06:25:42 │ … │ [A1]             │                  1 │
+│ 2023-01-01 06:30:20 │ 2023-01-01 06:35:01 │ 2023-01-01 06:29:20 │ … │ [B3, C3, A6, A5] │                  4 │
+│ 2023-01-01 06:32:06 │ 2023-01-01 06:33:48 │ 2023-01-01 06:31:06 │ … │ [B3, C3, A6, A5] │                  4 │
+│ 2023-01-01 06:33:09 │ 2023-01-01 06:36:01 │ 2023-01-01 06:32:09 │ … │ [B3, C3, A6, A5] │                  4 │
+│ 2023-01-01 06:34:08 │ 2023-01-01 06:39:49 │ 2023-01-01 06:33:08 │ … │ [B3, C3, A6, A5] │                  4 │
+│ 2023-01-01 06:36:40 │ 2023-01-01 06:38:34 │ 2023-01-01 06:35:40 │ … │ [A5, A6, C3, B3] │                  4 │
+│ 2023-01-01 06:37:43 │ 2023-01-01 06:40:48 │ 2023-01-01 06:36:43 │ … │ [A5, A6, C3]     │                  3 │
+│ 2023-01-01 06:39:48 │ 2023-01-01 06:46:10 │ 2023-01-01 06:38:48 │ … │ [A6, A5, C3]     │                  3 │
+├─────────────────────┴─────────────────────┴─────────────────────┴───┴──────────────────┴────────────────────┤
+│ 9 rows                                                                                  6 columns (5 shown) │
+└─────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
+"""

We clearly see the strengths of DuckDB in how succintly we were able to express this operation. We also find how DuckDB is able to seamlessly integrate with an existing Pandas or Polars pipeline with zero-conversion costs. In fact, we can convert this back to a Polars or Pandas dataframe by appending the ending bracket with db.query(...).pl() and db.query(...).pd() respectively.

+

Can we make the SQL simpler?

+

Now that we’ve understood the logic that goes into the query, let’s try to optimize the algorithm. We have the three conditions:

+ + + + + +
1-- Case 2 in the diagram
+2(B.arrival_time <= A.window_open AND 
+3    (B.arrival_time   + TO_SECONDS(B.duration)) >=  A.window_open) OR
+4-- Case 3 in the diagram
+5(B.arrival_time >= A.window_open AND 
+6                              B.departure_time  <= A.window_close) OR
+7-- Case 4 in the diagram
+8(B.arrival_time >= A.window_open AND
+9    (B.departure_time - TO_SECONDS(B.duration)) <= A.window_close)

What is common between these three conditions? It takes a while to see it; but it becomes clear that all these cases require the start of the overlap to be before the window ends, and the end of the overlap to be after the window starts. This can be simplified to just:

+ + + + + +
1B.arrival_time   <= A.window_close AND
+2B.departure_time >= A.window_open

making our query much simpler!

+

Simplified SQL: Part 1

+

We’ve removed the need for the duration calculation algother now. Therefore, we can write:

+ + + + + +
 1SELECT
+ 2     A.arrival_time
+ 3    ,A.departure_time
+ 4    ,A.window_open
+ 5    ,A.window_close
+ 6    ,LIST_DISTINCT(LIST(B.ID)) AS docked_trucks
+ 7    ,LIST_UNIQUE(LIST(B.ID))   AS docked_truck_count
+ 8
+ 9FROM (
+10    SELECT *
+11        ,arrival_time   - (INTERVAL 1 MINUTE) AS window_open
+12        ,departure_time + (INTERVAL 1 MINUTE) AS window_close
+13    FROM data) A
+14
+15LEFT JOIN data B
+16
+17ON (
+18    B.arrival_time   <= A.window_close AND
+19    B.departure_time >= A.window_open
+20)
+21GROUP BY 1, 2, 3, 4

Can we simplify this even further?

+

Simplification: Part 2

+

I think the SQL query in the above section is very easy to ready already. However, it is a little clunky overall, and there is a way that we can leverage DuckDB’s extensive optimizations to simplify our legibility by rewriting the query as a cross join:

+ + + + + +
 1SELECT
+ 2    A.arrival_time
+ 3    ,A.departure_time
+ 4    ,A.arrival_time - (INTERVAL 1 MINUTE)   AS window_open
+ 5    ,A.departure_time + (INTERVAL 1 MINUTE) AS window_close
+ 6    ,LIST_DISTINCT(LIST(B.ID)) AS docked_trucks
+ 7    ,LIST_UNIQUE(LIST(B.ID))   AS docked_truck_count
+ 8FROM  data A, data B
+ 9WHERE B.arrival_time   <= window_close
+10AND   B.departure_time >= window_open
+11GROUP BY 1, 2, 3, 4

Why does this work? Before optimization on DuckDB, this is what the query plan looks like:

+
DuckDB query plan before optimization + + + + + +
 1"""
+ 2┌───────────────────────────┐                             
+ 3│         PROJECTION        │                             
+ 4│   ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─   │                             
+ 5│             0             │                             
+ 6│             1             │                             
+ 7│             2             │                             
+ 8│             3             │                             
+ 9│       docked_trucks       │                             
+10│     docked_truck_count    │                             
+11└─────────────┬─────────────┘                                                          
+12┌─────────────┴─────────────┐                             
+13│         AGGREGATE         │                             
+14│   ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─   │                             
+15│        arrival_time       │                             
+16│       departure_time      │                             
+17│        window_open        │                             
+18│        window_close       │                             
+19│          list(ID)         │                             
+20└─────────────┬─────────────┘                                                          
+21┌─────────────┴─────────────┐                             
+22│           FILTER          │                             
+23│   ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─   │                             
+24│     (arrival_time <=      │                             
+25│(departure_time + to_m...  │                             
+26│        AS BIGINT))))      │                             
+27│    (departure_time >=     │                             
+28│(arrival_time - to_min...  │                             
+29│        AS BIGINT))))      │                             
+30└─────────────┬─────────────┘                                                          
+31┌─────────────┴─────────────┐                             
+32│       CROSS_PRODUCT       ├──────────────┐              
+33└─────────────┬─────────────┘              │                                           
+34┌─────────────┴─────────────┐┌─────────────┴─────────────┐
+35│         ARROW_SCAN        ││         ARROW_SCAN        │
+36└───────────────────────────┘└───────────────────────────┘ 
+37"""                            
+

After optimization, the CROSS_PRODUCT is automatically optimized to an interval join!

+
DuckDB query after before optimization + + + + + +
 1"""
+ 2┌───────────────────────────┐                             
+ 3│         PROJECTION        │                             
+ 4│   ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─   │                             
+ 5│             0             │                             
+ 6│             1             │                             
+ 7│             2             │                             
+ 8│             3             │                             
+ 9│       docked_trucks       │                             
+10│     docked_truck_count    │                             
+11└─────────────┬─────────────┘                                                          
+12┌─────────────┴─────────────┐                             
+13│         AGGREGATE         │                             
+14│   ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─   │                             
+15│        arrival_time       │                             
+16│       departure_time      │                             
+17│        window_open        │                             
+18│        window_close       │                             
+19│          list(ID)         │                             
+20└─────────────┬─────────────┘                                                          
+21┌─────────────┴─────────────┐                             
+22│      COMPARISON_JOIN      │                             
+23│   ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─   │                             
+24│           INNER           │                             
+25│ ((departure_time + '00:01 │                             
+26│     :00'::INTERVAL) >=    ├──────────────┐              
+27│        arrival_time)      │              │              
+28│((arrival_time - '00:01:00'│              │              
+29│       ::INTERVAL) <=      │              │              
+30│       departure_time)     │              │              
+31└─────────────┬─────────────┘              │                                           
+32┌─────────────┴─────────────┐┌─────────────┴─────────────┐
+33│         ARROW_SCAN        ││         ARROW_SCAN        │
+34└───────────────────────────┘└───────────────────────────┘
+35"""                      
+

So in effect, we’re actually exploiting a feature of DuckDB to allow us to write our queries in a suboptimal manner for greater readability, and allowing the optmizer to do a good chunk of our work for us. I wouldn’t recommend using this generally, because not all SQL engine optmizers will be able to find an efficient route to these calculations for large datasets.

+

How to get query plans?

+

I’m glad you asked. Here’s the DuckDB page explaining EXPLAIN (heh). Here’s the code I used:

+ + + + + +
 1import duckdb as db
+ 2db.sql("SET EXPLAIN_OUTPUT='all';")
+ 3print(db.query("""
+ 4EXPLAIN
+ 5SELECT
+ 6    A.arrival_time
+ 7    ,A.departure_time
+ 8    ,A.arrival_time - (INTERVAL 1 MINUTE) AS window_open
+ 9    ,A.departure_time + (INTERVAL 1 MINUTE) AS window_close
+10    ,LIST_DISTINCT(LIST(B.ID)) AS docked_trucks
+11    ,LIST_UNIQUE(LIST(B.ID))   AS docked_truck_count
+12FROM  data A, data B
+13WHERE B.arrival_time   <= window_close
+14AND   B.departure_time >= window_open
+15GROUP BY 1, 2, 3, 4
+16""").pl()[1, 1])

What are the alternatives?

+

The data.table way

+

data.table is a package that has historically been ahead of its time - in both speed and features that it has had. Developement has taken a hit recently, but will likely pick back up. It’s my favourite package on all fronts for data manipulation, but suffers simply from the lack of broader R support across the ML and DL space.

+

The foverlaps function

+

If this kind of overlapping join is common, shouldn’t someone have developed a package for it? Turns out, data.table has, and with very specific constraints that make it the perfect solution to our problem (if you don’t mind switching over to R, that is).

+

The foverlaps function has these requirements:

+
    +
  1. The input data.table objects have to be keyed for automatic recognition of columns.
  2. +
  3. The default match type is that it matches all three cases from the image above. Side note: it also has matches for within overlap, matching start and end windows,
  4. +
  5. The last two matching columns in the join condition in by must specify the start and end points of the overlapping window. This isn’t a problem for us now, but does restrict for future uses where we may want non-equi joins on other cases.
  6. +
+

The code, si, the code!

+

Without further ado:

+ + + + + +
 1library(data.table)
+ 2library(lubridate)
+ 3
+ 4######### BOILERPLATE CODE, NO LOGIC HERE ####################
+ 5arrival_time = as_datetime(c(
+ 6  '2023-01-01 06:23:47.000000', '2023-01-01 06:26:42.000000',
+ 7  '2023-01-01 06:30:20.000000', '2023-01-01 06:32:06.000000',
+ 8  '2023-01-01 06:33:09.000000', '2023-01-01 06:34:08.000000',
+ 9  '2023-01-01 06:36:40.000000', '2023-01-01 06:37:43.000000',
+10  '2023-01-01 06:39:48.000000'))
+11departure_time = as_datetime(c(
+12  '2023-01-01 06:25:08.000000', '2023-01-01 06:28:02.000000',
+13  '2023-01-01 06:35:01.000000', '2023-01-01 06:33:48.000000',
+14  '2023-01-01 06:36:01.000000', '2023-01-01 06:39:49.000000',
+15  '2023-01-01 06:38:34.000000', '2023-01-01 06:40:48.000000',
+16  '2023-01-01 06:46:10.000000'))
+17ID = c('A1', 'A1', 'A5', 'A6', 'B3', 'C3', 'A6', 'A5', 'A6')
+18
+19DT = data.table(
+20  arrival_time = arrival_time,
+21  departure_time = departure_time,
+22  ID = ID)
+23######### BOILERPLATE CODE, NO LOGIC HERE ####################
+24
+25# A copy(DT) creates a copy of a data.table that isn't linked
+26# to the original one, so that changes in it don't reflect in
+27# the original DT object.
+28# The `:=` allow assignment by reference (i.e. "in place").
+29DT_with_windows = copy(DT)[, `:=`(
+30  window_start   = arrival_time   - minutes(1),
+31  window_end = departure_time + minutes(1))]
+32
+33# This step is necessary for the second table, but not the first, but we
+34# key both data.tables to make the foverlap code very succinct.
+35setkeyv(DT, c("arrival_time", "departure_time"))
+36setkeyv(DT_with_windows, c("window_start", "window_end"))
+37
+38# The foverlap function returns a data.table, so we can simply apply
+39# the usual data.table syntax on it!
+40# Since we have the same name of some columns in both data.tables,
+41# the latter table's columns are prefixed with "i." to avoid conflicts.
+42foverlaps(DT, DT_with_windows)[
+43  , .(docked_trucks = list(unique(i.ID)),
+44      docked_truck_count = uniqueN(i.ID))
+45  , .(arrival_time, departure_time)]

provides us the output:

+ + + + + +
 1          arrival_time      departure_time docked_trucks docked_truck_count
+ 2                <POSc>              <POSc>        <list>              <int>
+ 31: 2023-01-01 06:23:47 2023-01-01 06:25:08            A1                  1
+ 42: 2023-01-01 06:26:42 2023-01-01 06:28:02            A1                  1
+ 53: 2023-01-01 06:30:20 2023-01-01 06:35:01   A5,A6,B3,C3                  4
+ 64: 2023-01-01 06:32:06 2023-01-01 06:33:48   A5,A6,B3,C3                  4
+ 75: 2023-01-01 06:33:09 2023-01-01 06:36:01   A5,A6,B3,C3                  4
+ 86: 2023-01-01 06:34:08 2023-01-01 06:39:49   A5,A6,B3,C3                  4
+ 97: 2023-01-01 06:36:40 2023-01-01 06:38:34   B3,C3,A6,A5                  4
+108: 2023-01-01 06:37:43 2023-01-01 06:40:48      C3,A6,A5                  3
+119: 2023-01-01 06:39:48 2023-01-01 06:46:10      C3,A5,A6                  3

Considerations for using data.table

+

The package offers a wonderful, nearly one-stop solution that doesn’t require you to write the logic out for the query or command yourself, but has a major problem for a lot of users - it requires you to switch your codebase to R, and a lot of your tasks may be on Python or in an SQL pipeline. So, what do you do?

+

Consider the effort in maintaining an additional dependency for your analytics pipeline (i.e. R), and the effort that you’ll need to invest to run R from Python, or run an R script in your pipeline and pull the output from it back into the pipeline, and make your call.

+ +
+

+ +

+ + +

+ + Reply to this post by email ↪ + +

+ + + +
+
+ Avinash Mallya | Made with Bear Cub +
+ + + + + diff --git a/public/posts/index.html b/public/posts/index.html new file mode 100644 index 0000000..33f4182 --- /dev/null +++ b/public/posts/index.html @@ -0,0 +1,106 @@ + + + + + + + +Posts | Avinash's Blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +

Avinash's Blog

+ +
+
+ + + + +
+ +
+ +
+ +
+
+ Avinash Mallya | Made with Bear Cub +
+ + + + + diff --git a/public/posts/index.xml b/public/posts/index.xml new file mode 100644 index 0000000..fc89518 --- /dev/null +++ b/public/posts/index.xml @@ -0,0 +1,463 @@ + + + + Posts on Avinash's Blog + http://localhost:1313/posts/ + Recent content in Posts on Avinash's Blog + Hugo -- gohugo.io + en-US + me@example.com (John Doe) + me@example.com (John Doe) + Avinash Mallya + Thu, 22 Jun 2023 17:27:50 -0400 + + + Overlap Joins + http://localhost:1313/posts/001_overlap_joins/ + Thu, 22 Jun 2023 17:27:50 -0400me@example.com (John Doe) + http://localhost:1313/posts/001_overlap_joins/ + <h1 id="premise">Premise</h1> <p>I stumbled upon an interesting <a href="https://stackoverflow.com/questions/76488314/polars-count-unique-values-over-a-time-period">Stackoverflow question</a> that was linked <a href="https://github.com/pola-rs/polars/issues/9467">via an issue</a> on Polars github repo. The OP asked for a pure Polars solution. At the time of answering the question Polars did not have support for non-equi joins, and any solution using it would be pretty cumbersome.</p> <p>I&rsquo;m more of a right-tool-for-the-job person, so I tried to find a better solution.</p> <h1 id="problem-statement">Problem Statement</h1> <p>Suppose we have a dataset that captures the arrival and departure times of trucks at a station, along with the truck&rsquo;s ID.</p> + Premise +

I stumbled upon an interesting Stackoverflow question that was linked via an issue on Polars github repo. The OP asked for a pure Polars solution. At the time of answering the question Polars did not have support for non-equi joins, and any solution using it would be pretty cumbersome.

+

I’m more of a right-tool-for-the-job person, so I tried to find a better solution.

+

Problem Statement

+

Suppose we have a dataset that captures the arrival and departure times of trucks at a station, along with the truck’s ID.

+ + + + + +
 1import polars as pl # if you don't have polars, run 
+ 2                    # pip install 'polars[all]'
+ 3data = pl.from_repr("""
+ 4┌─────────────────────┬─────────────────────┬─────┐
+ 5│ arrival_time        ┆ departure_time      ┆ ID  │
+ 6│ ---                 ┆ ---                 ┆ --- │
+ 7│ datetime[μs]        ┆ datetime[μs]        ┆ str │
+ 8╞═════════════════════╪═════════════════════╪═════╡
+ 9│ 2023-01-01 06:23:47 ┆ 2023-01-01 06:25:08 ┆ A1  │
+10│ 2023-01-01 06:26:42 ┆ 2023-01-01 06:28:02 ┆ A1  │
+11│ 2023-01-01 06:30:20 ┆ 2023-01-01 06:35:01 ┆ A5  │
+12│ 2023-01-01 06:32:06 ┆ 2023-01-01 06:33:48 ┆ A6  │
+13│ 2023-01-01 06:33:09 ┆ 2023-01-01 06:36:01 ┆ B3  │
+14│ 2023-01-01 06:34:08 ┆ 2023-01-01 06:39:49 ┆ C3  │
+15│ 2023-01-01 06:36:40 ┆ 2023-01-01 06:38:34 ┆ A6  │
+16│ 2023-01-01 06:37:43 ┆ 2023-01-01 06:40:48 ┆ A5  │
+17│ 2023-01-01 06:39:48 ┆ 2023-01-01 06:46:10 ┆ A6  │
+18└─────────────────────┴─────────────────────┴─────┘
+19""")

We want to identify the number of trucks docked at any given time within a threshold of 1 minute prior to the arrival time of a truck, and 1 minute after the departure of a truck. Equivalently, this means that we need to calculate the number of trucks within a specific window for each row of the data.

+

Finding a solution to the problem

+

Evaluate for a specific row

+

Before we find a general solution to this problem, let’s consider a specific row to understand the problem better:

+ + + + + +
1"""
+2┌─────────────────────┬─────────────────────┬─────┐
+3│ arrival_time        ┆ departure_time      ┆ ID  │
+4│ ---                 ┆ ---                 ┆ --- │
+5│ datetime[μs]        ┆ datetime[μs]        ┆ str │
+6╞═════════════════════╪═════════════════════╪═════╡
+7│ 2023-01-01 06:32:06 ┆ 2023-01-01 06:33:48 ┆ A6  │
+8└─────────────────────┴─────────────────────┴─────┘
+9"""

For this row, we need to find the number of trucks that are there between 2023-01-01 06:31:06 (1 minute prior to the arrival_time and 2023-01-01 06:34:48 (1 minute post the departure_time). Manually going through the original dataset, we see that B3, C3, A6 and A5 are the truck IDs that qualify - they all are at the station in a duration that is between 2023-01-01 06:31:06 and 2023-01-01 06:34:48.

+

Visually deriving an algorithm

+

There are many cases that will qualify a truck to be present in the overlap window defined by a particular row. Specifically for the example above, we have (this visualization is generalizable, because for each row we can calculate without much difficulty the overlap window relative to the arrival and departure times):

+

The five different ways a period can overlap.

+

Take some time to absorb these cases - it’s important for the part where we write the code for the solution. Note that we need to actually tell our algorithm to filter only for Cases 2, 3 and 4, since Cases 1 and 5 will not satisfy our requirements.

+

Writing an SQL query based on the algorithm

+

In theory, we can use any language that has the capability to define rules that meet our algorithmic requirements outlined in the above section to find the solution. Why choose SQL? It’s often able to convey elegantly the logic that was used to execute the algorithm; and while it does come with excessive verbosity at times, it doesn’t quite in this case.

+

Note here that we run SQL in Python with almost no setup or boilerplate code - so this is a Python based solution as well (although not quite Pythonic!).

+

Introducing the DuckDB package

+

Once again, in theory, any SQL package or language can be used. Far too few however meet the ease-of-use that DuckDB provides:

+
    +
  1. no expensive set-up time (meaning no need for setting up databases, even temporary ones),
  2. +
  3. no dependencies (other than DuckDB itself, just pip install duckdb),
  4. +
  5. some very friendly SQL extensions, and
  6. +
  7. ability to work directly on Polars and Pandas DataFrames without conversions
  8. +
+

all with mind-blowing speed that stands shoulder-to-shoulder with Polars. We’ll also use a few advanced SQL concepts noted below.

+

Self-joins

+

This should be a familiar, albeit not often used concept - a join of a table with itself is a self join. There are few cases where such an operation would make sense, and this happens to be one of them.

+

A bullet train recap of non-equi joins

+

A key concept that we’ll use is the idea of joining on a range of values rather than a specific value. That is, instead of the usual LEFT JOIN ON A.column = B.column, we can do LEFT JOIN ON A.column <= B.column for one row in table A to match to multiple rows in B. DuckDB has a blog post that outlines this join in detail, including fast implementation.

+

The concept of LIST columns

+

DuckDB has first class support for LIST columns - that is, each row in a LIST column can have a varying length (much like a Python list), but must have the exact same datatype (like R’s vector). Using list columns allow us to eschew the use of an additional GROUP BY operation on top of a WHERE filter or SELECT DISTINCT operation, since we can directly perform those on the LIST column itself.

+

Date algebra

+

Dates can be rather difficult to handle well in most tools and languages, with several packages purpose built to make handling them easier - lubridate from the tidyverse is a stellar example. Thankfully, DuckDB provides a similar swiss-knife set of tools to deal with it, including specifying INTERVALs (a special data type that represent a period of time independent of specific time values) to modify TIMESTAMP values using addition or subtraction.

+

Tell me the query, PLEASE!

+

Okay - had a lot of background. Let’s have at it! The query by itself in SQL is (see immediately below for runnable code in Python):

+ + + + + +
 1SELECT
+ 2     A.arrival_time
+ 3    ,A.departure_time
+ 4    ,A.window_open
+ 5    ,A.window_close
+ 6    ,LIST_DISTINCT(LIST(B.ID)) AS docked_trucks
+ 7    ,LIST_UNIQUE(LIST(B.ID))   AS docked_truck_count
+ 8
+ 9FROM (
+10    SELECT *
+11        ,arrival_time   - (INTERVAL 1 MINUTE) AS window_open
+12        ,departure_time + (INTERVAL 1 MINUTE) AS window_close
+13    FROM data) A
+14
+15LEFT JOIN (
+16    SELECT *
+17        ,DATEDIFF('seconds', arrival_time, departure_time) AS duration
+18    FROM data) B
+19
+20ON ((B.arrival_time <= A.window_open AND 
+21    	(B.arrival_time   + TO_SECONDS(B.duration)) >=  A.window_open) OR
+22    (B.arrival_time >= A.window_open AND 
+23                                  B.departure_time  <= A.window_close) OR
+24    (B.arrival_time >= A.window_open AND
+25    	(B.departure_time - TO_SECONDS(B.duration)) <= A.window_close))
+26GROUP BY 1, 2, 3, 4

A small, succinct query such as this will need a bit of explanation to take it all in. Here’s one below, reproducible in Python (make sure to install duckdb first!). Expand it to view.

+
SQL with explanation. + + + + + +
 1import duckdb as db
+ 2db.query("""
+ 3    SELECT
+ 4        A.arrival_time
+ 5        ,A.departure_time
+ 6        ,A.window_open
+ 7        ,A.window_close
+ 8        -- LIST aggregates the values into a LIST column
+ 9        -- and LIST_DISTINCT finds the unique values in it
+10        ,LIST_DISTINCT(LIST(B.ID)) AS docked_trucks
+11        -- finally, LIST_UNIQUE calculates the unique number of values in it
+12        ,LIST_UNIQUE(LIST(B.ID))   AS docked_truck_count
+13
+14    FROM (
+15        SELECT
+16            *
+17            ,arrival_time   - (INTERVAL 1 MINUTE) AS window_open
+18            ,departure_time + (INTERVAL 1 MINUTE) AS window_close
+19        FROM data -- remember we defined data as the Polars DataFrame with our truck station data
+20    ) A
+21
+22    LEFT JOIN (
+23        SELECT
+24            *
+25            -- This is the time, in seconds between the arrival and departure of
+26            -- each truck PER ROW in the original data-frame 
+27            ,DATEDIFF('seconds', arrival_time, departure_time) AS duration
+28        FROM data -- this is where we perform a self-join
+29    ) B
+30
+31    ON (
+32        -- Case 2 in the diagram;
+33        (B.arrival_time <= A.window_open AND 
+34            -- Adding the duration here makes sure that the second interval
+35            -- is at least ENDING AFTER the start of the overlap window
+36            (B.arrival_time   + TO_SECONDS(B.duration)) >=  A.window_open) OR
+37
+38        -- Case 3 in the diagram - the simplest of all five cases
+39        (B.arrival_time >= A.window_open AND 
+40                                      B.departure_time  <= A.window_close) OR
+41
+42        -- Case 4 in the digram;
+43        (B.arrival_time >= A.window_open AND
+44            -- Subtracting the duration here makes sure that the second interval
+45            -- STARTS BEFORE the end of the overlap window.
+46            (B.departure_time - TO_SECONDS(B.duration)) <= A.window_close)
+47    )
+48    GROUP BY 1, 2, 3, 4
+49""")
+

The output of this query is:

+ + + + + +
"""
+┌─────────────────────┬─────────────────────┬─────────────────────┬───┬──────────────────┬────────────────────┐
+│    arrival_time     │   departure_time    │     window_open     │ … │  docked_trucks   │ docked_truck_count │
+│      timestamp      │      timestamp      │      timestamp      │   │    varchar[]     │       uint64       │
+├─────────────────────┼─────────────────────┼─────────────────────┼───┼──────────────────┼────────────────────┤
+│ 2023-01-01 06:23:47 │ 2023-01-01 06:25:08 │ 2023-01-01 06:22:47 │ … │ [A1]             │                  1 │
+│ 2023-01-01 06:26:42 │ 2023-01-01 06:28:02 │ 2023-01-01 06:25:42 │ … │ [A1]             │                  1 │
+│ 2023-01-01 06:30:20 │ 2023-01-01 06:35:01 │ 2023-01-01 06:29:20 │ … │ [B3, C3, A6, A5] │                  4 │
+│ 2023-01-01 06:32:06 │ 2023-01-01 06:33:48 │ 2023-01-01 06:31:06 │ … │ [B3, C3, A6, A5] │                  4 │
+│ 2023-01-01 06:33:09 │ 2023-01-01 06:36:01 │ 2023-01-01 06:32:09 │ … │ [B3, C3, A6, A5] │                  4 │
+│ 2023-01-01 06:34:08 │ 2023-01-01 06:39:49 │ 2023-01-01 06:33:08 │ … │ [B3, C3, A6, A5] │                  4 │
+│ 2023-01-01 06:36:40 │ 2023-01-01 06:38:34 │ 2023-01-01 06:35:40 │ … │ [A5, A6, C3, B3] │                  4 │
+│ 2023-01-01 06:37:43 │ 2023-01-01 06:40:48 │ 2023-01-01 06:36:43 │ … │ [A5, A6, C3]     │                  3 │
+│ 2023-01-01 06:39:48 │ 2023-01-01 06:46:10 │ 2023-01-01 06:38:48 │ … │ [A6, A5, C3]     │                  3 │
+├─────────────────────┴─────────────────────┴─────────────────────┴───┴──────────────────┴────────────────────┤
+│ 9 rows                                                                                  6 columns (5 shown) │
+└─────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
+"""

We clearly see the strengths of DuckDB in how succintly we were able to express this operation. We also find how DuckDB is able to seamlessly integrate with an existing Pandas or Polars pipeline with zero-conversion costs. In fact, we can convert this back to a Polars or Pandas dataframe by appending the ending bracket with db.query(...).pl() and db.query(...).pd() respectively.

+

Can we make the SQL simpler?

+

Now that we’ve understood the logic that goes into the query, let’s try to optimize the algorithm. We have the three conditions:

+ + + + + +
1-- Case 2 in the diagram
+2(B.arrival_time <= A.window_open AND 
+3    (B.arrival_time   + TO_SECONDS(B.duration)) >=  A.window_open) OR
+4-- Case 3 in the diagram
+5(B.arrival_time >= A.window_open AND 
+6                              B.departure_time  <= A.window_close) OR
+7-- Case 4 in the diagram
+8(B.arrival_time >= A.window_open AND
+9    (B.departure_time - TO_SECONDS(B.duration)) <= A.window_close)

What is common between these three conditions? It takes a while to see it; but it becomes clear that all these cases require the start of the overlap to be before the window ends, and the end of the overlap to be after the window starts. This can be simplified to just:

+ + + + + +
1B.arrival_time   <= A.window_close AND
+2B.departure_time >= A.window_open

making our query much simpler!

+

Simplified SQL: Part 1

+

We’ve removed the need for the duration calculation algother now. Therefore, we can write:

+ + + + + +
 1SELECT
+ 2     A.arrival_time
+ 3    ,A.departure_time
+ 4    ,A.window_open
+ 5    ,A.window_close
+ 6    ,LIST_DISTINCT(LIST(B.ID)) AS docked_trucks
+ 7    ,LIST_UNIQUE(LIST(B.ID))   AS docked_truck_count
+ 8
+ 9FROM (
+10    SELECT *
+11        ,arrival_time   - (INTERVAL 1 MINUTE) AS window_open
+12        ,departure_time + (INTERVAL 1 MINUTE) AS window_close
+13    FROM data) A
+14
+15LEFT JOIN data B
+16
+17ON (
+18    B.arrival_time   <= A.window_close AND
+19    B.departure_time >= A.window_open
+20)
+21GROUP BY 1, 2, 3, 4

Can we simplify this even further?

+

Simplification: Part 2

+

I think the SQL query in the above section is very easy to ready already. However, it is a little clunky overall, and there is a way that we can leverage DuckDB’s extensive optimizations to simplify our legibility by rewriting the query as a cross join:

+ + + + + +
 1SELECT
+ 2    A.arrival_time
+ 3    ,A.departure_time
+ 4    ,A.arrival_time - (INTERVAL 1 MINUTE)   AS window_open
+ 5    ,A.departure_time + (INTERVAL 1 MINUTE) AS window_close
+ 6    ,LIST_DISTINCT(LIST(B.ID)) AS docked_trucks
+ 7    ,LIST_UNIQUE(LIST(B.ID))   AS docked_truck_count
+ 8FROM  data A, data B
+ 9WHERE B.arrival_time   <= window_close
+10AND   B.departure_time >= window_open
+11GROUP BY 1, 2, 3, 4

Why does this work? Before optimization on DuckDB, this is what the query plan looks like:

+
DuckDB query plan before optimization + + + + + +
 1"""
+ 2┌───────────────────────────┐                             
+ 3│         PROJECTION        │                             
+ 4│   ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─   │                             
+ 5│             0             │                             
+ 6│             1             │                             
+ 7│             2             │                             
+ 8│             3             │                             
+ 9│       docked_trucks       │                             
+10│     docked_truck_count    │                             
+11└─────────────┬─────────────┘                                                          
+12┌─────────────┴─────────────┐                             
+13│         AGGREGATE         │                             
+14│   ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─   │                             
+15│        arrival_time       │                             
+16│       departure_time      │                             
+17│        window_open        │                             
+18│        window_close       │                             
+19│          list(ID)         │                             
+20└─────────────┬─────────────┘                                                          
+21┌─────────────┴─────────────┐                             
+22│           FILTER          │                             
+23│   ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─   │                             
+24│     (arrival_time <=      │                             
+25│(departure_time + to_m...  │                             
+26│        AS BIGINT))))      │                             
+27│    (departure_time >=     │                             
+28│(arrival_time - to_min...  │                             
+29│        AS BIGINT))))      │                             
+30└─────────────┬─────────────┘                                                          
+31┌─────────────┴─────────────┐                             
+32│       CROSS_PRODUCT       ├──────────────┐              
+33└─────────────┬─────────────┘              │                                           
+34┌─────────────┴─────────────┐┌─────────────┴─────────────┐
+35│         ARROW_SCAN        ││         ARROW_SCAN        │
+36└───────────────────────────┘└───────────────────────────┘ 
+37"""                            
+

After optimization, the CROSS_PRODUCT is automatically optimized to an interval join!

+
DuckDB query after before optimization + + + + + +
 1"""
+ 2┌───────────────────────────┐                             
+ 3│         PROJECTION        │                             
+ 4│   ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─   │                             
+ 5│             0             │                             
+ 6│             1             │                             
+ 7│             2             │                             
+ 8│             3             │                             
+ 9│       docked_trucks       │                             
+10│     docked_truck_count    │                             
+11└─────────────┬─────────────┘                                                          
+12┌─────────────┴─────────────┐                             
+13│         AGGREGATE         │                             
+14│   ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─   │                             
+15│        arrival_time       │                             
+16│       departure_time      │                             
+17│        window_open        │                             
+18│        window_close       │                             
+19│          list(ID)         │                             
+20└─────────────┬─────────────┘                                                          
+21┌─────────────┴─────────────┐                             
+22│      COMPARISON_JOIN      │                             
+23│   ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─   │                             
+24│           INNER           │                             
+25│ ((departure_time + '00:01 │                             
+26│     :00'::INTERVAL) >=    ├──────────────┐              
+27│        arrival_time)      │              │              
+28│((arrival_time - '00:01:00'│              │              
+29│       ::INTERVAL) <=      │              │              
+30│       departure_time)     │              │              
+31└─────────────┬─────────────┘              │                                           
+32┌─────────────┴─────────────┐┌─────────────┴─────────────┐
+33│         ARROW_SCAN        ││         ARROW_SCAN        │
+34└───────────────────────────┘└───────────────────────────┘
+35"""                      
+

So in effect, we’re actually exploiting a feature of DuckDB to allow us to write our queries in a suboptimal manner for greater readability, and allowing the optmizer to do a good chunk of our work for us. I wouldn’t recommend using this generally, because not all SQL engine optmizers will be able to find an efficient route to these calculations for large datasets.

+

How to get query plans?

+

I’m glad you asked. Here’s the DuckDB page explaining EXPLAIN (heh). Here’s the code I used:

+ + + + + +
 1import duckdb as db
+ 2db.sql("SET EXPLAIN_OUTPUT='all';")
+ 3print(db.query("""
+ 4EXPLAIN
+ 5SELECT
+ 6    A.arrival_time
+ 7    ,A.departure_time
+ 8    ,A.arrival_time - (INTERVAL 1 MINUTE) AS window_open
+ 9    ,A.departure_time + (INTERVAL 1 MINUTE) AS window_close
+10    ,LIST_DISTINCT(LIST(B.ID)) AS docked_trucks
+11    ,LIST_UNIQUE(LIST(B.ID))   AS docked_truck_count
+12FROM  data A, data B
+13WHERE B.arrival_time   <= window_close
+14AND   B.departure_time >= window_open
+15GROUP BY 1, 2, 3, 4
+16""").pl()[1, 1])

What are the alternatives?

+

The data.table way

+

data.table is a package that has historically been ahead of its time - in both speed and features that it has had. Developement has taken a hit recently, but will likely pick back up. It’s my favourite package on all fronts for data manipulation, but suffers simply from the lack of broader R support across the ML and DL space.

+

The foverlaps function

+

If this kind of overlapping join is common, shouldn’t someone have developed a package for it? Turns out, data.table has, and with very specific constraints that make it the perfect solution to our problem (if you don’t mind switching over to R, that is).

+

The foverlaps function has these requirements:

+
    +
  1. The input data.table objects have to be keyed for automatic recognition of columns.
  2. +
  3. The default match type is that it matches all three cases from the image above. Side note: it also has matches for within overlap, matching start and end windows,
  4. +
  5. The last two matching columns in the join condition in by must specify the start and end points of the overlapping window. This isn’t a problem for us now, but does restrict for future uses where we may want non-equi joins on other cases.
  6. +
+

The code, si, the code!

+

Without further ado:

+ + + + + +
 1library(data.table)
+ 2library(lubridate)
+ 3
+ 4######### BOILERPLATE CODE, NO LOGIC HERE ####################
+ 5arrival_time = as_datetime(c(
+ 6  '2023-01-01 06:23:47.000000', '2023-01-01 06:26:42.000000',
+ 7  '2023-01-01 06:30:20.000000', '2023-01-01 06:32:06.000000',
+ 8  '2023-01-01 06:33:09.000000', '2023-01-01 06:34:08.000000',
+ 9  '2023-01-01 06:36:40.000000', '2023-01-01 06:37:43.000000',
+10  '2023-01-01 06:39:48.000000'))
+11departure_time = as_datetime(c(
+12  '2023-01-01 06:25:08.000000', '2023-01-01 06:28:02.000000',
+13  '2023-01-01 06:35:01.000000', '2023-01-01 06:33:48.000000',
+14  '2023-01-01 06:36:01.000000', '2023-01-01 06:39:49.000000',
+15  '2023-01-01 06:38:34.000000', '2023-01-01 06:40:48.000000',
+16  '2023-01-01 06:46:10.000000'))
+17ID = c('A1', 'A1', 'A5', 'A6', 'B3', 'C3', 'A6', 'A5', 'A6')
+18
+19DT = data.table(
+20  arrival_time = arrival_time,
+21  departure_time = departure_time,
+22  ID = ID)
+23######### BOILERPLATE CODE, NO LOGIC HERE ####################
+24
+25# A copy(DT) creates a copy of a data.table that isn't linked
+26# to the original one, so that changes in it don't reflect in
+27# the original DT object.
+28# The `:=` allow assignment by reference (i.e. "in place").
+29DT_with_windows = copy(DT)[, `:=`(
+30  window_start   = arrival_time   - minutes(1),
+31  window_end = departure_time + minutes(1))]
+32
+33# This step is necessary for the second table, but not the first, but we
+34# key both data.tables to make the foverlap code very succinct.
+35setkeyv(DT, c("arrival_time", "departure_time"))
+36setkeyv(DT_with_windows, c("window_start", "window_end"))
+37
+38# The foverlap function returns a data.table, so we can simply apply
+39# the usual data.table syntax on it!
+40# Since we have the same name of some columns in both data.tables,
+41# the latter table's columns are prefixed with "i." to avoid conflicts.
+42foverlaps(DT, DT_with_windows)[
+43  , .(docked_trucks = list(unique(i.ID)),
+44      docked_truck_count = uniqueN(i.ID))
+45  , .(arrival_time, departure_time)]

provides us the output:

+ + + + + +
 1          arrival_time      departure_time docked_trucks docked_truck_count
+ 2                <POSc>              <POSc>        <list>              <int>
+ 31: 2023-01-01 06:23:47 2023-01-01 06:25:08            A1                  1
+ 42: 2023-01-01 06:26:42 2023-01-01 06:28:02            A1                  1
+ 53: 2023-01-01 06:30:20 2023-01-01 06:35:01   A5,A6,B3,C3                  4
+ 64: 2023-01-01 06:32:06 2023-01-01 06:33:48   A5,A6,B3,C3                  4
+ 75: 2023-01-01 06:33:09 2023-01-01 06:36:01   A5,A6,B3,C3                  4
+ 86: 2023-01-01 06:34:08 2023-01-01 06:39:49   A5,A6,B3,C3                  4
+ 97: 2023-01-01 06:36:40 2023-01-01 06:38:34   B3,C3,A6,A5                  4
+108: 2023-01-01 06:37:43 2023-01-01 06:40:48      C3,A6,A5                  3
+119: 2023-01-01 06:39:48 2023-01-01 06:46:10      C3,A5,A6                  3

Considerations for using data.table

+

The package offers a wonderful, nearly one-stop solution that doesn’t require you to write the logic out for the query or command yourself, but has a major problem for a lot of users - it requires you to switch your codebase to R, and a lot of your tasks may be on Python or in an SQL pipeline. So, what do you do?

+

Consider the effort in maintaining an additional dependency for your analytics pipeline (i.e. R), and the effort that you’ll need to invest to run R from Python, or run an R script in your pipeline and pull the output from it back into the pipeline, and make your call.

+]]>
+
+
+
diff --git a/public/posts/my-first-post/index.html b/public/posts/my-first-post/index.html new file mode 100644 index 0000000..ea49d7c --- /dev/null +++ b/public/posts/my-first-post/index.html @@ -0,0 +1,110 @@ + + + + + + + +My First Post | Avinash's Blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +

Avinash's Blog

+ +
+
+ +

My First Post

+ + + +

Fucking hell.

+ +
+

+ +

+ + +

+ + Reply to this post by email ↪ + +

+ + + +
+
+ Avinash Mallya | Made with Bear Cub +
+ + + + + diff --git a/_posts/2023-06-22-overlap_joins.md b/public/posts/post.exe similarity index 99% rename from _posts/2023-06-22-overlap_joins.md rename to public/posts/post.exe index a51cb4d..3b16073 100644 --- a/_posts/2023-06-22-overlap_joins.md +++ b/public/posts/post.exe @@ -1,9 +1,8 @@ ---- -title: Fast overlap joins in SQL, Python and R -permalink: /docked_trucks_in_interval -author: Avinash Mallya -tags: [python, polars, duckdb, R, data.table, foverlaps, overlap, join] ---- ++++ +date = '2023-06-22T17:27:50-04:00' +draft = false +title = 'Overlap Joins' ++++ # Premise diff --git a/public/posts/post/index.html b/public/posts/post/index.html new file mode 100644 index 0000000..e716566 --- /dev/null +++ b/public/posts/post/index.html @@ -0,0 +1,562 @@ + + + + + + + +Overlap Joins | Avinash's Blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +

Avinash's Blog

+ +
+
+ +

Overlap Joins

+ + + +

Premise

+

I stumbled upon an interesting Stackoverflow question that was linked via an issue on Polars github repo. The OP asked for a pure Polars solution. At the time of answering the question Polars did not have support for non-equi joins, and any solution using it would be pretty cumbersome.

+

I’m more of a right-tool-for-the-job person, so I tried to find a better solution.

+

Problem Statement

+

Suppose we have a dataset that captures the arrival and departure times of trucks at a station, along with the truck’s ID.

+ + + + + +
 1import polars as pl # if you don't have polars, run 
+ 2                    # pip install 'polars[all]'
+ 3data = pl.from_repr("""
+ 4┌─────────────────────┬─────────────────────┬─────┐
+ 5│ arrival_time        ┆ departure_time      ┆ ID  │
+ 6│ ---                 ┆ ---                 ┆ --- │
+ 7│ datetime[μs]        ┆ datetime[μs]        ┆ str │
+ 8╞═════════════════════╪═════════════════════╪═════╡
+ 9│ 2023-01-01 06:23:47 ┆ 2023-01-01 06:25:08 ┆ A1  │
+10│ 2023-01-01 06:26:42 ┆ 2023-01-01 06:28:02 ┆ A1  │
+11│ 2023-01-01 06:30:20 ┆ 2023-01-01 06:35:01 ┆ A5  │
+12│ 2023-01-01 06:32:06 ┆ 2023-01-01 06:33:48 ┆ A6  │
+13│ 2023-01-01 06:33:09 ┆ 2023-01-01 06:36:01 ┆ B3  │
+14│ 2023-01-01 06:34:08 ┆ 2023-01-01 06:39:49 ┆ C3  │
+15│ 2023-01-01 06:36:40 ┆ 2023-01-01 06:38:34 ┆ A6  │
+16│ 2023-01-01 06:37:43 ┆ 2023-01-01 06:40:48 ┆ A5  │
+17│ 2023-01-01 06:39:48 ┆ 2023-01-01 06:46:10 ┆ A6  │
+18└─────────────────────┴─────────────────────┴─────┘
+19""")

We want to identify the number of trucks docked at any given time within a threshold of 1 minute prior to the arrival time of a truck, and 1 minute after the departure of a truck. Equivalently, this means that we need to calculate the number of trucks within a specific window for each row of the data.

+

Finding a solution to the problem

+

Evaluate for a specific row

+

Before we find a general solution to this problem, let’s consider a specific row to understand the problem better:

+ + + + + +
1"""
+2┌─────────────────────┬─────────────────────┬─────┐
+3│ arrival_time        ┆ departure_time      ┆ ID  │
+4│ ---                 ┆ ---                 ┆ --- │
+5│ datetime[μs]        ┆ datetime[μs]        ┆ str │
+6╞═════════════════════╪═════════════════════╪═════╡
+7│ 2023-01-01 06:32:06 ┆ 2023-01-01 06:33:48 ┆ A6  │
+8└─────────────────────┴─────────────────────┴─────┘
+9"""

For this row, we need to find the number of trucks that are there between 2023-01-01 06:31:06 (1 minute prior to the arrival_time and 2023-01-01 06:34:48 (1 minute post the departure_time). Manually going through the original dataset, we see that B3, C3, A6 and A5 are the truck IDs that qualify - they all are at the station in a duration that is between 2023-01-01 06:31:06 and 2023-01-01 06:34:48.

+

Visually deriving an algorithm

+

There are many cases that will qualify a truck to be present in the overlap window defined by a particular row. Specifically for the example above, we have (this visualization is generalizable, because for each row we can calculate without much difficulty the overlap window relative to the arrival and departure times):

+

The five different ways a period can overlap.

+

Take some time to absorb these cases - it’s important for the part where we write the code for the solution. Note that we need to actually tell our algorithm to filter only for Cases 2, 3 and 4, since Cases 1 and 5 will not satisfy our requirements.

+

Writing an SQL query based on the algorithm

+

In theory, we can use any language that has the capability to define rules that meet our algorithmic requirements outlined in the above section to find the solution. Why choose SQL? It’s often able to convey elegantly the logic that was used to execute the algorithm; and while it does come with excessive verbosity at times, it doesn’t quite in this case.

+

Note here that we run SQL in Python with almost no setup or boilerplate code - so this is a Python based solution as well (although not quite Pythonic!).

+

Introducing the DuckDB package

+

Once again, in theory, any SQL package or language can be used. Far too few however meet the ease-of-use that DuckDB provides:

+
    +
  1. no expensive set-up time (meaning no need for setting up databases, even temporary ones),
  2. +
  3. no dependencies (other than DuckDB itself, just pip install duckdb),
  4. +
  5. some very friendly SQL extensions, and
  6. +
  7. ability to work directly on Polars and Pandas DataFrames without conversions
  8. +
+

all with mind-blowing speed that stands shoulder-to-shoulder with Polars. We’ll also use a few advanced SQL concepts noted below.

+

Self-joins

+

This should be a familiar, albeit not often used concept - a join of a table with itself is a self join. There are few cases where such an operation would make sense, and this happens to be one of them.

+

A bullet train recap of non-equi joins

+

A key concept that we’ll use is the idea of joining on a range of values rather than a specific value. That is, instead of the usual LEFT JOIN ON A.column = B.column, we can do LEFT JOIN ON A.column <= B.column for one row in table A to match to multiple rows in B. DuckDB has a blog post that outlines this join in detail, including fast implementation.

+

The concept of LIST columns

+

DuckDB has first class support for LIST columns - that is, each row in a LIST column can have a varying length (much like a Python list), but must have the exact same datatype (like R’s vector). Using list columns allow us to eschew the use of an additional GROUP BY operation on top of a WHERE filter or SELECT DISTINCT operation, since we can directly perform those on the LIST column itself.

+

Date algebra

+

Dates can be rather difficult to handle well in most tools and languages, with several packages purpose built to make handling them easier - lubridate from the tidyverse is a stellar example. Thankfully, DuckDB provides a similar swiss-knife set of tools to deal with it, including specifying INTERVALs (a special data type that represent a period of time independent of specific time values) to modify TIMESTAMP values using addition or subtraction.

+

Tell me the query, PLEASE!

+

Okay - had a lot of background. Let’s have at it! The query by itself in SQL is (see immediately below for runnable code in Python):

+ + + + + +
 1SELECT
+ 2     A.arrival_time
+ 3    ,A.departure_time
+ 4    ,A.window_open
+ 5    ,A.window_close
+ 6    ,LIST_DISTINCT(LIST(B.ID)) AS docked_trucks
+ 7    ,LIST_UNIQUE(LIST(B.ID))   AS docked_truck_count
+ 8
+ 9FROM (
+10    SELECT *
+11        ,arrival_time   - (INTERVAL 1 MINUTE) AS window_open
+12        ,departure_time + (INTERVAL 1 MINUTE) AS window_close
+13    FROM data) A
+14
+15LEFT JOIN (
+16    SELECT *
+17        ,DATEDIFF('seconds', arrival_time, departure_time) AS duration
+18    FROM data) B
+19
+20ON ((B.arrival_time <= A.window_open AND 
+21    	(B.arrival_time   + TO_SECONDS(B.duration)) >=  A.window_open) OR
+22    (B.arrival_time >= A.window_open AND 
+23                                  B.departure_time  <= A.window_close) OR
+24    (B.arrival_time >= A.window_open AND
+25    	(B.departure_time - TO_SECONDS(B.duration)) <= A.window_close))
+26GROUP BY 1, 2, 3, 4

A small, succinct query such as this will need a bit of explanation to take it all in. Here’s one below, reproducible in Python (make sure to install duckdb first!). Expand it to view.

+ + + + + + +
 1import duckdb as db
+ 2db.query("""
+ 3    SELECT
+ 4        A.arrival_time
+ 5        ,A.departure_time
+ 6        ,A.window_open
+ 7        ,A.window_close
+ 8        -- LIST aggregates the values into a LIST column
+ 9        -- and LIST_DISTINCT finds the unique values in it
+10        ,LIST_DISTINCT(LIST(B.ID)) AS docked_trucks
+11        -- finally, LIST_UNIQUE calculates the unique number of values in it
+12        ,LIST_UNIQUE(LIST(B.ID))   AS docked_truck_count
+13
+14    FROM (
+15        SELECT
+16            *
+17            ,arrival_time   - (INTERVAL 1 MINUTE) AS window_open
+18            ,departure_time + (INTERVAL 1 MINUTE) AS window_close
+19        FROM data -- remember we defined data as the Polars DataFrame with our truck station data
+20    ) A
+21
+22    LEFT JOIN (
+23        SELECT
+24            *
+25            -- This is the time, in seconds between the arrival and departure of
+26            -- each truck PER ROW in the original data-frame 
+27            ,DATEDIFF('seconds', arrival_time, departure_time) AS duration
+28        FROM data -- this is where we perform a self-join
+29    ) B
+30
+31    ON (
+32        -- Case 2 in the diagram;
+33        (B.arrival_time <= A.window_open AND 
+34            -- Adding the duration here makes sure that the second interval
+35            -- is at least ENDING AFTER the start of the overlap window
+36            (B.arrival_time   + TO_SECONDS(B.duration)) >=  A.window_open) OR
+37
+38        -- Case 3 in the diagram - the simplest of all five cases
+39        (B.arrival_time >= A.window_open AND 
+40                                      B.departure_time  <= A.window_close) OR
+41
+42        -- Case 4 in the digram;
+43        (B.arrival_time >= A.window_open AND
+44            -- Subtracting the duration here makes sure that the second interval
+45            -- STARTS BEFORE the end of the overlap window.
+46            (B.departure_time - TO_SECONDS(B.duration)) <= A.window_close)
+47    )
+48    GROUP BY 1, 2, 3, 4
+49""")
+

The output of this query is:

+ + + + + +
"""
+┌─────────────────────┬─────────────────────┬─────────────────────┬───┬──────────────────┬────────────────────┐
+│    arrival_time     │   departure_time    │     window_open     │ … │  docked_trucks   │ docked_truck_count │
+│      timestamp      │      timestamp      │      timestamp      │   │    varchar[]     │       uint64       │
+├─────────────────────┼─────────────────────┼─────────────────────┼───┼──────────────────┼────────────────────┤
+│ 2023-01-01 06:23:47 │ 2023-01-01 06:25:08 │ 2023-01-01 06:22:47 │ … │ [A1]             │                  1 │
+│ 2023-01-01 06:26:42 │ 2023-01-01 06:28:02 │ 2023-01-01 06:25:42 │ … │ [A1]             │                  1 │
+│ 2023-01-01 06:30:20 │ 2023-01-01 06:35:01 │ 2023-01-01 06:29:20 │ … │ [B3, C3, A6, A5] │                  4 │
+│ 2023-01-01 06:32:06 │ 2023-01-01 06:33:48 │ 2023-01-01 06:31:06 │ … │ [B3, C3, A6, A5] │                  4 │
+│ 2023-01-01 06:33:09 │ 2023-01-01 06:36:01 │ 2023-01-01 06:32:09 │ … │ [B3, C3, A6, A5] │                  4 │
+│ 2023-01-01 06:34:08 │ 2023-01-01 06:39:49 │ 2023-01-01 06:33:08 │ … │ [B3, C3, A6, A5] │                  4 │
+│ 2023-01-01 06:36:40 │ 2023-01-01 06:38:34 │ 2023-01-01 06:35:40 │ … │ [A5, A6, C3, B3] │                  4 │
+│ 2023-01-01 06:37:43 │ 2023-01-01 06:40:48 │ 2023-01-01 06:36:43 │ … │ [A5, A6, C3]     │                  3 │
+│ 2023-01-01 06:39:48 │ 2023-01-01 06:46:10 │ 2023-01-01 06:38:48 │ … │ [A6, A5, C3]     │                  3 │
+├─────────────────────┴─────────────────────┴─────────────────────┴───┴──────────────────┴────────────────────┤
+│ 9 rows                                                                                  6 columns (5 shown) │
+└─────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
+"""

We clearly see the strengths of DuckDB in how succintly we were able to express this operation. We also find how DuckDB is able to seamlessly integrate with an existing Pandas or Polars pipeline with zero-conversion costs. In fact, we can convert this back to a Polars or Pandas dataframe by appending the ending bracket with db.query(...).pl() and db.query(...).pd() respectively.

+

Can we make the SQL simpler?

+

Now that we’ve understood the logic that goes into the query, let’s try to optimize the algorithm. We have the three conditions:

+ + + + + +
1-- Case 2 in the diagram
+2(B.arrival_time <= A.window_open AND 
+3    (B.arrival_time   + TO_SECONDS(B.duration)) >=  A.window_open) OR
+4-- Case 3 in the diagram
+5(B.arrival_time >= A.window_open AND 
+6                              B.departure_time  <= A.window_close) OR
+7-- Case 4 in the diagram
+8(B.arrival_time >= A.window_open AND
+9    (B.departure_time - TO_SECONDS(B.duration)) <= A.window_close)

What is common between these three conditions? It takes a while to see it; but it becomes clear that all these cases require the start of the overlap to be before the window ends, and the end of the overlap to be after the window starts. This can be simplified to just:

+ + + + + +
1B.arrival_time   <= A.window_close AND
+2B.departure_time >= A.window_open

making our query much simpler!

+

Simplified SQL: Part 1

+

We’ve removed the need for the duration calculation algother now. Therefore, we can write:

+ + + + + +
 1SELECT
+ 2     A.arrival_time
+ 3    ,A.departure_time
+ 4    ,A.window_open
+ 5    ,A.window_close
+ 6    ,LIST_DISTINCT(LIST(B.ID)) AS docked_trucks
+ 7    ,LIST_UNIQUE(LIST(B.ID))   AS docked_truck_count
+ 8
+ 9FROM (
+10    SELECT *
+11        ,arrival_time   - (INTERVAL 1 MINUTE) AS window_open
+12        ,departure_time + (INTERVAL 1 MINUTE) AS window_close
+13    FROM data) A
+14
+15LEFT JOIN data B
+16
+17ON (
+18    B.arrival_time   <= A.window_close AND
+19    B.departure_time >= A.window_open
+20)
+21GROUP BY 1, 2, 3, 4

Can we simplify this even further?

+

Simplification: Part 2

+

I think the SQL query in the above section is very easy to ready already. However, it is a little clunky overall, and there is a way that we can leverage DuckDB’s extensive optimizations to simplify our legibility by rewriting the query as a cross join:

+ + + + + +
 1SELECT
+ 2    A.arrival_time
+ 3    ,A.departure_time
+ 4    ,A.arrival_time - (INTERVAL 1 MINUTE)   AS window_open
+ 5    ,A.departure_time + (INTERVAL 1 MINUTE) AS window_close
+ 6    ,LIST_DISTINCT(LIST(B.ID)) AS docked_trucks
+ 7    ,LIST_UNIQUE(LIST(B.ID))   AS docked_truck_count
+ 8FROM  data A, data B
+ 9WHERE B.arrival_time   <= window_close
+10AND   B.departure_time >= window_open
+11GROUP BY 1, 2, 3, 4

Why does this work? Before optimization on DuckDB, this is what the query plan looks like:

+ + + + + + +
 1"""
+ 2┌───────────────────────────┐                             
+ 3│         PROJECTION        │                             
+ 4│   ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─   │                             
+ 5│             0             │                             
+ 6│             1             │                             
+ 7│             2             │                             
+ 8│             3             │                             
+ 9│       docked_trucks       │                             
+10│     docked_truck_count    │                             
+11└─────────────┬─────────────┘                                                          
+12┌─────────────┴─────────────┐                             
+13│         AGGREGATE         │                             
+14│   ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─   │                             
+15│        arrival_time       │                             
+16│       departure_time      │                             
+17│        window_open        │                             
+18│        window_close       │                             
+19│          list(ID)         │                             
+20└─────────────┬─────────────┘                                                          
+21┌─────────────┴─────────────┐                             
+22│           FILTER          │                             
+23│   ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─   │                             
+24│     (arrival_time <=      │                             
+25│(departure_time + to_m...  │                             
+26│        AS BIGINT))))      │                             
+27│    (departure_time >=     │                             
+28│(arrival_time - to_min...  │                             
+29│        AS BIGINT))))      │                             
+30└─────────────┬─────────────┘                                                          
+31┌─────────────┴─────────────┐                             
+32│       CROSS_PRODUCT       ├──────────────┐              
+33└─────────────┬─────────────┘              │                                           
+34┌─────────────┴─────────────┐┌─────────────┴─────────────┐
+35│         ARROW_SCAN        ││         ARROW_SCAN        │
+36└───────────────────────────┘└───────────────────────────┘ 
+37"""                            
+

After optimization, the CROSS_PRODUCT is automatically optimized to an interval join!

+ + + + + + +
 1"""
+ 2┌───────────────────────────┐                             
+ 3│         PROJECTION        │                             
+ 4│   ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─   │                             
+ 5│             0             │                             
+ 6│             1             │                             
+ 7│             2             │                             
+ 8│             3             │                             
+ 9│       docked_trucks       │                             
+10│     docked_truck_count    │                             
+11└─────────────┬─────────────┘                                                          
+12┌─────────────┴─────────────┐                             
+13│         AGGREGATE         │                             
+14│   ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─   │                             
+15│        arrival_time       │                             
+16│       departure_time      │                             
+17│        window_open        │                             
+18│        window_close       │                             
+19│          list(ID)         │                             
+20└─────────────┬─────────────┘                                                          
+21┌─────────────┴─────────────┐                             
+22│      COMPARISON_JOIN      │                             
+23│   ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─   │                             
+24│           INNER           │                             
+25│ ((departure_time + '00:01 │                             
+26│     :00'::INTERVAL) >=    ├──────────────┐              
+27│        arrival_time)      │              │              
+28│((arrival_time - '00:01:00'│              │              
+29│       ::INTERVAL) <=      │              │              
+30│       departure_time)     │              │              
+31└─────────────┬─────────────┘              │                                           
+32┌─────────────┴─────────────┐┌─────────────┴─────────────┐
+33│         ARROW_SCAN        ││         ARROW_SCAN        │
+34└───────────────────────────┘└───────────────────────────┘
+35"""                      
+

So in effect, we’re actually exploiting a feature of DuckDB to allow us to write our queries in a suboptimal manner for greater readability, and allowing the optmizer to do a good chunk of our work for us. I wouldn’t recommend using this generally, because not all SQL engine optmizers will be able to find an efficient route to these calculations for large datasets.

+

How to get query plans?

+

I’m glad you asked. Here’s the DuckDB page explaining EXPLAIN (heh). Here’s the code I used:

+ + + + + +
 1import duckdb as db
+ 2db.sql("SET EXPLAIN_OUTPUT='all';")
+ 3print(db.query("""
+ 4EXPLAIN
+ 5SELECT
+ 6    A.arrival_time
+ 7    ,A.departure_time
+ 8    ,A.arrival_time - (INTERVAL 1 MINUTE) AS window_open
+ 9    ,A.departure_time + (INTERVAL 1 MINUTE) AS window_close
+10    ,LIST_DISTINCT(LIST(B.ID)) AS docked_trucks
+11    ,LIST_UNIQUE(LIST(B.ID))   AS docked_truck_count
+12FROM  data A, data B
+13WHERE B.arrival_time   <= window_close
+14AND   B.departure_time >= window_open
+15GROUP BY 1, 2, 3, 4
+16""").pl()[1, 1])

What are the alternatives?

+

The data.table way

+

data.table is a package that has historically been ahead of its time - in both speed and features that it has had. Developement has taken a hit recently, but will likely pick back up. It’s my favourite package on all fronts for data manipulation, but suffers simply from the lack of broader R support across the ML and DL space.

+

The foverlaps function

+

If this kind of overlapping join is common, shouldn’t someone have developed a package for it? Turns out, data.table has, and with very specific constraints that make it the perfect solution to our problem (if you don’t mind switching over to R, that is).

+

The foverlaps function has these requirements:

+
    +
  1. The input data.table objects have to be keyed for automatic recognition of columns.
  2. +
  3. The default match type is that it matches all three cases from the image above. Side note: it also has matches for within overlap, matching start and end windows,
  4. +
  5. The last two matching columns in the join condition in by must specify the start and end points of the overlapping window. This isn’t a problem for us now, but does restrict for future uses where we may want non-equi joins on other cases.
  6. +
+

The code, si, the code!

+

Without further ado:

+ + + + + +
 1library(data.table)
+ 2library(lubridate)
+ 3
+ 4######### BOILERPLATE CODE, NO LOGIC HERE ####################
+ 5arrival_time = as_datetime(c(
+ 6  '2023-01-01 06:23:47.000000', '2023-01-01 06:26:42.000000',
+ 7  '2023-01-01 06:30:20.000000', '2023-01-01 06:32:06.000000',
+ 8  '2023-01-01 06:33:09.000000', '2023-01-01 06:34:08.000000',
+ 9  '2023-01-01 06:36:40.000000', '2023-01-01 06:37:43.000000',
+10  '2023-01-01 06:39:48.000000'))
+11departure_time = as_datetime(c(
+12  '2023-01-01 06:25:08.000000', '2023-01-01 06:28:02.000000',
+13  '2023-01-01 06:35:01.000000', '2023-01-01 06:33:48.000000',
+14  '2023-01-01 06:36:01.000000', '2023-01-01 06:39:49.000000',
+15  '2023-01-01 06:38:34.000000', '2023-01-01 06:40:48.000000',
+16  '2023-01-01 06:46:10.000000'))
+17ID = c('A1', 'A1', 'A5', 'A6', 'B3', 'C3', 'A6', 'A5', 'A6')
+18
+19DT = data.table(
+20  arrival_time = arrival_time,
+21  departure_time = departure_time,
+22  ID = ID)
+23######### BOILERPLATE CODE, NO LOGIC HERE ####################
+24
+25# A copy(DT) creates a copy of a data.table that isn't linked
+26# to the original one, so that changes in it don't reflect in
+27# the original DT object.
+28# The `:=` allow assignment by reference (i.e. "in place").
+29DT_with_windows = copy(DT)[, `:=`(
+30  window_start   = arrival_time   - minutes(1),
+31  window_end = departure_time + minutes(1))]
+32
+33# This step is necessary for the second table, but not the first, but we
+34# key both data.tables to make the foverlap code very succinct.
+35setkeyv(DT, c("arrival_time", "departure_time"))
+36setkeyv(DT_with_windows, c("window_start", "window_end"))
+37
+38# The foverlap function returns a data.table, so we can simply apply
+39# the usual data.table syntax on it!
+40# Since we have the same name of some columns in both data.tables,
+41# the latter table's columns are prefixed with "i." to avoid conflicts.
+42foverlaps(DT, DT_with_windows)[
+43  , .(docked_trucks = list(unique(i.ID)),
+44      docked_truck_count = uniqueN(i.ID))
+45  , .(arrival_time, departure_time)]

provides us the output:

+ + + + + +
 1          arrival_time      departure_time docked_trucks docked_truck_count
+ 2                <POSc>              <POSc>        <list>              <int>
+ 31: 2023-01-01 06:23:47 2023-01-01 06:25:08            A1                  1
+ 42: 2023-01-01 06:26:42 2023-01-01 06:28:02            A1                  1
+ 53: 2023-01-01 06:30:20 2023-01-01 06:35:01   A5,A6,B3,C3                  4
+ 64: 2023-01-01 06:32:06 2023-01-01 06:33:48   A5,A6,B3,C3                  4
+ 75: 2023-01-01 06:33:09 2023-01-01 06:36:01   A5,A6,B3,C3                  4
+ 86: 2023-01-01 06:34:08 2023-01-01 06:39:49   A5,A6,B3,C3                  4
+ 97: 2023-01-01 06:36:40 2023-01-01 06:38:34   B3,C3,A6,A5                  4
+108: 2023-01-01 06:37:43 2023-01-01 06:40:48      C3,A6,A5                  3
+119: 2023-01-01 06:39:48 2023-01-01 06:46:10      C3,A5,A6                  3

Considerations for using data.table

+

The package offers a wonderful, nearly one-stop solution that doesn’t require you to write the logic out for the query or command yourself, but has a major problem for a lot of users - it requires you to switch your codebase to R, and a lot of your tasks may be on Python or in an SQL pipeline. So, what do you do?

+

Consider the effort in maintaining an additional dependency for your analytics pipeline (i.e. R), and the effort that you’ll need to invest to run R from Python, or run an R script in your pipeline and pull the output from it back into the pipeline, and make your call.

+ +
+

+ +

+ + +

+ + Reply to this post by email ↪ + +

+ + + +
+ + + + + + diff --git a/public/projects/index.html b/public/projects/index.html new file mode 100644 index 0000000..090c574 --- /dev/null +++ b/public/projects/index.html @@ -0,0 +1,19 @@ +projects | Avinash's Blog
+

Avinash's Blog

Most of my work is on private repositories, but I do find some time to learn new topics, contribute back to some of the open source packages I frequently use, or to create interesting tools.

Featured projects

  1. BorrowChecker: A play on the same concept in Rust, this is a simple web-app that allows you to split complex receipts with multiple people in a simple manner. Runs entirely in-browser. Made with Dioxus and Rust. Repository link.
  2. PowerPointSnap: A mostly feature complete tool for PowerPoint on VBA that is filled with a lot of tricks to make it easy to consistently format presentations to impress clients - from my consulting days. Written in VBA. See accompanying blog post.

Other work or contributions

  1. IntelligentReceiptSplitter: A relatively simple predecessor to BorrowChecker that focussed on using an OCR framework followed by an LLM based parser to read receipts that could be further split manually. This combination significantly reduced hallucinations from LLMs but was still very computationally intensive to run.
  2. r.data.table.funs: A very small set of R functions that use data.table, that I found very useful earlier in my career to quicky churn out analyses. It is not ground-breaking, but rather something that anybody with sufficient basic skills in R and understand, and save an immense amount of time.
  3. I wrote several chapters of the Polars Book, which have since been moved to the main Polars repository. Polars was a breadth of fresh air in terms of speed and ergonomics, which I had been sorely missing after switching to Python from R (where projects like data.table and dplyr dominated), so I was eager to make it better for everybody making the switch.

© Avinash Mallya | Design via Bear Cub.
\ No newline at end of file diff --git a/public/projects/index.xml b/public/projects/index.xml new file mode 100644 index 0000000..1c9c7a6 --- /dev/null +++ b/public/projects/index.xml @@ -0,0 +1,25 @@ + + + + Projects on Avinash's Blog + http://localhost:1313/projects/ + Recent content in Projects on Avinash's Blog + Hugo -- gohugo.io + en-US + © Avinash Mallya + + + projects + http://localhost:1313/projects/projects/ + Mon, 01 Jan 0001 00:00:00 +0000 + http://localhost:1313/projects/projects/ + <h1 id="featured-projects">Featured projects</h1> <ol> <li><a href="https://avimallu.github.io/BorrowChecker/">BorrowChecker</a>: A play on the same concept in Rust, this is a simple web-app that allows you to split complex receipts with multiple people in a simple manner. Runs entirely in-browser. Made with Dioxus and Rust. <a href="https://github.com/avimallu/BorrowChecker">Repository link</a>.</li> <li><a href="https://github.com/avimallu/PowerPointSnap">PowerPointSnap</a>: A mostly feature complete tool for PowerPoint on VBA that is filled with a lot of tricks to make it easy to consistently format presentations to impress clients - from my consulting days. Written in VBA. See accompanying <a href="https://avimallu.github.io/PowerPointSnap">blog post</a>.</li> </ol> + Featured projects +
    +
  1. BorrowChecker: A play on the same concept in Rust, this is a simple web-app that allows you to split complex receipts with multiple people in a simple manner. Runs entirely in-browser. Made with Dioxus and Rust. Repository link.
  2. +
  3. PowerPointSnap: A mostly feature complete tool for PowerPoint on VBA that is filled with a lot of tricks to make it easy to consistently format presentations to impress clients - from my consulting days. Written in VBA. See accompanying blog post.
  4. +
+]]>
+
+
+
diff --git a/public/projects/projects/index.html b/public/projects/projects/index.html new file mode 100644 index 0000000..18b5f9a --- /dev/null +++ b/public/projects/projects/index.html @@ -0,0 +1,107 @@ + + + + + + + +projects | Avinash's Blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +

Avinash's Blog

+ +
+
+ + +

Featured projects

+
    +
  1. BorrowChecker: A play on the same concept in Rust, this is a simple web-app that allows you to split complex receipts with multiple people in a simple manner. Runs entirely in-browser. Made with Dioxus and Rust. Repository link.
  2. +
  3. PowerPointSnap: A mostly feature complete tool for PowerPoint on VBA that is filled with a lot of tricks to make it easy to consistently format presentations to impress clients - from my consulting days. Written in VBA. See accompanying blog post.
  4. +
+ +
+

+ +

+ + + + +
+
+ © Avinash Mallya | Design via Bear Cub. +
+ + + + + diff --git a/public/robots.txt b/public/robots.txt new file mode 100644 index 0000000..ac5dc4c --- /dev/null +++ b/public/robots.txt @@ -0,0 +1,3 @@ +User-agent: * +Allow: / +Sitemap: https://avimallu.dev/sitemap.xml diff --git a/public/sitemap.xml b/public/sitemap.xml new file mode 100644 index 0000000..494b08c --- /dev/null +++ b/public/sitemap.xml @@ -0,0 +1 @@ +https://avimallu.dev/2023-10-20T00:00:00+00:00https://avimallu.dev/blog/2023-10-20T00:00:00+00:00https://avimallu.dev/projects/https://avimallu.dev/tags/powerpoint/2023-10-20T00:00:00+00:00https://avimallu.dev/tags/ppt/2023-10-20T00:00:00+00:00https://avimallu.dev/blog/003_powerpointsnap/2023-10-20T00:00:00+00:00https://avimallu.dev/tags/2023-10-20T00:00:00+00:00https://avimallu.dev/tags/vba/2023-10-20T00:00:00+00:00https://avimallu.dev/tags/approximate/2023-10-19T00:00:00+00:00https://avimallu.dev/tags/category/2023-10-19T00:00:00+00:00https://avimallu.dev/tags/faiss/2023-10-19T00:00:00+00:00https://avimallu.dev/blog/002_representative_samples/2023-10-19T00:00:00+00:00https://avimallu.dev/tags/graph/2023-10-19T00:00:00+00:00https://avimallu.dev/tags/nearest/2023-10-19T00:00:00+00:00https://avimallu.dev/tags/neighbor/2023-10-19T00:00:00+00:00https://avimallu.dev/tags/network/2023-10-19T00:00:00+00:00https://avimallu.dev/tags/networkx/2023-10-19T00:00:00+00:00https://avimallu.dev/tags/polars/2023-10-19T00:00:00+00:00https://avimallu.dev/tags/representative/2023-10-19T00:00:00+00:00https://avimallu.dev/tags/samples/2023-10-19T00:00:00+00:00https://avimallu.dev/blog/001_overlap_joins/2023-06-22T00:00:00+00:00https://avimallu.dev/categories/ \ No newline at end of file diff --git a/public/syntax.min.css b/public/syntax.min.css new file mode 100644 index 0000000..d50e07d --- /dev/null +++ b/public/syntax.min.css @@ -0,0 +1 @@ +.bg{color:#f8f8f2;background-color:#282a36}.chroma{color:#f8f8f2;background-color:#282a36}.chroma .lnlinks{outline:none;text-decoration:none;color:inherit}.chroma .lntd{vertical-align:top;padding:0;margin:0;border:0}.chroma .lntable{border-spacing:0;padding:0;margin:0;border:0}.chroma .hl{background-color:#ffc}.chroma .lnt{white-space:pre;user-select:none;margin-right:.4em;padding:0 .4em;color:#929292}.chroma .ln{white-space:pre;user-select:none;margin-right:.4em;padding:0 .4em;color:#929292}.chroma .line{display:flex}.chroma .k{color:#ff79c6}.chroma .kc{color:#ff79c6}.chroma .kd{color:#8be9fd;font-style:italic}.chroma .kn{color:#ff79c6}.chroma .kp{color:#ff79c6}.chroma .kr{color:#ff79c6}.chroma .kt{color:#8be9fd}.chroma .na{color:#50fa7b}.chroma .nb{color:#8be9fd;font-style:italic}.chroma .nc{color:#50fa7b}.chroma .nf{color:#50fa7b}.chroma .nl{color:#8be9fd;font-style:italic}.chroma .nt{color:#ff79c6}.chroma .nv{color:#8be9fd;font-style:italic}.chroma .vc{color:#8be9fd;font-style:italic}.chroma .vg{color:#8be9fd;font-style:italic}.chroma .vi{color:#8be9fd;font-style:italic}.chroma .s{color:#f1fa8c}.chroma .sa{color:#f1fa8c}.chroma .sb{color:#f1fa8c}.chroma .sc{color:#f1fa8c}.chroma .dl{color:#f1fa8c}.chroma .sd{color:#f1fa8c}.chroma .s2{color:#f1fa8c}.chroma .se{color:#f1fa8c}.chroma .sh{color:#f1fa8c}.chroma .si{color:#f1fa8c}.chroma .sx{color:#f1fa8c}.chroma .sr{color:#f1fa8c}.chroma .s1{color:#f1fa8c}.chroma .ss{color:#f1fa8c}.chroma .m{color:#bd93f9}.chroma .mb{color:#bd93f9}.chroma .mf{color:#bd93f9}.chroma .mh{color:#bd93f9}.chroma .mi{color:#bd93f9}.chroma .il{color:#bd93f9}.chroma .mo{color:#bd93f9}.chroma .o{color:#ff79c6}.chroma .ow{color:#ff79c6}.chroma .c{color:#8491b8}.chroma .ch{color:#8491b8}.chroma .cm{color:#8491b8}.chroma .c1{color:#8491b8}.chroma .cs{color:#8491b8}.chroma .cp{color:#ff79c6}.chroma .cpf{color:#ff79c6}.chroma .gd{color:#f55}.chroma .ge{text-decoration:underline}.chroma .gh{font-weight:700}.chroma .gi{color:#50fa7b;font-weight:700}.chroma .go{color:#44475a}.chroma .gu{font-weight:700}.chroma .gl{text-decoration:underline} \ No newline at end of file diff --git a/public/tags/approximate/index.html b/public/tags/approximate/index.html new file mode 100644 index 0000000..b7de361 --- /dev/null +++ b/public/tags/approximate/index.html @@ -0,0 +1,6 @@ +Approximate | Avinash's Blog
+

Avinash's Blog

Filtering for "Approximate"

© Avinash Mallya | Design via Bear Cub.
\ No newline at end of file diff --git a/public/tags/approximate/index.xml b/public/tags/approximate/index.xml new file mode 100644 index 0000000..1180bce --- /dev/null +++ b/public/tags/approximate/index.xml @@ -0,0 +1,383 @@ +Approximate on Avinash's Bloghttps://avimallu.dev/tags/approximate/Recent content in Approximate on Avinash's BlogHugo -- gohugo.ioen-US© Avinash MallyaThu, 19 Oct 2023 00:00:00 +0000Finding representative samples efficiently for large datasetshttps://avimallu.dev/blog/002_representative_samples/Thu, 19 Oct 2023 00:00:00 +0000https://avimallu.dev/blog/002_representative_samples/<h1 id="premise">Premise</h1> +<p>In this day and age, we&rsquo;re not short on data. <em>Good</em> data, on the other hand, is very valuable. When you&rsquo;ve got a large amount of improperly labelled data, it may become hard to find to find a representative dataset to train a model on such that it generalizes well.</p> +<p>Let&rsquo;s formalize the problem a little so that a proper approach can be developed. Here&rsquo;s the problem statement:</p> +<ol> +<li>You have a large-ish set of (imperfectly) labelled data points. These data points can be represented as a 2D matrix.</li> +<li>You need to train a model to classify these data points on either these labels, or on labels dervied from imperfect labels.</li> +<li>You need a good (but not perfect) representative sample for the model to be generalizable, but there are too many data points for each label to manually pick representative examples.</li> +</ol> +<h2 id="in-a-hurry">In a hurry?</h2> +<p>Here&rsquo;s what you need to do:</p>Premise +

In this day and age, we’re not short on data. Good data, on the other hand, is very valuable. When you’ve got a large amount of improperly labelled data, it may become hard to find to find a representative dataset to train a model on such that it generalizes well.

+

Let’s formalize the problem a little so that a proper approach can be developed. Here’s the problem statement:

+
    +
  1. You have a large-ish set of (imperfectly) labelled data points. These data points can be represented as a 2D matrix.
  2. +
  3. You need to train a model to classify these data points on either these labels, or on labels dervied from imperfect labels.
  4. +
  5. You need a good (but not perfect) representative sample for the model to be generalizable, but there are too many data points for each label to manually pick representative examples.
  6. +
+

In a hurry?

+

Here’s what you need to do:

+
    +
  1. Read the premise and see if it fits your problem.
  2. +
  3. Go to the For the folks in a hurry! section at the end to find the generic solution and how it works.
  4. +
+

Why do we need representative samples?

+

Generally, three things come to mind:

+
    +
  1. Allows the model to be generalizable for all kinds of data points within a category.
  2. +
  3. Allows for faster training of the model - you need fewer data points to get the same accuracy!
  4. +
  5. Allows maintaining the training set - if your training set needs validation by experts or annotations, this keeps your costs low!
  6. +
+

Define the data

+

This data can be practically anything that can be represented as a 2D matrix.

+

There are exceptions. Raw image data (as numbers) might get difficult because even if you flatten them, they’ll be significant correlation between features. For example, a face can appear practically anywhere in the image, and all pixels centered around the face will be highly correlated, even if they are on different lines. A workaround in this case would be to pipe the image through a CNN model that has been trained on some generic task and produces a 1D representation of a single image in the final hidden layer before the output. Other data will need further processing along similar lines.

+

Get a specific dataset

+

For this specific article, I will use the ShopMania dataset on Kaggle. I apologize in advance for not using a more easily accessible dataset (you need to sign into Kaggle to download it) - and I’m not 100% sure if the GPL allows me to create a copy of the data and place it in my own repository. Nevertheless, the data (if you download it and choose to use it instead of some other dataset) will look like this:

+
+

NOTE: whenever I want to show an output along with the code I used for it, you’ll see the characters >> indicating the command used, and the output to be without those prefixes.

+
+ + + + + +
 1>> import polars as pl
+ 2>> data = pl.read_csv("archive/shopmania.csv")
+ 3>> data
+ 4shape: (313_705, 4)
+ 5┌────────────┬──────────────────────────────────────────────────────┬─────────────┬────────────────┐
+ 6 product_ID  product_title                                         category_ID  category_label 
+ 7 ---         ---                                                   ---          ---            
+ 8 i64         str                                                   i64          str            
+ 9╞════════════╪══════════════════════════════════════════════════════╪═════════════╪════════════════╡
+10 2           twilight central park print                           2            Collectibles   
+11 3           fox print                                             2            Collectibles   
+12 4           circulo de papel wall art                             2            Collectibles   
+13 5           hidden path print                                     2            Collectibles   
+14                                                                                           
+15 313703      deago anti fog swimming diving full face mask         229          Water Sports   
+16             surface snorkel scuba fr gopro black s/m                                          
+17 313704      etc buys full face gopro compatible snorkel scuba     229          Water Sports   
+18             diving mask blue large/xtralarge blue                                             
+19 313705      men 039 s full face breathe free diving snorkel mask  229          Water Sports   
+20             scuba optional hd camera blue mask only adult men                                 
+21 313706      women 039 s full face breathe free diving snorkel     229          Water Sports   
+22             mask scuba optional hd camera black mask only                                     
+23             children and women                                                                
+24└────────────┴──────────────────────────────────────────────────────┴─────────────┴────────────────┘

The data documentation on Kaggle states:

+
+

The first dataset originates from ShopMania, a popular online product comparison platform. It enlists tens of millions of products organized in a three-level hierarchy that includes 230 categories. The two higher levels of the hierarchy include 39 categories, whereas the third lower level accommodates the rest 191 leaf categories. Each product is categorized into this tree structure by being mapped to only one leaf category. Some of these 191 leaf categories contain millions of products. However, shopmania.com allows only the first 10,000 products to be retrieved from each category. Under this restriction, our crawler managed to collect 313,706 products.

+
+

For demonstration, I’ll just limit the categories to those that have exactly 10,000 occurences.

+ + + + + +
1data = (
+2    data
+3    .filter(pl.count().over("category_ID") == 10000)
+4)

You’ll notice that there are only 17 categories in this dataset. Run this to verify that fact.

+ + + + + +
 1>>> data.get_column("category_label").unique()
+ 2shape: (17,)
+ 3Series: 'category_label' [str]
+ 4[
+ 5    "Kitchen & Dining"
+ 6    "Scarves and wraps"
+ 7    "Handbags & Wallets"
+ 8    "Rugs  Tapestry & Linens"
+ 9    "Cell Phones Accessories"
+10    "Men's Clothing"
+11    "Jewelry"
+12    "Belts"
+13    "Men Lingerie"
+14    "Crafts"
+15    "Football"
+16    "Medical Supplies"
+17    "Adult"
+18    "Hunting"
+19    "Women's Clothing"
+20    "Pet Supply"
+21    "Office Supplies"
+22]

Note that this is very easy in Polars, which is the package I typically use for data manipulation. I recommend using it over Pandas.

+

Specify the task

+

Okay - so now we have exactly 10,000 products per category. We only have the title of the product that can be leveraged for categorization. So let me define the task this way:

+
+

Craft a small representative sample for each category.

+
+

Why small? It helps that it’ll make the model faster to train - and keep the training data manageable in size.

+

Finding representative samples

+

I mentioned earlier that we need to represent data as a 2D matrix for the technique I have in mind to work. How can I translate a list of text to a matrix? The answer’s rather simple: use SentenceTransformers to get a string’s embedding. You could also use more classic techniques like computing TF-IDF values, or use more advanced transformers, but I’ve noticed that SentenceTransformers are able to capture semantic meaning of sentences rather well (assuming you use a good model suited for the language the data is in) - they are trained on sentence similarity after all.

+

Getting SentenceTransformer embeddings

+

This part is rather simple. If you’re unable to install SentenceTransformers, please check their website.

+ + + + + +
1import sentence_transformers
+2# See list of models at www.sbert.net/docs/pretrained_models.html
+3ST = sentence_transformers.SentenceTransformer("all-mpnet-base-v2")
+4title_embeddings = (
+5    ST.encode(
+6        data.get_column("product_title").to_list(),
+7        show_progress_bar=True, convert_to_tensor=True)
+8    .numpy())

This process will be slow (~30 minutes) if you don’t have a GPU. There are faster approaches, but they are slightly more involved than would be beneficial for a blog post. The wait will be worth it, I promise! In addition, the call to .numpy() at the end is to directly get a single numpy array - otherwise you get a list of numpy arrays, which is rather inefficient. Further, SentenceTransformers will try to run on the GPU if available, and if so, you will need to write .cpu().numpy() so that the tensor is copied from the GPU to the CPU.

+
+

NOTE: for a proof-of-concept implementation, or if you’re on the CPU, try the all-MiniLM-L6-v2 model. It’s a much smaller and much faster model, although you sacrifice a little in terms of accuracy.

+
+

The concept of approximate nearest neighbors

+

Performing any kind of nearest neighbor algorithm on medium scale datasets (even bordering 10,000 rows and tens of columns) tends to be slow. A primary driver of this was the need to calculate all, or nearly all distances between all data points. Approximate nearest neighbor (ANN) algorithms work around this through various approaches, which warrant their own blog post. For now, it would suffice to understand that there are shortcuts that ANN algorithms take to give you if not the exact nearest neighbor, at least one of the nearest neighbors (hence the term approximate).

+

There are several algorithms that you can use - I shall proceed with faiss, because it has a nice Python interface and is rather easy to work with. You can use any algorithm - a full list of the major ones are available here.

+

I’ll explain why we’re in the nearest neighbor territory in due course.

+

Building the database

+

To build the database, all we need is the title_embeddings matrix.

+ + + + + +
1import faiss
+2def create_index(title_embeddings):
+3    d = title_embeddings.shape[1]    # Number of dimensions
+4    ann_index = faiss.IndexFlatL2(d) # Index using Eucledian Matrix
+5    ann_index.add(title_embeddings)  # Build the index
+6    
+7    return ann_index # Faiss considers databases an "index"

This does create a database. But remember, we’re trying to find representative samples - which means we need to do this by the category (or label). So let’s design a function that sends only the necessary data as that for a particular category, and then create the database. We’ll need three pieces of information from this function:

+
    +
  1. The actual faiss database.
  2. +
  3. The actual subset of data that was used to build this index.
  4. +
  5. The label indices with respect to the original data that went into the faiss database.
  6. +
+

(2) and (3) will help us later in rebuilding a “network graph” that will allow us to reference the original data points.

+ + + + + +
 1import faiss
+ 2import numpy as np
+ 3import polars as pl
+ 4
+ 5def create_index(label):
+ 6    faiss_indices = (
+ 7        data # this needs to be an argument if you want to create a generic function
+ 8        .with_row_count("row_idx")
+ 9        .filter(pl.col("category_label") == label)
+10        .get_column("row_idx")
+11        .to_list()
+12    )
+13    
+14    faiss_data = title_embeddings[faiss_indices]
+15    d = data.shape[1]               # Number of dimensions
+16    faiss_DB = faiss.IndexFlatIP(d) # Index using Inner Product
+17    faiss.normalize_L2(data)        # Normalized L2 with Inner Product search = cosine similarity
+18    # Why cosine similarity? It's easier to specify thresholds - they'll always be between 0 and 1.4.
+19    # If using Eucledian or other distance, we'll have to spend some time finding a good range
+20    # where distances are reasonable. See https://stats.stackexchange.com/a/146279 for details.
+21    faiss_DB.add(data)              # Build the index
+22    
+23    return faiss_DB, faiss_data, faiss_indices

Identifying the nearest neighbors

+

To proceed with getting a representative sample, the next step is to find the nearest neighbors for all data points in the database. This isn’t too hard - faiss index objects have a built-in search method to find the k nearest neighbors for a given index, along with the (approximate) distance to it. Let’s then write a function to get the following information: the label index for whom nearest neighbors are being searched, the indices of said nearest neighbors and the distance between them. In network graph parlance, this kind of data is called an edge list i.e. a list of pair of nodes that are connected, along with any additional information that specifies a property (in this case distance) of the edge that connects these nodes.

+ + + + + +
 1def get_edge_list(label, k=5):
+ 2    faiss_DB, faiss_data, faiss_indices = create_index(label)
+ 3    # To map the data back to the original `train[b'data']` array
+ 4    faiss_indices_map = {i: x for i,x in enumerate(faiss_indices)}
+ 5    # To map the indices back to the original strings
+ 6    title_name_map = {i: x for i,x in data.select("row_idx", "product_title").rows()}
+ 7    distances, neighbors = faiss_DB.search(faiss_data, k)
+ 8    
+ 9    return (
+10        pl.DataFrame({
+11            "from": faiss_indices})
+12        .with_columns(
+13            pl.Series("to", neighbors),
+14            pl.Series("distance", distances))
+15        .explode("to", "distance")
+16        .with_columns(
+17            pl.col("from")
+18            .map_dict(title_name_map),
+19            pl.col("to")
+20            .map_dict(faiss_indices_map)
+21            .map_dict(title_name_map))
+22        .filter(pl.col("from") != pl.col("to"))
+23    )                   

NetworkX and Connected Components

+

The next step in the process is to create a network graph using the edge-list. But why?

+

Remember that we have identified the (k=5) nearest neighbors of each data point. Let’s say that we have a point A that has a nearest neighbor B. C is not a nearest neighbor of A, but it is a nearest neighbor of B. In a network graph, if A and C are sufficiently similar enough to B within a particular minimum thershold, then A will be connected to C through B! Hopefully a small visual below would help.

+

How a network component is formed.

+

What happens when such a concept is extended for many data points? Not all of them would be connected - because we’re applying a minimum threshold that they have to meet. This is the only hueristic part of the rather fast process. Here’s one more helpful visual:

+

How a network cluster is formed.

+

Very starry night-eque vibes here. Let’s get to the code.

+ + + + + +
1import networkx as nx
+2def get_cluster_map(label, k=5, min_cosine_distance=0.95):
+3    edge_list = (
+4        get_edge_list(label, k=k)
+5        .filter(pl.col("distance") >= min_cosine_distance)
+6    )
+7    graph = nx.from_pandas_edgelist(edge_list.to_pandas(), source="from", target="to")
+8    return {i: list(x) for i,x in enumerate(nx.connected_components(graph))}

Getting clusters

+

Now that all the parts of the puzzle are together, let’s run it to see what kind of clusters you get for Cell Phone Accessories.

+ + + + + +
1clusters = get_cluster_map("Cell Phones Accessories", 5, 0.95)

Make sure to configure the following if your results aren’t good enough:

+
    +
  1. Relax the min_cosine_distance value if you want bigger clusters.
  2. +
  3. Increase the number of nearest neighbors if you want more matches.
  4. +
+

Viewing the components

+

There will likely be many clusters (you can see how many exactly with len(clusters)). Let’s look at a random cluster:

+ + + + + +
1>> clusters[3]
+2['smartphone lanyard with card slot for any phone up to 6 yellow 72570099',
+3 'smartphone lanyard with card slot for any phone up to 6 black 72570093',
+4 'smartphone lanyard with card slot for any phone up to 6 lightblue 72570097',
+5 'smartphone lanyard with card slot for any phone up to 6 blue 72570095',
+6 'smartphone lanyard with card slot for any phone up to 6 green 72570101',
+7 'smartphone lanyard with card slot for any phone up to 6 pink 72570091']

Let’s see another cluster that had 172(!) members in my run (the clusters themselves will be stable, but their indices may change in each run owing to some inherent randomness in the process).

+ + + + + +
 1>>> clusters[6]
+ 2['otm essentials iphone 8/7 modern clear printed phone case snowflakes iphone 8/7 op qq z051a',
+ 3 'otm essentials iphone 8/7 modern clear printed phone case iphone 8/7 arrows blue op qq a02 58',
+ 4 'otm essentials iphone 8/7/6s clear printed phone case single iphone 8/7/6s golden pineapple op qq z089a',
+ 5 'otm essentials iphone 8/7/6s clear printed phone case single iphone 8/7/6s butteryfly delight yellow op qq z029d',
+ 6 'otm essentials iphone 8/7 modern clear printed phone case iphone 8/7 luck of the irish op qq a01 45',
+ 7 'otm essentials iphone 8/7 modern clear printed phone case iphone 8/7 brides maid white op qq a02 16',
+ 8 ...
+ 9 'otm essentials iphone 8/7 modern clear printed phone case iphone 8/7 flying arrows white op qq hip 20',
+10 'otm essentials iphone 8/7 modern clear printed phone case iphone 8/7 brides maid pink white op qq a02 17',
+11 'otm essentials iphone 8/7 modern clear printed phone case iphone 8/7 anemone flowers white op qq z036a',
+12 'otm essentials iphone 8/7 modern clear printed phone case mustache iphone 8/7 op qq hip 08',
+13 'otm essentials iphone 8/7 modern clear printed phone case oh snap iphone 8/7 op qq z053a',
+14 'otm essentials iphone 8/7/6s clear printed phone case single iphone 8/7/6s desert cacti orange pink op qq a02 22']

Running for all categories

+

This isn’t that hard (although it may take more than a moment). Just iterate it for each category!

+ + + + + +
1clusters = [get_cluster_map(x, 5, 0.95) for x in data.get_column("category_label").unique()]

For the folks in a hurry!

+

I get it - you often want a solution that “just works”. I can come close to it. See below for code and a succinct explanation. For those of my readers who aren’t in a hurry, this also serves as a nice summary (and copy-pastable code)!

+

The code

+ + + + + +
 1import sentence_transformers
+ 2import faiss
+ 3import polars as pl
+ 4import numpy as np
+ 5
+ 6# Data is read here. You download the files from Kaggle here: 
+ 7# https://www.kaggle.com/datasets/lakritidis/product-classification-and-categorization
+ 8data = pl.read_csv("archive/shopmania.csv", new_columns=[
+ 9    "product_ID", "product_title", "category_ID", "category_label"])
+10data = (
+11    data
+12    .filter(pl.count().over("category_ID") == 10000)
+13    .with_row_count("row_idx")
+14)
+15
+16
+17# See list of models at www.sbert.net/docs/pretrained_models.html
+18ST = sentence_transformers.SentenceTransformer("all-mpnet-base-v2")
+19title_embeddings = (
+20    ST.encode(
+21        data.get_column("product_title").to_list(),
+22        # I'm on a MacBook, you should use `cuda` or `cpu`
+23        # if you've got different hardware.
+24        device="mps",
+25        show_progress_bar=True, convert_to_tensor=True)
+26    .cpu().numpy())
+27
+28# Code to create a FAISS index
+29def create_index(label):
+30    faiss_indices = (
+31        data # this needs to be an argument if you want to create a generic function
+32        .filter(pl.col("category_label") == label)
+33        .get_column("row_idx")
+34        .to_list()
+35    )
+36    
+37    faiss_data = title_embeddings[faiss_indices]
+38    d = faiss_data.shape[1]         # Number of dimensions
+39    faiss_DB = faiss.IndexFlatIP(d) # Index using Inner Product
+40    faiss.normalize_L2(faiss_data)  # Normalized L2 with Inner Product search = cosine similarity
+41    faiss_DB.add(faiss_data)        # Build the index
+42    
+43    return faiss_DB, faiss_data, faiss_indices
+44
+45# Code to create an edge-list
+46def get_edge_list(label, k=5):
+47    faiss_DB, faiss_data, faiss_indices = create_index(label)
+48    # To map the data back to the original `train[b'data']` array
+49    faiss_indices_map = {i: x for i,x in enumerate(faiss_indices)}
+50    # To map the indices back to the original strings
+51    title_name_map = {i: x for i,x in data.select("row_idx", "product_title").rows()}
+52    distances, neighbors = faiss_DB.search(faiss_data, k)
+53    
+54    return (
+55        pl.DataFrame({
+56            "from": faiss_indices})
+57        .with_columns(
+58            pl.Series("to", neighbors),
+59            pl.Series("distance", distances))
+60        .explode("to", "distance")
+61        .with_columns(
+62            pl.col("from")
+63            .map_dict(title_name_map),
+64            pl.col("to")
+65            .map_dict(faiss_indices_map)
+66            .map_dict(title_name_map))
+67        .filter(pl.col("from") != pl.col("to"))
+68    )
+69
+70# Code to extract components from a Network Graph
+71import networkx as nx
+72def get_cluster_map(label, k=5, min_cosine_distance=0.95):
+73    edge_list = (
+74        get_edge_list(label, k=k)
+75        .filter(pl.col("distance") >= min_cosine_distance)
+76    )
+77    graph = nx.from_pandas_edgelist(edge_list.to_pandas(), source="from", target="to")
+78    return {i: list(x) for i,x in enumerate(nx.connected_components(graph))}
+79
+80# Example call to a single category to obtain its clusters
+81clusters = get_cluster_map("Cell Phones Accessories", 5, 0.95)
+82# Example call to **all** categories to obtain all clusters
+83clusters = [get_cluster_map(x, 5, 0.95) for x in data.get_column("category_label").unique()]

How the code works

+

If you want to write down an algorithmic way of looking at this approach,

+
    +
  1. Obtain a 2D representation of the labelled/categorized data. This can be embeddings for strings, the final hidden state output from a generic CNN model for images, or a good ol’ tabular dataset where all numbers are normalized and can be expressed as such.
  2. +
  3. Create an ANN database (based on a package such as faiss) that allows you fast nearest neighbor searches. Use cosine similarity for an easy threshold determination step.
  4. +
  5. Obtain an edge-list of k (from 5 to 100) nearest neighbors for all (or a sample of data points in case your dataset is incredibly HUGE) data points in the ANN database.
  6. +
  7. Apply a minimum threshold on similarity (completely based on heuristics), and obtain the connected components of the network graph from the filtered edge-list you just created.
  8. +
  9. Map all indices back to their source data-points that make sense, and pick any number of items from each cluster (usually, I end up picking one element from each cluster), and you now have your representative sample!
  10. +
+]]>
\ No newline at end of file diff --git a/public/tags/category/index.html b/public/tags/category/index.html new file mode 100644 index 0000000..03a9806 --- /dev/null +++ b/public/tags/category/index.html @@ -0,0 +1,6 @@ +Category | Avinash's Blog
+

Avinash's Blog

Filtering for "Category"

© Avinash Mallya | Design via Bear Cub.
\ No newline at end of file diff --git a/public/tags/category/index.xml b/public/tags/category/index.xml new file mode 100644 index 0000000..50a0f9c --- /dev/null +++ b/public/tags/category/index.xml @@ -0,0 +1,383 @@ +Category on Avinash's Bloghttps://avimallu.dev/tags/category/Recent content in Category on Avinash's BlogHugo -- gohugo.ioen-US© Avinash MallyaThu, 19 Oct 2023 00:00:00 +0000Finding representative samples efficiently for large datasetshttps://avimallu.dev/blog/002_representative_samples/Thu, 19 Oct 2023 00:00:00 +0000https://avimallu.dev/blog/002_representative_samples/<h1 id="premise">Premise</h1> +<p>In this day and age, we&rsquo;re not short on data. <em>Good</em> data, on the other hand, is very valuable. When you&rsquo;ve got a large amount of improperly labelled data, it may become hard to find to find a representative dataset to train a model on such that it generalizes well.</p> +<p>Let&rsquo;s formalize the problem a little so that a proper approach can be developed. Here&rsquo;s the problem statement:</p> +<ol> +<li>You have a large-ish set of (imperfectly) labelled data points. These data points can be represented as a 2D matrix.</li> +<li>You need to train a model to classify these data points on either these labels, or on labels dervied from imperfect labels.</li> +<li>You need a good (but not perfect) representative sample for the model to be generalizable, but there are too many data points for each label to manually pick representative examples.</li> +</ol> +<h2 id="in-a-hurry">In a hurry?</h2> +<p>Here&rsquo;s what you need to do:</p>Premise +

In this day and age, we’re not short on data. Good data, on the other hand, is very valuable. When you’ve got a large amount of improperly labelled data, it may become hard to find to find a representative dataset to train a model on such that it generalizes well.

+

Let’s formalize the problem a little so that a proper approach can be developed. Here’s the problem statement:

+
    +
  1. You have a large-ish set of (imperfectly) labelled data points. These data points can be represented as a 2D matrix.
  2. +
  3. You need to train a model to classify these data points on either these labels, or on labels dervied from imperfect labels.
  4. +
  5. You need a good (but not perfect) representative sample for the model to be generalizable, but there are too many data points for each label to manually pick representative examples.
  6. +
+

In a hurry?

+

Here’s what you need to do:

+
    +
  1. Read the premise and see if it fits your problem.
  2. +
  3. Go to the For the folks in a hurry! section at the end to find the generic solution and how it works.
  4. +
+

Why do we need representative samples?

+

Generally, three things come to mind:

+
    +
  1. Allows the model to be generalizable for all kinds of data points within a category.
  2. +
  3. Allows for faster training of the model - you need fewer data points to get the same accuracy!
  4. +
  5. Allows maintaining the training set - if your training set needs validation by experts or annotations, this keeps your costs low!
  6. +
+

Define the data

+

This data can be practically anything that can be represented as a 2D matrix.

+

There are exceptions. Raw image data (as numbers) might get difficult because even if you flatten them, they’ll be significant correlation between features. For example, a face can appear practically anywhere in the image, and all pixels centered around the face will be highly correlated, even if they are on different lines. A workaround in this case would be to pipe the image through a CNN model that has been trained on some generic task and produces a 1D representation of a single image in the final hidden layer before the output. Other data will need further processing along similar lines.

+

Get a specific dataset

+

For this specific article, I will use the ShopMania dataset on Kaggle. I apologize in advance for not using a more easily accessible dataset (you need to sign into Kaggle to download it) - and I’m not 100% sure if the GPL allows me to create a copy of the data and place it in my own repository. Nevertheless, the data (if you download it and choose to use it instead of some other dataset) will look like this:

+
+

NOTE: whenever I want to show an output along with the code I used for it, you’ll see the characters >> indicating the command used, and the output to be without those prefixes.

+
+ + + + + +
 1>> import polars as pl
+ 2>> data = pl.read_csv("archive/shopmania.csv")
+ 3>> data
+ 4shape: (313_705, 4)
+ 5┌────────────┬──────────────────────────────────────────────────────┬─────────────┬────────────────┐
+ 6 product_ID  product_title                                         category_ID  category_label 
+ 7 ---         ---                                                   ---          ---            
+ 8 i64         str                                                   i64          str            
+ 9╞════════════╪══════════════════════════════════════════════════════╪═════════════╪════════════════╡
+10 2           twilight central park print                           2            Collectibles   
+11 3           fox print                                             2            Collectibles   
+12 4           circulo de papel wall art                             2            Collectibles   
+13 5           hidden path print                                     2            Collectibles   
+14                                                                                           
+15 313703      deago anti fog swimming diving full face mask         229          Water Sports   
+16             surface snorkel scuba fr gopro black s/m                                          
+17 313704      etc buys full face gopro compatible snorkel scuba     229          Water Sports   
+18             diving mask blue large/xtralarge blue                                             
+19 313705      men 039 s full face breathe free diving snorkel mask  229          Water Sports   
+20             scuba optional hd camera blue mask only adult men                                 
+21 313706      women 039 s full face breathe free diving snorkel     229          Water Sports   
+22             mask scuba optional hd camera black mask only                                     
+23             children and women                                                                
+24└────────────┴──────────────────────────────────────────────────────┴─────────────┴────────────────┘

The data documentation on Kaggle states:

+
+

The first dataset originates from ShopMania, a popular online product comparison platform. It enlists tens of millions of products organized in a three-level hierarchy that includes 230 categories. The two higher levels of the hierarchy include 39 categories, whereas the third lower level accommodates the rest 191 leaf categories. Each product is categorized into this tree structure by being mapped to only one leaf category. Some of these 191 leaf categories contain millions of products. However, shopmania.com allows only the first 10,000 products to be retrieved from each category. Under this restriction, our crawler managed to collect 313,706 products.

+
+

For demonstration, I’ll just limit the categories to those that have exactly 10,000 occurences.

+ + + + + +
1data = (
+2    data
+3    .filter(pl.count().over("category_ID") == 10000)
+4)

You’ll notice that there are only 17 categories in this dataset. Run this to verify that fact.

+ + + + + +
 1>>> data.get_column("category_label").unique()
+ 2shape: (17,)
+ 3Series: 'category_label' [str]
+ 4[
+ 5    "Kitchen & Dining"
+ 6    "Scarves and wraps"
+ 7    "Handbags & Wallets"
+ 8    "Rugs  Tapestry & Linens"
+ 9    "Cell Phones Accessories"
+10    "Men's Clothing"
+11    "Jewelry"
+12    "Belts"
+13    "Men Lingerie"
+14    "Crafts"
+15    "Football"
+16    "Medical Supplies"
+17    "Adult"
+18    "Hunting"
+19    "Women's Clothing"
+20    "Pet Supply"
+21    "Office Supplies"
+22]

Note that this is very easy in Polars, which is the package I typically use for data manipulation. I recommend using it over Pandas.

+

Specify the task

+

Okay - so now we have exactly 10,000 products per category. We only have the title of the product that can be leveraged for categorization. So let me define the task this way:

+
+

Craft a small representative sample for each category.

+
+

Why small? It helps that it’ll make the model faster to train - and keep the training data manageable in size.

+

Finding representative samples

+

I mentioned earlier that we need to represent data as a 2D matrix for the technique I have in mind to work. How can I translate a list of text to a matrix? The answer’s rather simple: use SentenceTransformers to get a string’s embedding. You could also use more classic techniques like computing TF-IDF values, or use more advanced transformers, but I’ve noticed that SentenceTransformers are able to capture semantic meaning of sentences rather well (assuming you use a good model suited for the language the data is in) - they are trained on sentence similarity after all.

+

Getting SentenceTransformer embeddings

+

This part is rather simple. If you’re unable to install SentenceTransformers, please check their website.

+ + + + + +
1import sentence_transformers
+2# See list of models at www.sbert.net/docs/pretrained_models.html
+3ST = sentence_transformers.SentenceTransformer("all-mpnet-base-v2")
+4title_embeddings = (
+5    ST.encode(
+6        data.get_column("product_title").to_list(),
+7        show_progress_bar=True, convert_to_tensor=True)
+8    .numpy())

This process will be slow (~30 minutes) if you don’t have a GPU. There are faster approaches, but they are slightly more involved than would be beneficial for a blog post. The wait will be worth it, I promise! In addition, the call to .numpy() at the end is to directly get a single numpy array - otherwise you get a list of numpy arrays, which is rather inefficient. Further, SentenceTransformers will try to run on the GPU if available, and if so, you will need to write .cpu().numpy() so that the tensor is copied from the GPU to the CPU.

+
+

NOTE: for a proof-of-concept implementation, or if you’re on the CPU, try the all-MiniLM-L6-v2 model. It’s a much smaller and much faster model, although you sacrifice a little in terms of accuracy.

+
+

The concept of approximate nearest neighbors

+

Performing any kind of nearest neighbor algorithm on medium scale datasets (even bordering 10,000 rows and tens of columns) tends to be slow. A primary driver of this was the need to calculate all, or nearly all distances between all data points. Approximate nearest neighbor (ANN) algorithms work around this through various approaches, which warrant their own blog post. For now, it would suffice to understand that there are shortcuts that ANN algorithms take to give you if not the exact nearest neighbor, at least one of the nearest neighbors (hence the term approximate).

+

There are several algorithms that you can use - I shall proceed with faiss, because it has a nice Python interface and is rather easy to work with. You can use any algorithm - a full list of the major ones are available here.

+

I’ll explain why we’re in the nearest neighbor territory in due course.

+

Building the database

+

To build the database, all we need is the title_embeddings matrix.

+ + + + + +
1import faiss
+2def create_index(title_embeddings):
+3    d = title_embeddings.shape[1]    # Number of dimensions
+4    ann_index = faiss.IndexFlatL2(d) # Index using Eucledian Matrix
+5    ann_index.add(title_embeddings)  # Build the index
+6    
+7    return ann_index # Faiss considers databases an "index"

This does create a database. But remember, we’re trying to find representative samples - which means we need to do this by the category (or label). So let’s design a function that sends only the necessary data as that for a particular category, and then create the database. We’ll need three pieces of information from this function:

+
    +
  1. The actual faiss database.
  2. +
  3. The actual subset of data that was used to build this index.
  4. +
  5. The label indices with respect to the original data that went into the faiss database.
  6. +
+

(2) and (3) will help us later in rebuilding a “network graph” that will allow us to reference the original data points.

+ + + + + +
 1import faiss
+ 2import numpy as np
+ 3import polars as pl
+ 4
+ 5def create_index(label):
+ 6    faiss_indices = (
+ 7        data # this needs to be an argument if you want to create a generic function
+ 8        .with_row_count("row_idx")
+ 9        .filter(pl.col("category_label") == label)
+10        .get_column("row_idx")
+11        .to_list()
+12    )
+13    
+14    faiss_data = title_embeddings[faiss_indices]
+15    d = data.shape[1]               # Number of dimensions
+16    faiss_DB = faiss.IndexFlatIP(d) # Index using Inner Product
+17    faiss.normalize_L2(data)        # Normalized L2 with Inner Product search = cosine similarity
+18    # Why cosine similarity? It's easier to specify thresholds - they'll always be between 0 and 1.4.
+19    # If using Eucledian or other distance, we'll have to spend some time finding a good range
+20    # where distances are reasonable. See https://stats.stackexchange.com/a/146279 for details.
+21    faiss_DB.add(data)              # Build the index
+22    
+23    return faiss_DB, faiss_data, faiss_indices

Identifying the nearest neighbors

+

To proceed with getting a representative sample, the next step is to find the nearest neighbors for all data points in the database. This isn’t too hard - faiss index objects have a built-in search method to find the k nearest neighbors for a given index, along with the (approximate) distance to it. Let’s then write a function to get the following information: the label index for whom nearest neighbors are being searched, the indices of said nearest neighbors and the distance between them. In network graph parlance, this kind of data is called an edge list i.e. a list of pair of nodes that are connected, along with any additional information that specifies a property (in this case distance) of the edge that connects these nodes.

+ + + + + +
 1def get_edge_list(label, k=5):
+ 2    faiss_DB, faiss_data, faiss_indices = create_index(label)
+ 3    # To map the data back to the original `train[b'data']` array
+ 4    faiss_indices_map = {i: x for i,x in enumerate(faiss_indices)}
+ 5    # To map the indices back to the original strings
+ 6    title_name_map = {i: x for i,x in data.select("row_idx", "product_title").rows()}
+ 7    distances, neighbors = faiss_DB.search(faiss_data, k)
+ 8    
+ 9    return (
+10        pl.DataFrame({
+11            "from": faiss_indices})
+12        .with_columns(
+13            pl.Series("to", neighbors),
+14            pl.Series("distance", distances))
+15        .explode("to", "distance")
+16        .with_columns(
+17            pl.col("from")
+18            .map_dict(title_name_map),
+19            pl.col("to")
+20            .map_dict(faiss_indices_map)
+21            .map_dict(title_name_map))
+22        .filter(pl.col("from") != pl.col("to"))
+23    )                   

NetworkX and Connected Components

+

The next step in the process is to create a network graph using the edge-list. But why?

+

Remember that we have identified the (k=5) nearest neighbors of each data point. Let’s say that we have a point A that has a nearest neighbor B. C is not a nearest neighbor of A, but it is a nearest neighbor of B. In a network graph, if A and C are sufficiently similar enough to B within a particular minimum thershold, then A will be connected to C through B! Hopefully a small visual below would help.

+

How a network component is formed.

+

What happens when such a concept is extended for many data points? Not all of them would be connected - because we’re applying a minimum threshold that they have to meet. This is the only hueristic part of the rather fast process. Here’s one more helpful visual:

+

How a network cluster is formed.

+

Very starry night-eque vibes here. Let’s get to the code.

+ + + + + +
1import networkx as nx
+2def get_cluster_map(label, k=5, min_cosine_distance=0.95):
+3    edge_list = (
+4        get_edge_list(label, k=k)
+5        .filter(pl.col("distance") >= min_cosine_distance)
+6    )
+7    graph = nx.from_pandas_edgelist(edge_list.to_pandas(), source="from", target="to")
+8    return {i: list(x) for i,x in enumerate(nx.connected_components(graph))}

Getting clusters

+

Now that all the parts of the puzzle are together, let’s run it to see what kind of clusters you get for Cell Phone Accessories.

+ + + + + +
1clusters = get_cluster_map("Cell Phones Accessories", 5, 0.95)

Make sure to configure the following if your results aren’t good enough:

+
    +
  1. Relax the min_cosine_distance value if you want bigger clusters.
  2. +
  3. Increase the number of nearest neighbors if you want more matches.
  4. +
+

Viewing the components

+

There will likely be many clusters (you can see how many exactly with len(clusters)). Let’s look at a random cluster:

+ + + + + +
1>> clusters[3]
+2['smartphone lanyard with card slot for any phone up to 6 yellow 72570099',
+3 'smartphone lanyard with card slot for any phone up to 6 black 72570093',
+4 'smartphone lanyard with card slot for any phone up to 6 lightblue 72570097',
+5 'smartphone lanyard with card slot for any phone up to 6 blue 72570095',
+6 'smartphone lanyard with card slot for any phone up to 6 green 72570101',
+7 'smartphone lanyard with card slot for any phone up to 6 pink 72570091']

Let’s see another cluster that had 172(!) members in my run (the clusters themselves will be stable, but their indices may change in each run owing to some inherent randomness in the process).

+ + + + + +
 1>>> clusters[6]
+ 2['otm essentials iphone 8/7 modern clear printed phone case snowflakes iphone 8/7 op qq z051a',
+ 3 'otm essentials iphone 8/7 modern clear printed phone case iphone 8/7 arrows blue op qq a02 58',
+ 4 'otm essentials iphone 8/7/6s clear printed phone case single iphone 8/7/6s golden pineapple op qq z089a',
+ 5 'otm essentials iphone 8/7/6s clear printed phone case single iphone 8/7/6s butteryfly delight yellow op qq z029d',
+ 6 'otm essentials iphone 8/7 modern clear printed phone case iphone 8/7 luck of the irish op qq a01 45',
+ 7 'otm essentials iphone 8/7 modern clear printed phone case iphone 8/7 brides maid white op qq a02 16',
+ 8 ...
+ 9 'otm essentials iphone 8/7 modern clear printed phone case iphone 8/7 flying arrows white op qq hip 20',
+10 'otm essentials iphone 8/7 modern clear printed phone case iphone 8/7 brides maid pink white op qq a02 17',
+11 'otm essentials iphone 8/7 modern clear printed phone case iphone 8/7 anemone flowers white op qq z036a',
+12 'otm essentials iphone 8/7 modern clear printed phone case mustache iphone 8/7 op qq hip 08',
+13 'otm essentials iphone 8/7 modern clear printed phone case oh snap iphone 8/7 op qq z053a',
+14 'otm essentials iphone 8/7/6s clear printed phone case single iphone 8/7/6s desert cacti orange pink op qq a02 22']

Running for all categories

+

This isn’t that hard (although it may take more than a moment). Just iterate it for each category!

+ + + + + +
1clusters = [get_cluster_map(x, 5, 0.95) for x in data.get_column("category_label").unique()]

For the folks in a hurry!

+

I get it - you often want a solution that “just works”. I can come close to it. See below for code and a succinct explanation. For those of my readers who aren’t in a hurry, this also serves as a nice summary (and copy-pastable code)!

+

The code

+ + + + + +
 1import sentence_transformers
+ 2import faiss
+ 3import polars as pl
+ 4import numpy as np
+ 5
+ 6# Data is read here. You download the files from Kaggle here: 
+ 7# https://www.kaggle.com/datasets/lakritidis/product-classification-and-categorization
+ 8data = pl.read_csv("archive/shopmania.csv", new_columns=[
+ 9    "product_ID", "product_title", "category_ID", "category_label"])
+10data = (
+11    data
+12    .filter(pl.count().over("category_ID") == 10000)
+13    .with_row_count("row_idx")
+14)
+15
+16
+17# See list of models at www.sbert.net/docs/pretrained_models.html
+18ST = sentence_transformers.SentenceTransformer("all-mpnet-base-v2")
+19title_embeddings = (
+20    ST.encode(
+21        data.get_column("product_title").to_list(),
+22        # I'm on a MacBook, you should use `cuda` or `cpu`
+23        # if you've got different hardware.
+24        device="mps",
+25        show_progress_bar=True, convert_to_tensor=True)
+26    .cpu().numpy())
+27
+28# Code to create a FAISS index
+29def create_index(label):
+30    faiss_indices = (
+31        data # this needs to be an argument if you want to create a generic function
+32        .filter(pl.col("category_label") == label)
+33        .get_column("row_idx")
+34        .to_list()
+35    )
+36    
+37    faiss_data = title_embeddings[faiss_indices]
+38    d = faiss_data.shape[1]         # Number of dimensions
+39    faiss_DB = faiss.IndexFlatIP(d) # Index using Inner Product
+40    faiss.normalize_L2(faiss_data)  # Normalized L2 with Inner Product search = cosine similarity
+41    faiss_DB.add(faiss_data)        # Build the index
+42    
+43    return faiss_DB, faiss_data, faiss_indices
+44
+45# Code to create an edge-list
+46def get_edge_list(label, k=5):
+47    faiss_DB, faiss_data, faiss_indices = create_index(label)
+48    # To map the data back to the original `train[b'data']` array
+49    faiss_indices_map = {i: x for i,x in enumerate(faiss_indices)}
+50    # To map the indices back to the original strings
+51    title_name_map = {i: x for i,x in data.select("row_idx", "product_title").rows()}
+52    distances, neighbors = faiss_DB.search(faiss_data, k)
+53    
+54    return (
+55        pl.DataFrame({
+56            "from": faiss_indices})
+57        .with_columns(
+58            pl.Series("to", neighbors),
+59            pl.Series("distance", distances))
+60        .explode("to", "distance")
+61        .with_columns(
+62            pl.col("from")
+63            .map_dict(title_name_map),
+64            pl.col("to")
+65            .map_dict(faiss_indices_map)
+66            .map_dict(title_name_map))
+67        .filter(pl.col("from") != pl.col("to"))
+68    )
+69
+70# Code to extract components from a Network Graph
+71import networkx as nx
+72def get_cluster_map(label, k=5, min_cosine_distance=0.95):
+73    edge_list = (
+74        get_edge_list(label, k=k)
+75        .filter(pl.col("distance") >= min_cosine_distance)
+76    )
+77    graph = nx.from_pandas_edgelist(edge_list.to_pandas(), source="from", target="to")
+78    return {i: list(x) for i,x in enumerate(nx.connected_components(graph))}
+79
+80# Example call to a single category to obtain its clusters
+81clusters = get_cluster_map("Cell Phones Accessories", 5, 0.95)
+82# Example call to **all** categories to obtain all clusters
+83clusters = [get_cluster_map(x, 5, 0.95) for x in data.get_column("category_label").unique()]

How the code works

+

If you want to write down an algorithmic way of looking at this approach,

+
    +
  1. Obtain a 2D representation of the labelled/categorized data. This can be embeddings for strings, the final hidden state output from a generic CNN model for images, or a good ol’ tabular dataset where all numbers are normalized and can be expressed as such.
  2. +
  3. Create an ANN database (based on a package such as faiss) that allows you fast nearest neighbor searches. Use cosine similarity for an easy threshold determination step.
  4. +
  5. Obtain an edge-list of k (from 5 to 100) nearest neighbors for all (or a sample of data points in case your dataset is incredibly HUGE) data points in the ANN database.
  6. +
  7. Apply a minimum threshold on similarity (completely based on heuristics), and obtain the connected components of the network graph from the filtered edge-list you just created.
  8. +
  9. Map all indices back to their source data-points that make sense, and pick any number of items from each cluster (usually, I end up picking one element from each cluster), and you now have your representative sample!
  10. +
+]]>
\ No newline at end of file diff --git a/public/tags/faiss/index.html b/public/tags/faiss/index.html new file mode 100644 index 0000000..3543593 --- /dev/null +++ b/public/tags/faiss/index.html @@ -0,0 +1,6 @@ +Faiss | Avinash's Blog
+

Avinash's Blog

Filtering for "Faiss"

© Avinash Mallya | Design via Bear Cub.
\ No newline at end of file diff --git a/public/tags/faiss/index.xml b/public/tags/faiss/index.xml new file mode 100644 index 0000000..d23e437 --- /dev/null +++ b/public/tags/faiss/index.xml @@ -0,0 +1,383 @@ +Faiss on Avinash's Bloghttps://avimallu.dev/tags/faiss/Recent content in Faiss on Avinash's BlogHugo -- gohugo.ioen-US© Avinash MallyaThu, 19 Oct 2023 00:00:00 +0000Finding representative samples efficiently for large datasetshttps://avimallu.dev/blog/002_representative_samples/Thu, 19 Oct 2023 00:00:00 +0000https://avimallu.dev/blog/002_representative_samples/<h1 id="premise">Premise</h1> +<p>In this day and age, we&rsquo;re not short on data. <em>Good</em> data, on the other hand, is very valuable. When you&rsquo;ve got a large amount of improperly labelled data, it may become hard to find to find a representative dataset to train a model on such that it generalizes well.</p> +<p>Let&rsquo;s formalize the problem a little so that a proper approach can be developed. Here&rsquo;s the problem statement:</p> +<ol> +<li>You have a large-ish set of (imperfectly) labelled data points. These data points can be represented as a 2D matrix.</li> +<li>You need to train a model to classify these data points on either these labels, or on labels dervied from imperfect labels.</li> +<li>You need a good (but not perfect) representative sample for the model to be generalizable, but there are too many data points for each label to manually pick representative examples.</li> +</ol> +<h2 id="in-a-hurry">In a hurry?</h2> +<p>Here&rsquo;s what you need to do:</p>Premise +

In this day and age, we’re not short on data. Good data, on the other hand, is very valuable. When you’ve got a large amount of improperly labelled data, it may become hard to find to find a representative dataset to train a model on such that it generalizes well.

+

Let’s formalize the problem a little so that a proper approach can be developed. Here’s the problem statement:

+
    +
  1. You have a large-ish set of (imperfectly) labelled data points. These data points can be represented as a 2D matrix.
  2. +
  3. You need to train a model to classify these data points on either these labels, or on labels dervied from imperfect labels.
  4. +
  5. You need a good (but not perfect) representative sample for the model to be generalizable, but there are too many data points for each label to manually pick representative examples.
  6. +
+

In a hurry?

+

Here’s what you need to do:

+
    +
  1. Read the premise and see if it fits your problem.
  2. +
  3. Go to the For the folks in a hurry! section at the end to find the generic solution and how it works.
  4. +
+

Why do we need representative samples?

+

Generally, three things come to mind:

+
    +
  1. Allows the model to be generalizable for all kinds of data points within a category.
  2. +
  3. Allows for faster training of the model - you need fewer data points to get the same accuracy!
  4. +
  5. Allows maintaining the training set - if your training set needs validation by experts or annotations, this keeps your costs low!
  6. +
+

Define the data

+

This data can be practically anything that can be represented as a 2D matrix.

+

There are exceptions. Raw image data (as numbers) might get difficult because even if you flatten them, they’ll be significant correlation between features. For example, a face can appear practically anywhere in the image, and all pixels centered around the face will be highly correlated, even if they are on different lines. A workaround in this case would be to pipe the image through a CNN model that has been trained on some generic task and produces a 1D representation of a single image in the final hidden layer before the output. Other data will need further processing along similar lines.

+

Get a specific dataset

+

For this specific article, I will use the ShopMania dataset on Kaggle. I apologize in advance for not using a more easily accessible dataset (you need to sign into Kaggle to download it) - and I’m not 100% sure if the GPL allows me to create a copy of the data and place it in my own repository. Nevertheless, the data (if you download it and choose to use it instead of some other dataset) will look like this:

+
+

NOTE: whenever I want to show an output along with the code I used for it, you’ll see the characters >> indicating the command used, and the output to be without those prefixes.

+
+ + + + + +
 1>> import polars as pl
+ 2>> data = pl.read_csv("archive/shopmania.csv")
+ 3>> data
+ 4shape: (313_705, 4)
+ 5┌────────────┬──────────────────────────────────────────────────────┬─────────────┬────────────────┐
+ 6 product_ID  product_title                                         category_ID  category_label 
+ 7 ---         ---                                                   ---          ---            
+ 8 i64         str                                                   i64          str            
+ 9╞════════════╪══════════════════════════════════════════════════════╪═════════════╪════════════════╡
+10 2           twilight central park print                           2            Collectibles   
+11 3           fox print                                             2            Collectibles   
+12 4           circulo de papel wall art                             2            Collectibles   
+13 5           hidden path print                                     2            Collectibles   
+14                                                                                           
+15 313703      deago anti fog swimming diving full face mask         229          Water Sports   
+16             surface snorkel scuba fr gopro black s/m                                          
+17 313704      etc buys full face gopro compatible snorkel scuba     229          Water Sports   
+18             diving mask blue large/xtralarge blue                                             
+19 313705      men 039 s full face breathe free diving snorkel mask  229          Water Sports   
+20             scuba optional hd camera blue mask only adult men                                 
+21 313706      women 039 s full face breathe free diving snorkel     229          Water Sports   
+22             mask scuba optional hd camera black mask only                                     
+23             children and women                                                                
+24└────────────┴──────────────────────────────────────────────────────┴─────────────┴────────────────┘

The data documentation on Kaggle states:

+
+

The first dataset originates from ShopMania, a popular online product comparison platform. It enlists tens of millions of products organized in a three-level hierarchy that includes 230 categories. The two higher levels of the hierarchy include 39 categories, whereas the third lower level accommodates the rest 191 leaf categories. Each product is categorized into this tree structure by being mapped to only one leaf category. Some of these 191 leaf categories contain millions of products. However, shopmania.com allows only the first 10,000 products to be retrieved from each category. Under this restriction, our crawler managed to collect 313,706 products.

+
+

For demonstration, I’ll just limit the categories to those that have exactly 10,000 occurences.

+ + + + + +
1data = (
+2    data
+3    .filter(pl.count().over("category_ID") == 10000)
+4)

You’ll notice that there are only 17 categories in this dataset. Run this to verify that fact.

+ + + + + +
 1>>> data.get_column("category_label").unique()
+ 2shape: (17,)
+ 3Series: 'category_label' [str]
+ 4[
+ 5    "Kitchen & Dining"
+ 6    "Scarves and wraps"
+ 7    "Handbags & Wallets"
+ 8    "Rugs  Tapestry & Linens"
+ 9    "Cell Phones Accessories"
+10    "Men's Clothing"
+11    "Jewelry"
+12    "Belts"
+13    "Men Lingerie"
+14    "Crafts"
+15    "Football"
+16    "Medical Supplies"
+17    "Adult"
+18    "Hunting"
+19    "Women's Clothing"
+20    "Pet Supply"
+21    "Office Supplies"
+22]

Note that this is very easy in Polars, which is the package I typically use for data manipulation. I recommend using it over Pandas.

+

Specify the task

+

Okay - so now we have exactly 10,000 products per category. We only have the title of the product that can be leveraged for categorization. So let me define the task this way:

+
+

Craft a small representative sample for each category.

+
+

Why small? It helps that it’ll make the model faster to train - and keep the training data manageable in size.

+

Finding representative samples

+

I mentioned earlier that we need to represent data as a 2D matrix for the technique I have in mind to work. How can I translate a list of text to a matrix? The answer’s rather simple: use SentenceTransformers to get a string’s embedding. You could also use more classic techniques like computing TF-IDF values, or use more advanced transformers, but I’ve noticed that SentenceTransformers are able to capture semantic meaning of sentences rather well (assuming you use a good model suited for the language the data is in) - they are trained on sentence similarity after all.

+

Getting SentenceTransformer embeddings

+

This part is rather simple. If you’re unable to install SentenceTransformers, please check their website.

+ + + + + +
1import sentence_transformers
+2# See list of models at www.sbert.net/docs/pretrained_models.html
+3ST = sentence_transformers.SentenceTransformer("all-mpnet-base-v2")
+4title_embeddings = (
+5    ST.encode(
+6        data.get_column("product_title").to_list(),
+7        show_progress_bar=True, convert_to_tensor=True)
+8    .numpy())

This process will be slow (~30 minutes) if you don’t have a GPU. There are faster approaches, but they are slightly more involved than would be beneficial for a blog post. The wait will be worth it, I promise! In addition, the call to .numpy() at the end is to directly get a single numpy array - otherwise you get a list of numpy arrays, which is rather inefficient. Further, SentenceTransformers will try to run on the GPU if available, and if so, you will need to write .cpu().numpy() so that the tensor is copied from the GPU to the CPU.

+
+

NOTE: for a proof-of-concept implementation, or if you’re on the CPU, try the all-MiniLM-L6-v2 model. It’s a much smaller and much faster model, although you sacrifice a little in terms of accuracy.

+
+

The concept of approximate nearest neighbors

+

Performing any kind of nearest neighbor algorithm on medium scale datasets (even bordering 10,000 rows and tens of columns) tends to be slow. A primary driver of this was the need to calculate all, or nearly all distances between all data points. Approximate nearest neighbor (ANN) algorithms work around this through various approaches, which warrant their own blog post. For now, it would suffice to understand that there are shortcuts that ANN algorithms take to give you if not the exact nearest neighbor, at least one of the nearest neighbors (hence the term approximate).

+

There are several algorithms that you can use - I shall proceed with faiss, because it has a nice Python interface and is rather easy to work with. You can use any algorithm - a full list of the major ones are available here.

+

I’ll explain why we’re in the nearest neighbor territory in due course.

+

Building the database

+

To build the database, all we need is the title_embeddings matrix.

+ + + + + +
1import faiss
+2def create_index(title_embeddings):
+3    d = title_embeddings.shape[1]    # Number of dimensions
+4    ann_index = faiss.IndexFlatL2(d) # Index using Eucledian Matrix
+5    ann_index.add(title_embeddings)  # Build the index
+6    
+7    return ann_index # Faiss considers databases an "index"

This does create a database. But remember, we’re trying to find representative samples - which means we need to do this by the category (or label). So let’s design a function that sends only the necessary data as that for a particular category, and then create the database. We’ll need three pieces of information from this function:

+
    +
  1. The actual faiss database.
  2. +
  3. The actual subset of data that was used to build this index.
  4. +
  5. The label indices with respect to the original data that went into the faiss database.
  6. +
+

(2) and (3) will help us later in rebuilding a “network graph” that will allow us to reference the original data points.

+ + + + + +
 1import faiss
+ 2import numpy as np
+ 3import polars as pl
+ 4
+ 5def create_index(label):
+ 6    faiss_indices = (
+ 7        data # this needs to be an argument if you want to create a generic function
+ 8        .with_row_count("row_idx")
+ 9        .filter(pl.col("category_label") == label)
+10        .get_column("row_idx")
+11        .to_list()
+12    )
+13    
+14    faiss_data = title_embeddings[faiss_indices]
+15    d = data.shape[1]               # Number of dimensions
+16    faiss_DB = faiss.IndexFlatIP(d) # Index using Inner Product
+17    faiss.normalize_L2(data)        # Normalized L2 with Inner Product search = cosine similarity
+18    # Why cosine similarity? It's easier to specify thresholds - they'll always be between 0 and 1.4.
+19    # If using Eucledian or other distance, we'll have to spend some time finding a good range
+20    # where distances are reasonable. See https://stats.stackexchange.com/a/146279 for details.
+21    faiss_DB.add(data)              # Build the index
+22    
+23    return faiss_DB, faiss_data, faiss_indices

Identifying the nearest neighbors

+

To proceed with getting a representative sample, the next step is to find the nearest neighbors for all data points in the database. This isn’t too hard - faiss index objects have a built-in search method to find the k nearest neighbors for a given index, along with the (approximate) distance to it. Let’s then write a function to get the following information: the label index for whom nearest neighbors are being searched, the indices of said nearest neighbors and the distance between them. In network graph parlance, this kind of data is called an edge list i.e. a list of pair of nodes that are connected, along with any additional information that specifies a property (in this case distance) of the edge that connects these nodes.

+ + + + + +
 1def get_edge_list(label, k=5):
+ 2    faiss_DB, faiss_data, faiss_indices = create_index(label)
+ 3    # To map the data back to the original `train[b'data']` array
+ 4    faiss_indices_map = {i: x for i,x in enumerate(faiss_indices)}
+ 5    # To map the indices back to the original strings
+ 6    title_name_map = {i: x for i,x in data.select("row_idx", "product_title").rows()}
+ 7    distances, neighbors = faiss_DB.search(faiss_data, k)
+ 8    
+ 9    return (
+10        pl.DataFrame({
+11            "from": faiss_indices})
+12        .with_columns(
+13            pl.Series("to", neighbors),
+14            pl.Series("distance", distances))
+15        .explode("to", "distance")
+16        .with_columns(
+17            pl.col("from")
+18            .map_dict(title_name_map),
+19            pl.col("to")
+20            .map_dict(faiss_indices_map)
+21            .map_dict(title_name_map))
+22        .filter(pl.col("from") != pl.col("to"))
+23    )                   

NetworkX and Connected Components

+

The next step in the process is to create a network graph using the edge-list. But why?

+

Remember that we have identified the (k=5) nearest neighbors of each data point. Let’s say that we have a point A that has a nearest neighbor B. C is not a nearest neighbor of A, but it is a nearest neighbor of B. In a network graph, if A and C are sufficiently similar enough to B within a particular minimum thershold, then A will be connected to C through B! Hopefully a small visual below would help.

+

How a network component is formed.

+

What happens when such a concept is extended for many data points? Not all of them would be connected - because we’re applying a minimum threshold that they have to meet. This is the only hueristic part of the rather fast process. Here’s one more helpful visual:

+

How a network cluster is formed.

+

Very starry night-eque vibes here. Let’s get to the code.

+ + + + + +
1import networkx as nx
+2def get_cluster_map(label, k=5, min_cosine_distance=0.95):
+3    edge_list = (
+4        get_edge_list(label, k=k)
+5        .filter(pl.col("distance") >= min_cosine_distance)
+6    )
+7    graph = nx.from_pandas_edgelist(edge_list.to_pandas(), source="from", target="to")
+8    return {i: list(x) for i,x in enumerate(nx.connected_components(graph))}

Getting clusters

+

Now that all the parts of the puzzle are together, let’s run it to see what kind of clusters you get for Cell Phone Accessories.

+ + + + + +
1clusters = get_cluster_map("Cell Phones Accessories", 5, 0.95)

Make sure to configure the following if your results aren’t good enough:

+
    +
  1. Relax the min_cosine_distance value if you want bigger clusters.
  2. +
  3. Increase the number of nearest neighbors if you want more matches.
  4. +
+

Viewing the components

+

There will likely be many clusters (you can see how many exactly with len(clusters)). Let’s look at a random cluster:

+ + + + + +
1>> clusters[3]
+2['smartphone lanyard with card slot for any phone up to 6 yellow 72570099',
+3 'smartphone lanyard with card slot for any phone up to 6 black 72570093',
+4 'smartphone lanyard with card slot for any phone up to 6 lightblue 72570097',
+5 'smartphone lanyard with card slot for any phone up to 6 blue 72570095',
+6 'smartphone lanyard with card slot for any phone up to 6 green 72570101',
+7 'smartphone lanyard with card slot for any phone up to 6 pink 72570091']

Let’s see another cluster that had 172(!) members in my run (the clusters themselves will be stable, but their indices may change in each run owing to some inherent randomness in the process).

+ + + + + +
 1>>> clusters[6]
+ 2['otm essentials iphone 8/7 modern clear printed phone case snowflakes iphone 8/7 op qq z051a',
+ 3 'otm essentials iphone 8/7 modern clear printed phone case iphone 8/7 arrows blue op qq a02 58',
+ 4 'otm essentials iphone 8/7/6s clear printed phone case single iphone 8/7/6s golden pineapple op qq z089a',
+ 5 'otm essentials iphone 8/7/6s clear printed phone case single iphone 8/7/6s butteryfly delight yellow op qq z029d',
+ 6 'otm essentials iphone 8/7 modern clear printed phone case iphone 8/7 luck of the irish op qq a01 45',
+ 7 'otm essentials iphone 8/7 modern clear printed phone case iphone 8/7 brides maid white op qq a02 16',
+ 8 ...
+ 9 'otm essentials iphone 8/7 modern clear printed phone case iphone 8/7 flying arrows white op qq hip 20',
+10 'otm essentials iphone 8/7 modern clear printed phone case iphone 8/7 brides maid pink white op qq a02 17',
+11 'otm essentials iphone 8/7 modern clear printed phone case iphone 8/7 anemone flowers white op qq z036a',
+12 'otm essentials iphone 8/7 modern clear printed phone case mustache iphone 8/7 op qq hip 08',
+13 'otm essentials iphone 8/7 modern clear printed phone case oh snap iphone 8/7 op qq z053a',
+14 'otm essentials iphone 8/7/6s clear printed phone case single iphone 8/7/6s desert cacti orange pink op qq a02 22']

Running for all categories

+

This isn’t that hard (although it may take more than a moment). Just iterate it for each category!

+ + + + + +
1clusters = [get_cluster_map(x, 5, 0.95) for x in data.get_column("category_label").unique()]

For the folks in a hurry!

+

I get it - you often want a solution that “just works”. I can come close to it. See below for code and a succinct explanation. For those of my readers who aren’t in a hurry, this also serves as a nice summary (and copy-pastable code)!

+

The code

+ + + + + +
 1import sentence_transformers
+ 2import faiss
+ 3import polars as pl
+ 4import numpy as np
+ 5
+ 6# Data is read here. You download the files from Kaggle here: 
+ 7# https://www.kaggle.com/datasets/lakritidis/product-classification-and-categorization
+ 8data = pl.read_csv("archive/shopmania.csv", new_columns=[
+ 9    "product_ID", "product_title", "category_ID", "category_label"])
+10data = (
+11    data
+12    .filter(pl.count().over("category_ID") == 10000)
+13    .with_row_count("row_idx")
+14)
+15
+16
+17# See list of models at www.sbert.net/docs/pretrained_models.html
+18ST = sentence_transformers.SentenceTransformer("all-mpnet-base-v2")
+19title_embeddings = (
+20    ST.encode(
+21        data.get_column("product_title").to_list(),
+22        # I'm on a MacBook, you should use `cuda` or `cpu`
+23        # if you've got different hardware.
+24        device="mps",
+25        show_progress_bar=True, convert_to_tensor=True)
+26    .cpu().numpy())
+27
+28# Code to create a FAISS index
+29def create_index(label):
+30    faiss_indices = (
+31        data # this needs to be an argument if you want to create a generic function
+32        .filter(pl.col("category_label") == label)
+33        .get_column("row_idx")
+34        .to_list()
+35    )
+36    
+37    faiss_data = title_embeddings[faiss_indices]
+38    d = faiss_data.shape[1]         # Number of dimensions
+39    faiss_DB = faiss.IndexFlatIP(d) # Index using Inner Product
+40    faiss.normalize_L2(faiss_data)  # Normalized L2 with Inner Product search = cosine similarity
+41    faiss_DB.add(faiss_data)        # Build the index
+42    
+43    return faiss_DB, faiss_data, faiss_indices
+44
+45# Code to create an edge-list
+46def get_edge_list(label, k=5):
+47    faiss_DB, faiss_data, faiss_indices = create_index(label)
+48    # To map the data back to the original `train[b'data']` array
+49    faiss_indices_map = {i: x for i,x in enumerate(faiss_indices)}
+50    # To map the indices back to the original strings
+51    title_name_map = {i: x for i,x in data.select("row_idx", "product_title").rows()}
+52    distances, neighbors = faiss_DB.search(faiss_data, k)
+53    
+54    return (
+55        pl.DataFrame({
+56            "from": faiss_indices})
+57        .with_columns(
+58            pl.Series("to", neighbors),
+59            pl.Series("distance", distances))
+60        .explode("to", "distance")
+61        .with_columns(
+62            pl.col("from")
+63            .map_dict(title_name_map),
+64            pl.col("to")
+65            .map_dict(faiss_indices_map)
+66            .map_dict(title_name_map))
+67        .filter(pl.col("from") != pl.col("to"))
+68    )
+69
+70# Code to extract components from a Network Graph
+71import networkx as nx
+72def get_cluster_map(label, k=5, min_cosine_distance=0.95):
+73    edge_list = (
+74        get_edge_list(label, k=k)
+75        .filter(pl.col("distance") >= min_cosine_distance)
+76    )
+77    graph = nx.from_pandas_edgelist(edge_list.to_pandas(), source="from", target="to")
+78    return {i: list(x) for i,x in enumerate(nx.connected_components(graph))}
+79
+80# Example call to a single category to obtain its clusters
+81clusters = get_cluster_map("Cell Phones Accessories", 5, 0.95)
+82# Example call to **all** categories to obtain all clusters
+83clusters = [get_cluster_map(x, 5, 0.95) for x in data.get_column("category_label").unique()]

How the code works

+

If you want to write down an algorithmic way of looking at this approach,

+
    +
  1. Obtain a 2D representation of the labelled/categorized data. This can be embeddings for strings, the final hidden state output from a generic CNN model for images, or a good ol’ tabular dataset where all numbers are normalized and can be expressed as such.
  2. +
  3. Create an ANN database (based on a package such as faiss) that allows you fast nearest neighbor searches. Use cosine similarity for an easy threshold determination step.
  4. +
  5. Obtain an edge-list of k (from 5 to 100) nearest neighbors for all (or a sample of data points in case your dataset is incredibly HUGE) data points in the ANN database.
  6. +
  7. Apply a minimum threshold on similarity (completely based on heuristics), and obtain the connected components of the network graph from the filtered edge-list you just created.
  8. +
  9. Map all indices back to their source data-points that make sense, and pick any number of items from each cluster (usually, I end up picking one element from each cluster), and you now have your representative sample!
  10. +
+]]>
\ No newline at end of file diff --git a/public/tags/graph/index.html b/public/tags/graph/index.html new file mode 100644 index 0000000..91bf31c --- /dev/null +++ b/public/tags/graph/index.html @@ -0,0 +1,6 @@ +Graph | Avinash's Blog
+

Avinash's Blog

Filtering for "Graph"

© Avinash Mallya | Design via Bear Cub.
\ No newline at end of file diff --git a/public/tags/graph/index.xml b/public/tags/graph/index.xml new file mode 100644 index 0000000..bb7876a --- /dev/null +++ b/public/tags/graph/index.xml @@ -0,0 +1,383 @@ +Graph on Avinash's Bloghttps://avimallu.dev/tags/graph/Recent content in Graph on Avinash's BlogHugo -- gohugo.ioen-US© Avinash MallyaThu, 19 Oct 2023 00:00:00 +0000Finding representative samples efficiently for large datasetshttps://avimallu.dev/blog/002_representative_samples/Thu, 19 Oct 2023 00:00:00 +0000https://avimallu.dev/blog/002_representative_samples/<h1 id="premise">Premise</h1> +<p>In this day and age, we&rsquo;re not short on data. <em>Good</em> data, on the other hand, is very valuable. When you&rsquo;ve got a large amount of improperly labelled data, it may become hard to find to find a representative dataset to train a model on such that it generalizes well.</p> +<p>Let&rsquo;s formalize the problem a little so that a proper approach can be developed. Here&rsquo;s the problem statement:</p> +<ol> +<li>You have a large-ish set of (imperfectly) labelled data points. These data points can be represented as a 2D matrix.</li> +<li>You need to train a model to classify these data points on either these labels, or on labels dervied from imperfect labels.</li> +<li>You need a good (but not perfect) representative sample for the model to be generalizable, but there are too many data points for each label to manually pick representative examples.</li> +</ol> +<h2 id="in-a-hurry">In a hurry?</h2> +<p>Here&rsquo;s what you need to do:</p>Premise +

In this day and age, we’re not short on data. Good data, on the other hand, is very valuable. When you’ve got a large amount of improperly labelled data, it may become hard to find to find a representative dataset to train a model on such that it generalizes well.

+

Let’s formalize the problem a little so that a proper approach can be developed. Here’s the problem statement:

+
    +
  1. You have a large-ish set of (imperfectly) labelled data points. These data points can be represented as a 2D matrix.
  2. +
  3. You need to train a model to classify these data points on either these labels, or on labels dervied from imperfect labels.
  4. +
  5. You need a good (but not perfect) representative sample for the model to be generalizable, but there are too many data points for each label to manually pick representative examples.
  6. +
+

In a hurry?

+

Here’s what you need to do:

+
    +
  1. Read the premise and see if it fits your problem.
  2. +
  3. Go to the For the folks in a hurry! section at the end to find the generic solution and how it works.
  4. +
+

Why do we need representative samples?

+

Generally, three things come to mind:

+
    +
  1. Allows the model to be generalizable for all kinds of data points within a category.
  2. +
  3. Allows for faster training of the model - you need fewer data points to get the same accuracy!
  4. +
  5. Allows maintaining the training set - if your training set needs validation by experts or annotations, this keeps your costs low!
  6. +
+

Define the data

+

This data can be practically anything that can be represented as a 2D matrix.

+

There are exceptions. Raw image data (as numbers) might get difficult because even if you flatten them, they’ll be significant correlation between features. For example, a face can appear practically anywhere in the image, and all pixels centered around the face will be highly correlated, even if they are on different lines. A workaround in this case would be to pipe the image through a CNN model that has been trained on some generic task and produces a 1D representation of a single image in the final hidden layer before the output. Other data will need further processing along similar lines.

+

Get a specific dataset

+

For this specific article, I will use the ShopMania dataset on Kaggle. I apologize in advance for not using a more easily accessible dataset (you need to sign into Kaggle to download it) - and I’m not 100% sure if the GPL allows me to create a copy of the data and place it in my own repository. Nevertheless, the data (if you download it and choose to use it instead of some other dataset) will look like this:

+
+

NOTE: whenever I want to show an output along with the code I used for it, you’ll see the characters >> indicating the command used, and the output to be without those prefixes.

+
+ + + + + +
 1>> import polars as pl
+ 2>> data = pl.read_csv("archive/shopmania.csv")
+ 3>> data
+ 4shape: (313_705, 4)
+ 5┌────────────┬──────────────────────────────────────────────────────┬─────────────┬────────────────┐
+ 6 product_ID  product_title                                         category_ID  category_label 
+ 7 ---         ---                                                   ---          ---            
+ 8 i64         str                                                   i64          str            
+ 9╞════════════╪══════════════════════════════════════════════════════╪═════════════╪════════════════╡
+10 2           twilight central park print                           2            Collectibles   
+11 3           fox print                                             2            Collectibles   
+12 4           circulo de papel wall art                             2            Collectibles   
+13 5           hidden path print                                     2            Collectibles   
+14                                                                                           
+15 313703      deago anti fog swimming diving full face mask         229          Water Sports   
+16             surface snorkel scuba fr gopro black s/m                                          
+17 313704      etc buys full face gopro compatible snorkel scuba     229          Water Sports   
+18             diving mask blue large/xtralarge blue                                             
+19 313705      men 039 s full face breathe free diving snorkel mask  229          Water Sports   
+20             scuba optional hd camera blue mask only adult men                                 
+21 313706      women 039 s full face breathe free diving snorkel     229          Water Sports   
+22             mask scuba optional hd camera black mask only                                     
+23             children and women                                                                
+24└────────────┴──────────────────────────────────────────────────────┴─────────────┴────────────────┘

The data documentation on Kaggle states:

+
+

The first dataset originates from ShopMania, a popular online product comparison platform. It enlists tens of millions of products organized in a three-level hierarchy that includes 230 categories. The two higher levels of the hierarchy include 39 categories, whereas the third lower level accommodates the rest 191 leaf categories. Each product is categorized into this tree structure by being mapped to only one leaf category. Some of these 191 leaf categories contain millions of products. However, shopmania.com allows only the first 10,000 products to be retrieved from each category. Under this restriction, our crawler managed to collect 313,706 products.

+
+

For demonstration, I’ll just limit the categories to those that have exactly 10,000 occurences.

+ + + + + +
1data = (
+2    data
+3    .filter(pl.count().over("category_ID") == 10000)
+4)

You’ll notice that there are only 17 categories in this dataset. Run this to verify that fact.

+ + + + + +
 1>>> data.get_column("category_label").unique()
+ 2shape: (17,)
+ 3Series: 'category_label' [str]
+ 4[
+ 5    "Kitchen & Dining"
+ 6    "Scarves and wraps"
+ 7    "Handbags & Wallets"
+ 8    "Rugs  Tapestry & Linens"
+ 9    "Cell Phones Accessories"
+10    "Men's Clothing"
+11    "Jewelry"
+12    "Belts"
+13    "Men Lingerie"
+14    "Crafts"
+15    "Football"
+16    "Medical Supplies"
+17    "Adult"
+18    "Hunting"
+19    "Women's Clothing"
+20    "Pet Supply"
+21    "Office Supplies"
+22]

Note that this is very easy in Polars, which is the package I typically use for data manipulation. I recommend using it over Pandas.

+

Specify the task

+

Okay - so now we have exactly 10,000 products per category. We only have the title of the product that can be leveraged for categorization. So let me define the task this way:

+
+

Craft a small representative sample for each category.

+
+

Why small? It helps that it’ll make the model faster to train - and keep the training data manageable in size.

+

Finding representative samples

+

I mentioned earlier that we need to represent data as a 2D matrix for the technique I have in mind to work. How can I translate a list of text to a matrix? The answer’s rather simple: use SentenceTransformers to get a string’s embedding. You could also use more classic techniques like computing TF-IDF values, or use more advanced transformers, but I’ve noticed that SentenceTransformers are able to capture semantic meaning of sentences rather well (assuming you use a good model suited for the language the data is in) - they are trained on sentence similarity after all.

+

Getting SentenceTransformer embeddings

+

This part is rather simple. If you’re unable to install SentenceTransformers, please check their website.

+ + + + + +
1import sentence_transformers
+2# See list of models at www.sbert.net/docs/pretrained_models.html
+3ST = sentence_transformers.SentenceTransformer("all-mpnet-base-v2")
+4title_embeddings = (
+5    ST.encode(
+6        data.get_column("product_title").to_list(),
+7        show_progress_bar=True, convert_to_tensor=True)
+8    .numpy())

This process will be slow (~30 minutes) if you don’t have a GPU. There are faster approaches, but they are slightly more involved than would be beneficial for a blog post. The wait will be worth it, I promise! In addition, the call to .numpy() at the end is to directly get a single numpy array - otherwise you get a list of numpy arrays, which is rather inefficient. Further, SentenceTransformers will try to run on the GPU if available, and if so, you will need to write .cpu().numpy() so that the tensor is copied from the GPU to the CPU.

+
+

NOTE: for a proof-of-concept implementation, or if you’re on the CPU, try the all-MiniLM-L6-v2 model. It’s a much smaller and much faster model, although you sacrifice a little in terms of accuracy.

+
+

The concept of approximate nearest neighbors

+

Performing any kind of nearest neighbor algorithm on medium scale datasets (even bordering 10,000 rows and tens of columns) tends to be slow. A primary driver of this was the need to calculate all, or nearly all distances between all data points. Approximate nearest neighbor (ANN) algorithms work around this through various approaches, which warrant their own blog post. For now, it would suffice to understand that there are shortcuts that ANN algorithms take to give you if not the exact nearest neighbor, at least one of the nearest neighbors (hence the term approximate).

+

There are several algorithms that you can use - I shall proceed with faiss, because it has a nice Python interface and is rather easy to work with. You can use any algorithm - a full list of the major ones are available here.

+

I’ll explain why we’re in the nearest neighbor territory in due course.

+

Building the database

+

To build the database, all we need is the title_embeddings matrix.

+ + + + + +
1import faiss
+2def create_index(title_embeddings):
+3    d = title_embeddings.shape[1]    # Number of dimensions
+4    ann_index = faiss.IndexFlatL2(d) # Index using Eucledian Matrix
+5    ann_index.add(title_embeddings)  # Build the index
+6    
+7    return ann_index # Faiss considers databases an "index"

This does create a database. But remember, we’re trying to find representative samples - which means we need to do this by the category (or label). So let’s design a function that sends only the necessary data as that for a particular category, and then create the database. We’ll need three pieces of information from this function:

+
    +
  1. The actual faiss database.
  2. +
  3. The actual subset of data that was used to build this index.
  4. +
  5. The label indices with respect to the original data that went into the faiss database.
  6. +
+

(2) and (3) will help us later in rebuilding a “network graph” that will allow us to reference the original data points.

+ + + + + +
 1import faiss
+ 2import numpy as np
+ 3import polars as pl
+ 4
+ 5def create_index(label):
+ 6    faiss_indices = (
+ 7        data # this needs to be an argument if you want to create a generic function
+ 8        .with_row_count("row_idx")
+ 9        .filter(pl.col("category_label") == label)
+10        .get_column("row_idx")
+11        .to_list()
+12    )
+13    
+14    faiss_data = title_embeddings[faiss_indices]
+15    d = data.shape[1]               # Number of dimensions
+16    faiss_DB = faiss.IndexFlatIP(d) # Index using Inner Product
+17    faiss.normalize_L2(data)        # Normalized L2 with Inner Product search = cosine similarity
+18    # Why cosine similarity? It's easier to specify thresholds - they'll always be between 0 and 1.4.
+19    # If using Eucledian or other distance, we'll have to spend some time finding a good range
+20    # where distances are reasonable. See https://stats.stackexchange.com/a/146279 for details.
+21    faiss_DB.add(data)              # Build the index
+22    
+23    return faiss_DB, faiss_data, faiss_indices

Identifying the nearest neighbors

+

To proceed with getting a representative sample, the next step is to find the nearest neighbors for all data points in the database. This isn’t too hard - faiss index objects have a built-in search method to find the k nearest neighbors for a given index, along with the (approximate) distance to it. Let’s then write a function to get the following information: the label index for whom nearest neighbors are being searched, the indices of said nearest neighbors and the distance between them. In network graph parlance, this kind of data is called an edge list i.e. a list of pair of nodes that are connected, along with any additional information that specifies a property (in this case distance) of the edge that connects these nodes.

+ + + + + +
 1def get_edge_list(label, k=5):
+ 2    faiss_DB, faiss_data, faiss_indices = create_index(label)
+ 3    # To map the data back to the original `train[b'data']` array
+ 4    faiss_indices_map = {i: x for i,x in enumerate(faiss_indices)}
+ 5    # To map the indices back to the original strings
+ 6    title_name_map = {i: x for i,x in data.select("row_idx", "product_title").rows()}
+ 7    distances, neighbors = faiss_DB.search(faiss_data, k)
+ 8    
+ 9    return (
+10        pl.DataFrame({
+11            "from": faiss_indices})
+12        .with_columns(
+13            pl.Series("to", neighbors),
+14            pl.Series("distance", distances))
+15        .explode("to", "distance")
+16        .with_columns(
+17            pl.col("from")
+18            .map_dict(title_name_map),
+19            pl.col("to")
+20            .map_dict(faiss_indices_map)
+21            .map_dict(title_name_map))
+22        .filter(pl.col("from") != pl.col("to"))
+23    )                   

NetworkX and Connected Components

+

The next step in the process is to create a network graph using the edge-list. But why?

+

Remember that we have identified the (k=5) nearest neighbors of each data point. Let’s say that we have a point A that has a nearest neighbor B. C is not a nearest neighbor of A, but it is a nearest neighbor of B. In a network graph, if A and C are sufficiently similar enough to B within a particular minimum thershold, then A will be connected to C through B! Hopefully a small visual below would help.

+

How a network component is formed.

+

What happens when such a concept is extended for many data points? Not all of them would be connected - because we’re applying a minimum threshold that they have to meet. This is the only hueristic part of the rather fast process. Here’s one more helpful visual:

+

How a network cluster is formed.

+

Very starry night-eque vibes here. Let’s get to the code.

+ + + + + +
1import networkx as nx
+2def get_cluster_map(label, k=5, min_cosine_distance=0.95):
+3    edge_list = (
+4        get_edge_list(label, k=k)
+5        .filter(pl.col("distance") >= min_cosine_distance)
+6    )
+7    graph = nx.from_pandas_edgelist(edge_list.to_pandas(), source="from", target="to")
+8    return {i: list(x) for i,x in enumerate(nx.connected_components(graph))}

Getting clusters

+

Now that all the parts of the puzzle are together, let’s run it to see what kind of clusters you get for Cell Phone Accessories.

+ + + + + +
1clusters = get_cluster_map("Cell Phones Accessories", 5, 0.95)

Make sure to configure the following if your results aren’t good enough:

+
    +
  1. Relax the min_cosine_distance value if you want bigger clusters.
  2. +
  3. Increase the number of nearest neighbors if you want more matches.
  4. +
+

Viewing the components

+

There will likely be many clusters (you can see how many exactly with len(clusters)). Let’s look at a random cluster:

+ + + + + +
1>> clusters[3]
+2['smartphone lanyard with card slot for any phone up to 6 yellow 72570099',
+3 'smartphone lanyard with card slot for any phone up to 6 black 72570093',
+4 'smartphone lanyard with card slot for any phone up to 6 lightblue 72570097',
+5 'smartphone lanyard with card slot for any phone up to 6 blue 72570095',
+6 'smartphone lanyard with card slot for any phone up to 6 green 72570101',
+7 'smartphone lanyard with card slot for any phone up to 6 pink 72570091']

Let’s see another cluster that had 172(!) members in my run (the clusters themselves will be stable, but their indices may change in each run owing to some inherent randomness in the process).

+ + + + + +
 1>>> clusters[6]
+ 2['otm essentials iphone 8/7 modern clear printed phone case snowflakes iphone 8/7 op qq z051a',
+ 3 'otm essentials iphone 8/7 modern clear printed phone case iphone 8/7 arrows blue op qq a02 58',
+ 4 'otm essentials iphone 8/7/6s clear printed phone case single iphone 8/7/6s golden pineapple op qq z089a',
+ 5 'otm essentials iphone 8/7/6s clear printed phone case single iphone 8/7/6s butteryfly delight yellow op qq z029d',
+ 6 'otm essentials iphone 8/7 modern clear printed phone case iphone 8/7 luck of the irish op qq a01 45',
+ 7 'otm essentials iphone 8/7 modern clear printed phone case iphone 8/7 brides maid white op qq a02 16',
+ 8 ...
+ 9 'otm essentials iphone 8/7 modern clear printed phone case iphone 8/7 flying arrows white op qq hip 20',
+10 'otm essentials iphone 8/7 modern clear printed phone case iphone 8/7 brides maid pink white op qq a02 17',
+11 'otm essentials iphone 8/7 modern clear printed phone case iphone 8/7 anemone flowers white op qq z036a',
+12 'otm essentials iphone 8/7 modern clear printed phone case mustache iphone 8/7 op qq hip 08',
+13 'otm essentials iphone 8/7 modern clear printed phone case oh snap iphone 8/7 op qq z053a',
+14 'otm essentials iphone 8/7/6s clear printed phone case single iphone 8/7/6s desert cacti orange pink op qq a02 22']

Running for all categories

+

This isn’t that hard (although it may take more than a moment). Just iterate it for each category!

+ + + + + +
1clusters = [get_cluster_map(x, 5, 0.95) for x in data.get_column("category_label").unique()]

For the folks in a hurry!

+

I get it - you often want a solution that “just works”. I can come close to it. See below for code and a succinct explanation. For those of my readers who aren’t in a hurry, this also serves as a nice summary (and copy-pastable code)!

+

The code

+ + + + + +
 1import sentence_transformers
+ 2import faiss
+ 3import polars as pl
+ 4import numpy as np
+ 5
+ 6# Data is read here. You download the files from Kaggle here: 
+ 7# https://www.kaggle.com/datasets/lakritidis/product-classification-and-categorization
+ 8data = pl.read_csv("archive/shopmania.csv", new_columns=[
+ 9    "product_ID", "product_title", "category_ID", "category_label"])
+10data = (
+11    data
+12    .filter(pl.count().over("category_ID") == 10000)
+13    .with_row_count("row_idx")
+14)
+15
+16
+17# See list of models at www.sbert.net/docs/pretrained_models.html
+18ST = sentence_transformers.SentenceTransformer("all-mpnet-base-v2")
+19title_embeddings = (
+20    ST.encode(
+21        data.get_column("product_title").to_list(),
+22        # I'm on a MacBook, you should use `cuda` or `cpu`
+23        # if you've got different hardware.
+24        device="mps",
+25        show_progress_bar=True, convert_to_tensor=True)
+26    .cpu().numpy())
+27
+28# Code to create a FAISS index
+29def create_index(label):
+30    faiss_indices = (
+31        data # this needs to be an argument if you want to create a generic function
+32        .filter(pl.col("category_label") == label)
+33        .get_column("row_idx")
+34        .to_list()
+35    )
+36    
+37    faiss_data = title_embeddings[faiss_indices]
+38    d = faiss_data.shape[1]         # Number of dimensions
+39    faiss_DB = faiss.IndexFlatIP(d) # Index using Inner Product
+40    faiss.normalize_L2(faiss_data)  # Normalized L2 with Inner Product search = cosine similarity
+41    faiss_DB.add(faiss_data)        # Build the index
+42    
+43    return faiss_DB, faiss_data, faiss_indices
+44
+45# Code to create an edge-list
+46def get_edge_list(label, k=5):
+47    faiss_DB, faiss_data, faiss_indices = create_index(label)
+48    # To map the data back to the original `train[b'data']` array
+49    faiss_indices_map = {i: x for i,x in enumerate(faiss_indices)}
+50    # To map the indices back to the original strings
+51    title_name_map = {i: x for i,x in data.select("row_idx", "product_title").rows()}
+52    distances, neighbors = faiss_DB.search(faiss_data, k)
+53    
+54    return (
+55        pl.DataFrame({
+56            "from": faiss_indices})
+57        .with_columns(
+58            pl.Series("to", neighbors),
+59            pl.Series("distance", distances))
+60        .explode("to", "distance")
+61        .with_columns(
+62            pl.col("from")
+63            .map_dict(title_name_map),
+64            pl.col("to")
+65            .map_dict(faiss_indices_map)
+66            .map_dict(title_name_map))
+67        .filter(pl.col("from") != pl.col("to"))
+68    )
+69
+70# Code to extract components from a Network Graph
+71import networkx as nx
+72def get_cluster_map(label, k=5, min_cosine_distance=0.95):
+73    edge_list = (
+74        get_edge_list(label, k=k)
+75        .filter(pl.col("distance") >= min_cosine_distance)
+76    )
+77    graph = nx.from_pandas_edgelist(edge_list.to_pandas(), source="from", target="to")
+78    return {i: list(x) for i,x in enumerate(nx.connected_components(graph))}
+79
+80# Example call to a single category to obtain its clusters
+81clusters = get_cluster_map("Cell Phones Accessories", 5, 0.95)
+82# Example call to **all** categories to obtain all clusters
+83clusters = [get_cluster_map(x, 5, 0.95) for x in data.get_column("category_label").unique()]

How the code works

+

If you want to write down an algorithmic way of looking at this approach,

+
    +
  1. Obtain a 2D representation of the labelled/categorized data. This can be embeddings for strings, the final hidden state output from a generic CNN model for images, or a good ol’ tabular dataset where all numbers are normalized and can be expressed as such.
  2. +
  3. Create an ANN database (based on a package such as faiss) that allows you fast nearest neighbor searches. Use cosine similarity for an easy threshold determination step.
  4. +
  5. Obtain an edge-list of k (from 5 to 100) nearest neighbors for all (or a sample of data points in case your dataset is incredibly HUGE) data points in the ANN database.
  6. +
  7. Apply a minimum threshold on similarity (completely based on heuristics), and obtain the connected components of the network graph from the filtered edge-list you just created.
  8. +
  9. Map all indices back to their source data-points that make sense, and pick any number of items from each cluster (usually, I end up picking one element from each cluster), and you now have your representative sample!
  10. +
+]]>
\ No newline at end of file diff --git a/public/tags/index.html b/public/tags/index.html new file mode 100644 index 0000000..9f0c629 --- /dev/null +++ b/public/tags/index.html @@ -0,0 +1,19 @@ +Tags | Avinash's Blog
+

Avinash's Blog

Filtering for "Tags"

© Avinash Mallya | Design via Bear Cub.
\ No newline at end of file diff --git a/public/tags/index.xml b/public/tags/index.xml new file mode 100644 index 0000000..8c2222d --- /dev/null +++ b/public/tags/index.xml @@ -0,0 +1 @@ +Tags on Avinash's Bloghttps://avimallu.dev/tags/Recent content in Tags on Avinash's BlogHugo -- gohugo.ioen-US© Avinash MallyaFri, 20 Oct 2023 00:00:00 +0000Powerpointhttps://avimallu.dev/tags/powerpoint/Fri, 20 Oct 2023 00:00:00 +0000https://avimallu.dev/tags/powerpoint/Ppthttps://avimallu.dev/tags/ppt/Fri, 20 Oct 2023 00:00:00 +0000https://avimallu.dev/tags/ppt/Vbahttps://avimallu.dev/tags/vba/Fri, 20 Oct 2023 00:00:00 +0000https://avimallu.dev/tags/vba/Approximatehttps://avimallu.dev/tags/approximate/Thu, 19 Oct 2023 00:00:00 +0000https://avimallu.dev/tags/approximate/Categoryhttps://avimallu.dev/tags/category/Thu, 19 Oct 2023 00:00:00 +0000https://avimallu.dev/tags/category/Faisshttps://avimallu.dev/tags/faiss/Thu, 19 Oct 2023 00:00:00 +0000https://avimallu.dev/tags/faiss/Graphhttps://avimallu.dev/tags/graph/Thu, 19 Oct 2023 00:00:00 +0000https://avimallu.dev/tags/graph/Nearesthttps://avimallu.dev/tags/nearest/Thu, 19 Oct 2023 00:00:00 +0000https://avimallu.dev/tags/nearest/Neighborhttps://avimallu.dev/tags/neighbor/Thu, 19 Oct 2023 00:00:00 +0000https://avimallu.dev/tags/neighbor/Networkhttps://avimallu.dev/tags/network/Thu, 19 Oct 2023 00:00:00 +0000https://avimallu.dev/tags/network/Networkxhttps://avimallu.dev/tags/networkx/Thu, 19 Oct 2023 00:00:00 +0000https://avimallu.dev/tags/networkx/Polarshttps://avimallu.dev/tags/polars/Thu, 19 Oct 2023 00:00:00 +0000https://avimallu.dev/tags/polars/Representativehttps://avimallu.dev/tags/representative/Thu, 19 Oct 2023 00:00:00 +0000https://avimallu.dev/tags/representative/Sampleshttps://avimallu.dev/tags/samples/Thu, 19 Oct 2023 00:00:00 +0000https://avimallu.dev/tags/samples/ \ No newline at end of file diff --git a/public/tags/nearest/index.html b/public/tags/nearest/index.html new file mode 100644 index 0000000..080595d --- /dev/null +++ b/public/tags/nearest/index.html @@ -0,0 +1,6 @@ +Nearest | Avinash's Blog
+

Avinash's Blog

Filtering for "Nearest"

© Avinash Mallya | Design via Bear Cub.
\ No newline at end of file diff --git a/public/tags/nearest/index.xml b/public/tags/nearest/index.xml new file mode 100644 index 0000000..ea3f700 --- /dev/null +++ b/public/tags/nearest/index.xml @@ -0,0 +1,383 @@ +Nearest on Avinash's Bloghttps://avimallu.dev/tags/nearest/Recent content in Nearest on Avinash's BlogHugo -- gohugo.ioen-US© Avinash MallyaThu, 19 Oct 2023 00:00:00 +0000Finding representative samples efficiently for large datasetshttps://avimallu.dev/blog/002_representative_samples/Thu, 19 Oct 2023 00:00:00 +0000https://avimallu.dev/blog/002_representative_samples/<h1 id="premise">Premise</h1> +<p>In this day and age, we&rsquo;re not short on data. <em>Good</em> data, on the other hand, is very valuable. When you&rsquo;ve got a large amount of improperly labelled data, it may become hard to find to find a representative dataset to train a model on such that it generalizes well.</p> +<p>Let&rsquo;s formalize the problem a little so that a proper approach can be developed. Here&rsquo;s the problem statement:</p> +<ol> +<li>You have a large-ish set of (imperfectly) labelled data points. These data points can be represented as a 2D matrix.</li> +<li>You need to train a model to classify these data points on either these labels, or on labels dervied from imperfect labels.</li> +<li>You need a good (but not perfect) representative sample for the model to be generalizable, but there are too many data points for each label to manually pick representative examples.</li> +</ol> +<h2 id="in-a-hurry">In a hurry?</h2> +<p>Here&rsquo;s what you need to do:</p>Premise +

In this day and age, we’re not short on data. Good data, on the other hand, is very valuable. When you’ve got a large amount of improperly labelled data, it may become hard to find to find a representative dataset to train a model on such that it generalizes well.

+

Let’s formalize the problem a little so that a proper approach can be developed. Here’s the problem statement:

+
    +
  1. You have a large-ish set of (imperfectly) labelled data points. These data points can be represented as a 2D matrix.
  2. +
  3. You need to train a model to classify these data points on either these labels, or on labels dervied from imperfect labels.
  4. +
  5. You need a good (but not perfect) representative sample for the model to be generalizable, but there are too many data points for each label to manually pick representative examples.
  6. +
+

In a hurry?

+

Here’s what you need to do:

+
    +
  1. Read the premise and see if it fits your problem.
  2. +
  3. Go to the For the folks in a hurry! section at the end to find the generic solution and how it works.
  4. +
+

Why do we need representative samples?

+

Generally, three things come to mind:

+
    +
  1. Allows the model to be generalizable for all kinds of data points within a category.
  2. +
  3. Allows for faster training of the model - you need fewer data points to get the same accuracy!
  4. +
  5. Allows maintaining the training set - if your training set needs validation by experts or annotations, this keeps your costs low!
  6. +
+

Define the data

+

This data can be practically anything that can be represented as a 2D matrix.

+

There are exceptions. Raw image data (as numbers) might get difficult because even if you flatten them, they’ll be significant correlation between features. For example, a face can appear practically anywhere in the image, and all pixels centered around the face will be highly correlated, even if they are on different lines. A workaround in this case would be to pipe the image through a CNN model that has been trained on some generic task and produces a 1D representation of a single image in the final hidden layer before the output. Other data will need further processing along similar lines.

+

Get a specific dataset

+

For this specific article, I will use the ShopMania dataset on Kaggle. I apologize in advance for not using a more easily accessible dataset (you need to sign into Kaggle to download it) - and I’m not 100% sure if the GPL allows me to create a copy of the data and place it in my own repository. Nevertheless, the data (if you download it and choose to use it instead of some other dataset) will look like this:

+
+

NOTE: whenever I want to show an output along with the code I used for it, you’ll see the characters >> indicating the command used, and the output to be without those prefixes.

+
+ + + + + +
 1>> import polars as pl
+ 2>> data = pl.read_csv("archive/shopmania.csv")
+ 3>> data
+ 4shape: (313_705, 4)
+ 5┌────────────┬──────────────────────────────────────────────────────┬─────────────┬────────────────┐
+ 6 product_ID  product_title                                         category_ID  category_label 
+ 7 ---         ---                                                   ---          ---            
+ 8 i64         str                                                   i64          str            
+ 9╞════════════╪══════════════════════════════════════════════════════╪═════════════╪════════════════╡
+10 2           twilight central park print                           2            Collectibles   
+11 3           fox print                                             2            Collectibles   
+12 4           circulo de papel wall art                             2            Collectibles   
+13 5           hidden path print                                     2            Collectibles   
+14                                                                                           
+15 313703      deago anti fog swimming diving full face mask         229          Water Sports   
+16             surface snorkel scuba fr gopro black s/m                                          
+17 313704      etc buys full face gopro compatible snorkel scuba     229          Water Sports   
+18             diving mask blue large/xtralarge blue                                             
+19 313705      men 039 s full face breathe free diving snorkel mask  229          Water Sports   
+20             scuba optional hd camera blue mask only adult men                                 
+21 313706      women 039 s full face breathe free diving snorkel     229          Water Sports   
+22             mask scuba optional hd camera black mask only                                     
+23             children and women                                                                
+24└────────────┴──────────────────────────────────────────────────────┴─────────────┴────────────────┘

The data documentation on Kaggle states:

+
+

The first dataset originates from ShopMania, a popular online product comparison platform. It enlists tens of millions of products organized in a three-level hierarchy that includes 230 categories. The two higher levels of the hierarchy include 39 categories, whereas the third lower level accommodates the rest 191 leaf categories. Each product is categorized into this tree structure by being mapped to only one leaf category. Some of these 191 leaf categories contain millions of products. However, shopmania.com allows only the first 10,000 products to be retrieved from each category. Under this restriction, our crawler managed to collect 313,706 products.

+
+

For demonstration, I’ll just limit the categories to those that have exactly 10,000 occurences.

+ + + + + +
1data = (
+2    data
+3    .filter(pl.count().over("category_ID") == 10000)
+4)

You’ll notice that there are only 17 categories in this dataset. Run this to verify that fact.

+ + + + + +
 1>>> data.get_column("category_label").unique()
+ 2shape: (17,)
+ 3Series: 'category_label' [str]
+ 4[
+ 5    "Kitchen & Dining"
+ 6    "Scarves and wraps"
+ 7    "Handbags & Wallets"
+ 8    "Rugs  Tapestry & Linens"
+ 9    "Cell Phones Accessories"
+10    "Men's Clothing"
+11    "Jewelry"
+12    "Belts"
+13    "Men Lingerie"
+14    "Crafts"
+15    "Football"
+16    "Medical Supplies"
+17    "Adult"
+18    "Hunting"
+19    "Women's Clothing"
+20    "Pet Supply"
+21    "Office Supplies"
+22]

Note that this is very easy in Polars, which is the package I typically use for data manipulation. I recommend using it over Pandas.

+

Specify the task

+

Okay - so now we have exactly 10,000 products per category. We only have the title of the product that can be leveraged for categorization. So let me define the task this way:

+
+

Craft a small representative sample for each category.

+
+

Why small? It helps that it’ll make the model faster to train - and keep the training data manageable in size.

+

Finding representative samples

+

I mentioned earlier that we need to represent data as a 2D matrix for the technique I have in mind to work. How can I translate a list of text to a matrix? The answer’s rather simple: use SentenceTransformers to get a string’s embedding. You could also use more classic techniques like computing TF-IDF values, or use more advanced transformers, but I’ve noticed that SentenceTransformers are able to capture semantic meaning of sentences rather well (assuming you use a good model suited for the language the data is in) - they are trained on sentence similarity after all.

+

Getting SentenceTransformer embeddings

+

This part is rather simple. If you’re unable to install SentenceTransformers, please check their website.

+ + + + + +
1import sentence_transformers
+2# See list of models at www.sbert.net/docs/pretrained_models.html
+3ST = sentence_transformers.SentenceTransformer("all-mpnet-base-v2")
+4title_embeddings = (
+5    ST.encode(
+6        data.get_column("product_title").to_list(),
+7        show_progress_bar=True, convert_to_tensor=True)
+8    .numpy())

This process will be slow (~30 minutes) if you don’t have a GPU. There are faster approaches, but they are slightly more involved than would be beneficial for a blog post. The wait will be worth it, I promise! In addition, the call to .numpy() at the end is to directly get a single numpy array - otherwise you get a list of numpy arrays, which is rather inefficient. Further, SentenceTransformers will try to run on the GPU if available, and if so, you will need to write .cpu().numpy() so that the tensor is copied from the GPU to the CPU.

+
+

NOTE: for a proof-of-concept implementation, or if you’re on the CPU, try the all-MiniLM-L6-v2 model. It’s a much smaller and much faster model, although you sacrifice a little in terms of accuracy.

+
+

The concept of approximate nearest neighbors

+

Performing any kind of nearest neighbor algorithm on medium scale datasets (even bordering 10,000 rows and tens of columns) tends to be slow. A primary driver of this was the need to calculate all, or nearly all distances between all data points. Approximate nearest neighbor (ANN) algorithms work around this through various approaches, which warrant their own blog post. For now, it would suffice to understand that there are shortcuts that ANN algorithms take to give you if not the exact nearest neighbor, at least one of the nearest neighbors (hence the term approximate).

+

There are several algorithms that you can use - I shall proceed with faiss, because it has a nice Python interface and is rather easy to work with. You can use any algorithm - a full list of the major ones are available here.

+

I’ll explain why we’re in the nearest neighbor territory in due course.

+

Building the database

+

To build the database, all we need is the title_embeddings matrix.

+ + + + + +
1import faiss
+2def create_index(title_embeddings):
+3    d = title_embeddings.shape[1]    # Number of dimensions
+4    ann_index = faiss.IndexFlatL2(d) # Index using Eucledian Matrix
+5    ann_index.add(title_embeddings)  # Build the index
+6    
+7    return ann_index # Faiss considers databases an "index"

This does create a database. But remember, we’re trying to find representative samples - which means we need to do this by the category (or label). So let’s design a function that sends only the necessary data as that for a particular category, and then create the database. We’ll need three pieces of information from this function:

+
    +
  1. The actual faiss database.
  2. +
  3. The actual subset of data that was used to build this index.
  4. +
  5. The label indices with respect to the original data that went into the faiss database.
  6. +
+

(2) and (3) will help us later in rebuilding a “network graph” that will allow us to reference the original data points.

+ + + + + +
 1import faiss
+ 2import numpy as np
+ 3import polars as pl
+ 4
+ 5def create_index(label):
+ 6    faiss_indices = (
+ 7        data # this needs to be an argument if you want to create a generic function
+ 8        .with_row_count("row_idx")
+ 9        .filter(pl.col("category_label") == label)
+10        .get_column("row_idx")
+11        .to_list()
+12    )
+13    
+14    faiss_data = title_embeddings[faiss_indices]
+15    d = data.shape[1]               # Number of dimensions
+16    faiss_DB = faiss.IndexFlatIP(d) # Index using Inner Product
+17    faiss.normalize_L2(data)        # Normalized L2 with Inner Product search = cosine similarity
+18    # Why cosine similarity? It's easier to specify thresholds - they'll always be between 0 and 1.4.
+19    # If using Eucledian or other distance, we'll have to spend some time finding a good range
+20    # where distances are reasonable. See https://stats.stackexchange.com/a/146279 for details.
+21    faiss_DB.add(data)              # Build the index
+22    
+23    return faiss_DB, faiss_data, faiss_indices

Identifying the nearest neighbors

+

To proceed with getting a representative sample, the next step is to find the nearest neighbors for all data points in the database. This isn’t too hard - faiss index objects have a built-in search method to find the k nearest neighbors for a given index, along with the (approximate) distance to it. Let’s then write a function to get the following information: the label index for whom nearest neighbors are being searched, the indices of said nearest neighbors and the distance between them. In network graph parlance, this kind of data is called an edge list i.e. a list of pair of nodes that are connected, along with any additional information that specifies a property (in this case distance) of the edge that connects these nodes.

+ + + + + +
 1def get_edge_list(label, k=5):
+ 2    faiss_DB, faiss_data, faiss_indices = create_index(label)
+ 3    # To map the data back to the original `train[b'data']` array
+ 4    faiss_indices_map = {i: x for i,x in enumerate(faiss_indices)}
+ 5    # To map the indices back to the original strings
+ 6    title_name_map = {i: x for i,x in data.select("row_idx", "product_title").rows()}
+ 7    distances, neighbors = faiss_DB.search(faiss_data, k)
+ 8    
+ 9    return (
+10        pl.DataFrame({
+11            "from": faiss_indices})
+12        .with_columns(
+13            pl.Series("to", neighbors),
+14            pl.Series("distance", distances))
+15        .explode("to", "distance")
+16        .with_columns(
+17            pl.col("from")
+18            .map_dict(title_name_map),
+19            pl.col("to")
+20            .map_dict(faiss_indices_map)
+21            .map_dict(title_name_map))
+22        .filter(pl.col("from") != pl.col("to"))
+23    )                   

NetworkX and Connected Components

+

The next step in the process is to create a network graph using the edge-list. But why?

+

Remember that we have identified the (k=5) nearest neighbors of each data point. Let’s say that we have a point A that has a nearest neighbor B. C is not a nearest neighbor of A, but it is a nearest neighbor of B. In a network graph, if A and C are sufficiently similar enough to B within a particular minimum thershold, then A will be connected to C through B! Hopefully a small visual below would help.

+

How a network component is formed.

+

What happens when such a concept is extended for many data points? Not all of them would be connected - because we’re applying a minimum threshold that they have to meet. This is the only hueristic part of the rather fast process. Here’s one more helpful visual:

+

How a network cluster is formed.

+

Very starry night-eque vibes here. Let’s get to the code.

+ + + + + +
1import networkx as nx
+2def get_cluster_map(label, k=5, min_cosine_distance=0.95):
+3    edge_list = (
+4        get_edge_list(label, k=k)
+5        .filter(pl.col("distance") >= min_cosine_distance)
+6    )
+7    graph = nx.from_pandas_edgelist(edge_list.to_pandas(), source="from", target="to")
+8    return {i: list(x) for i,x in enumerate(nx.connected_components(graph))}

Getting clusters

+

Now that all the parts of the puzzle are together, let’s run it to see what kind of clusters you get for Cell Phone Accessories.

+ + + + + +
1clusters = get_cluster_map("Cell Phones Accessories", 5, 0.95)

Make sure to configure the following if your results aren’t good enough:

+
    +
  1. Relax the min_cosine_distance value if you want bigger clusters.
  2. +
  3. Increase the number of nearest neighbors if you want more matches.
  4. +
+

Viewing the components

+

There will likely be many clusters (you can see how many exactly with len(clusters)). Let’s look at a random cluster:

+ + + + + +
1>> clusters[3]
+2['smartphone lanyard with card slot for any phone up to 6 yellow 72570099',
+3 'smartphone lanyard with card slot for any phone up to 6 black 72570093',
+4 'smartphone lanyard with card slot for any phone up to 6 lightblue 72570097',
+5 'smartphone lanyard with card slot for any phone up to 6 blue 72570095',
+6 'smartphone lanyard with card slot for any phone up to 6 green 72570101',
+7 'smartphone lanyard with card slot for any phone up to 6 pink 72570091']

Let’s see another cluster that had 172(!) members in my run (the clusters themselves will be stable, but their indices may change in each run owing to some inherent randomness in the process).

+ + + + + +
 1>>> clusters[6]
+ 2['otm essentials iphone 8/7 modern clear printed phone case snowflakes iphone 8/7 op qq z051a',
+ 3 'otm essentials iphone 8/7 modern clear printed phone case iphone 8/7 arrows blue op qq a02 58',
+ 4 'otm essentials iphone 8/7/6s clear printed phone case single iphone 8/7/6s golden pineapple op qq z089a',
+ 5 'otm essentials iphone 8/7/6s clear printed phone case single iphone 8/7/6s butteryfly delight yellow op qq z029d',
+ 6 'otm essentials iphone 8/7 modern clear printed phone case iphone 8/7 luck of the irish op qq a01 45',
+ 7 'otm essentials iphone 8/7 modern clear printed phone case iphone 8/7 brides maid white op qq a02 16',
+ 8 ...
+ 9 'otm essentials iphone 8/7 modern clear printed phone case iphone 8/7 flying arrows white op qq hip 20',
+10 'otm essentials iphone 8/7 modern clear printed phone case iphone 8/7 brides maid pink white op qq a02 17',
+11 'otm essentials iphone 8/7 modern clear printed phone case iphone 8/7 anemone flowers white op qq z036a',
+12 'otm essentials iphone 8/7 modern clear printed phone case mustache iphone 8/7 op qq hip 08',
+13 'otm essentials iphone 8/7 modern clear printed phone case oh snap iphone 8/7 op qq z053a',
+14 'otm essentials iphone 8/7/6s clear printed phone case single iphone 8/7/6s desert cacti orange pink op qq a02 22']

Running for all categories

+

This isn’t that hard (although it may take more than a moment). Just iterate it for each category!

+ + + + + +
1clusters = [get_cluster_map(x, 5, 0.95) for x in data.get_column("category_label").unique()]

For the folks in a hurry!

+

I get it - you often want a solution that “just works”. I can come close to it. See below for code and a succinct explanation. For those of my readers who aren’t in a hurry, this also serves as a nice summary (and copy-pastable code)!

+

The code

+ + + + + +
 1import sentence_transformers
+ 2import faiss
+ 3import polars as pl
+ 4import numpy as np
+ 5
+ 6# Data is read here. You download the files from Kaggle here: 
+ 7# https://www.kaggle.com/datasets/lakritidis/product-classification-and-categorization
+ 8data = pl.read_csv("archive/shopmania.csv", new_columns=[
+ 9    "product_ID", "product_title", "category_ID", "category_label"])
+10data = (
+11    data
+12    .filter(pl.count().over("category_ID") == 10000)
+13    .with_row_count("row_idx")
+14)
+15
+16
+17# See list of models at www.sbert.net/docs/pretrained_models.html
+18ST = sentence_transformers.SentenceTransformer("all-mpnet-base-v2")
+19title_embeddings = (
+20    ST.encode(
+21        data.get_column("product_title").to_list(),
+22        # I'm on a MacBook, you should use `cuda` or `cpu`
+23        # if you've got different hardware.
+24        device="mps",
+25        show_progress_bar=True, convert_to_tensor=True)
+26    .cpu().numpy())
+27
+28# Code to create a FAISS index
+29def create_index(label):
+30    faiss_indices = (
+31        data # this needs to be an argument if you want to create a generic function
+32        .filter(pl.col("category_label") == label)
+33        .get_column("row_idx")
+34        .to_list()
+35    )
+36    
+37    faiss_data = title_embeddings[faiss_indices]
+38    d = faiss_data.shape[1]         # Number of dimensions
+39    faiss_DB = faiss.IndexFlatIP(d) # Index using Inner Product
+40    faiss.normalize_L2(faiss_data)  # Normalized L2 with Inner Product search = cosine similarity
+41    faiss_DB.add(faiss_data)        # Build the index
+42    
+43    return faiss_DB, faiss_data, faiss_indices
+44
+45# Code to create an edge-list
+46def get_edge_list(label, k=5):
+47    faiss_DB, faiss_data, faiss_indices = create_index(label)
+48    # To map the data back to the original `train[b'data']` array
+49    faiss_indices_map = {i: x for i,x in enumerate(faiss_indices)}
+50    # To map the indices back to the original strings
+51    title_name_map = {i: x for i,x in data.select("row_idx", "product_title").rows()}
+52    distances, neighbors = faiss_DB.search(faiss_data, k)
+53    
+54    return (
+55        pl.DataFrame({
+56            "from": faiss_indices})
+57        .with_columns(
+58            pl.Series("to", neighbors),
+59            pl.Series("distance", distances))
+60        .explode("to", "distance")
+61        .with_columns(
+62            pl.col("from")
+63            .map_dict(title_name_map),
+64            pl.col("to")
+65            .map_dict(faiss_indices_map)
+66            .map_dict(title_name_map))
+67        .filter(pl.col("from") != pl.col("to"))
+68    )
+69
+70# Code to extract components from a Network Graph
+71import networkx as nx
+72def get_cluster_map(label, k=5, min_cosine_distance=0.95):
+73    edge_list = (
+74        get_edge_list(label, k=k)
+75        .filter(pl.col("distance") >= min_cosine_distance)
+76    )
+77    graph = nx.from_pandas_edgelist(edge_list.to_pandas(), source="from", target="to")
+78    return {i: list(x) for i,x in enumerate(nx.connected_components(graph))}
+79
+80# Example call to a single category to obtain its clusters
+81clusters = get_cluster_map("Cell Phones Accessories", 5, 0.95)
+82# Example call to **all** categories to obtain all clusters
+83clusters = [get_cluster_map(x, 5, 0.95) for x in data.get_column("category_label").unique()]

How the code works

+

If you want to write down an algorithmic way of looking at this approach,

+
    +
  1. Obtain a 2D representation of the labelled/categorized data. This can be embeddings for strings, the final hidden state output from a generic CNN model for images, or a good ol’ tabular dataset where all numbers are normalized and can be expressed as such.
  2. +
  3. Create an ANN database (based on a package such as faiss) that allows you fast nearest neighbor searches. Use cosine similarity for an easy threshold determination step.
  4. +
  5. Obtain an edge-list of k (from 5 to 100) nearest neighbors for all (or a sample of data points in case your dataset is incredibly HUGE) data points in the ANN database.
  6. +
  7. Apply a minimum threshold on similarity (completely based on heuristics), and obtain the connected components of the network graph from the filtered edge-list you just created.
  8. +
  9. Map all indices back to their source data-points that make sense, and pick any number of items from each cluster (usually, I end up picking one element from each cluster), and you now have your representative sample!
  10. +
+]]>
\ No newline at end of file diff --git a/public/tags/neighbor/index.html b/public/tags/neighbor/index.html new file mode 100644 index 0000000..2b45803 --- /dev/null +++ b/public/tags/neighbor/index.html @@ -0,0 +1,6 @@ +Neighbor | Avinash's Blog
+

Avinash's Blog

Filtering for "Neighbor"

© Avinash Mallya | Design via Bear Cub.
\ No newline at end of file diff --git a/public/tags/neighbor/index.xml b/public/tags/neighbor/index.xml new file mode 100644 index 0000000..0f6e3c9 --- /dev/null +++ b/public/tags/neighbor/index.xml @@ -0,0 +1,383 @@ +Neighbor on Avinash's Bloghttps://avimallu.dev/tags/neighbor/Recent content in Neighbor on Avinash's BlogHugo -- gohugo.ioen-US© Avinash MallyaThu, 19 Oct 2023 00:00:00 +0000Finding representative samples efficiently for large datasetshttps://avimallu.dev/blog/002_representative_samples/Thu, 19 Oct 2023 00:00:00 +0000https://avimallu.dev/blog/002_representative_samples/<h1 id="premise">Premise</h1> +<p>In this day and age, we&rsquo;re not short on data. <em>Good</em> data, on the other hand, is very valuable. When you&rsquo;ve got a large amount of improperly labelled data, it may become hard to find to find a representative dataset to train a model on such that it generalizes well.</p> +<p>Let&rsquo;s formalize the problem a little so that a proper approach can be developed. Here&rsquo;s the problem statement:</p> +<ol> +<li>You have a large-ish set of (imperfectly) labelled data points. These data points can be represented as a 2D matrix.</li> +<li>You need to train a model to classify these data points on either these labels, or on labels dervied from imperfect labels.</li> +<li>You need a good (but not perfect) representative sample for the model to be generalizable, but there are too many data points for each label to manually pick representative examples.</li> +</ol> +<h2 id="in-a-hurry">In a hurry?</h2> +<p>Here&rsquo;s what you need to do:</p>Premise +

In this day and age, we’re not short on data. Good data, on the other hand, is very valuable. When you’ve got a large amount of improperly labelled data, it may become hard to find to find a representative dataset to train a model on such that it generalizes well.

+

Let’s formalize the problem a little so that a proper approach can be developed. Here’s the problem statement:

+
    +
  1. You have a large-ish set of (imperfectly) labelled data points. These data points can be represented as a 2D matrix.
  2. +
  3. You need to train a model to classify these data points on either these labels, or on labels dervied from imperfect labels.
  4. +
  5. You need a good (but not perfect) representative sample for the model to be generalizable, but there are too many data points for each label to manually pick representative examples.
  6. +
+

In a hurry?

+

Here’s what you need to do:

+
    +
  1. Read the premise and see if it fits your problem.
  2. +
  3. Go to the For the folks in a hurry! section at the end to find the generic solution and how it works.
  4. +
+

Why do we need representative samples?

+

Generally, three things come to mind:

+
    +
  1. Allows the model to be generalizable for all kinds of data points within a category.
  2. +
  3. Allows for faster training of the model - you need fewer data points to get the same accuracy!
  4. +
  5. Allows maintaining the training set - if your training set needs validation by experts or annotations, this keeps your costs low!
  6. +
+

Define the data

+

This data can be practically anything that can be represented as a 2D matrix.

+

There are exceptions. Raw image data (as numbers) might get difficult because even if you flatten them, they’ll be significant correlation between features. For example, a face can appear practically anywhere in the image, and all pixels centered around the face will be highly correlated, even if they are on different lines. A workaround in this case would be to pipe the image through a CNN model that has been trained on some generic task and produces a 1D representation of a single image in the final hidden layer before the output. Other data will need further processing along similar lines.

+

Get a specific dataset

+

For this specific article, I will use the ShopMania dataset on Kaggle. I apologize in advance for not using a more easily accessible dataset (you need to sign into Kaggle to download it) - and I’m not 100% sure if the GPL allows me to create a copy of the data and place it in my own repository. Nevertheless, the data (if you download it and choose to use it instead of some other dataset) will look like this:

+
+

NOTE: whenever I want to show an output along with the code I used for it, you’ll see the characters >> indicating the command used, and the output to be without those prefixes.

+
+ + + + + +
 1>> import polars as pl
+ 2>> data = pl.read_csv("archive/shopmania.csv")
+ 3>> data
+ 4shape: (313_705, 4)
+ 5┌────────────┬──────────────────────────────────────────────────────┬─────────────┬────────────────┐
+ 6 product_ID  product_title                                         category_ID  category_label 
+ 7 ---         ---                                                   ---          ---            
+ 8 i64         str                                                   i64          str            
+ 9╞════════════╪══════════════════════════════════════════════════════╪═════════════╪════════════════╡
+10 2           twilight central park print                           2            Collectibles   
+11 3           fox print                                             2            Collectibles   
+12 4           circulo de papel wall art                             2            Collectibles   
+13 5           hidden path print                                     2            Collectibles   
+14                                                                                           
+15 313703      deago anti fog swimming diving full face mask         229          Water Sports   
+16             surface snorkel scuba fr gopro black s/m                                          
+17 313704      etc buys full face gopro compatible snorkel scuba     229          Water Sports   
+18             diving mask blue large/xtralarge blue                                             
+19 313705      men 039 s full face breathe free diving snorkel mask  229          Water Sports   
+20             scuba optional hd camera blue mask only adult men                                 
+21 313706      women 039 s full face breathe free diving snorkel     229          Water Sports   
+22             mask scuba optional hd camera black mask only                                     
+23             children and women                                                                
+24└────────────┴──────────────────────────────────────────────────────┴─────────────┴────────────────┘

The data documentation on Kaggle states:

+
+

The first dataset originates from ShopMania, a popular online product comparison platform. It enlists tens of millions of products organized in a three-level hierarchy that includes 230 categories. The two higher levels of the hierarchy include 39 categories, whereas the third lower level accommodates the rest 191 leaf categories. Each product is categorized into this tree structure by being mapped to only one leaf category. Some of these 191 leaf categories contain millions of products. However, shopmania.com allows only the first 10,000 products to be retrieved from each category. Under this restriction, our crawler managed to collect 313,706 products.

+
+

For demonstration, I’ll just limit the categories to those that have exactly 10,000 occurences.

+ + + + + +
1data = (
+2    data
+3    .filter(pl.count().over("category_ID") == 10000)
+4)

You’ll notice that there are only 17 categories in this dataset. Run this to verify that fact.

+ + + + + +
 1>>> data.get_column("category_label").unique()
+ 2shape: (17,)
+ 3Series: 'category_label' [str]
+ 4[
+ 5    "Kitchen & Dining"
+ 6    "Scarves and wraps"
+ 7    "Handbags & Wallets"
+ 8    "Rugs  Tapestry & Linens"
+ 9    "Cell Phones Accessories"
+10    "Men's Clothing"
+11    "Jewelry"
+12    "Belts"
+13    "Men Lingerie"
+14    "Crafts"
+15    "Football"
+16    "Medical Supplies"
+17    "Adult"
+18    "Hunting"
+19    "Women's Clothing"
+20    "Pet Supply"
+21    "Office Supplies"
+22]

Note that this is very easy in Polars, which is the package I typically use for data manipulation. I recommend using it over Pandas.

+

Specify the task

+

Okay - so now we have exactly 10,000 products per category. We only have the title of the product that can be leveraged for categorization. So let me define the task this way:

+
+

Craft a small representative sample for each category.

+
+

Why small? It helps that it’ll make the model faster to train - and keep the training data manageable in size.

+

Finding representative samples

+

I mentioned earlier that we need to represent data as a 2D matrix for the technique I have in mind to work. How can I translate a list of text to a matrix? The answer’s rather simple: use SentenceTransformers to get a string’s embedding. You could also use more classic techniques like computing TF-IDF values, or use more advanced transformers, but I’ve noticed that SentenceTransformers are able to capture semantic meaning of sentences rather well (assuming you use a good model suited for the language the data is in) - they are trained on sentence similarity after all.

+

Getting SentenceTransformer embeddings

+

This part is rather simple. If you’re unable to install SentenceTransformers, please check their website.

+ + + + + +
1import sentence_transformers
+2# See list of models at www.sbert.net/docs/pretrained_models.html
+3ST = sentence_transformers.SentenceTransformer("all-mpnet-base-v2")
+4title_embeddings = (
+5    ST.encode(
+6        data.get_column("product_title").to_list(),
+7        show_progress_bar=True, convert_to_tensor=True)
+8    .numpy())

This process will be slow (~30 minutes) if you don’t have a GPU. There are faster approaches, but they are slightly more involved than would be beneficial for a blog post. The wait will be worth it, I promise! In addition, the call to .numpy() at the end is to directly get a single numpy array - otherwise you get a list of numpy arrays, which is rather inefficient. Further, SentenceTransformers will try to run on the GPU if available, and if so, you will need to write .cpu().numpy() so that the tensor is copied from the GPU to the CPU.

+
+

NOTE: for a proof-of-concept implementation, or if you’re on the CPU, try the all-MiniLM-L6-v2 model. It’s a much smaller and much faster model, although you sacrifice a little in terms of accuracy.

+
+

The concept of approximate nearest neighbors

+

Performing any kind of nearest neighbor algorithm on medium scale datasets (even bordering 10,000 rows and tens of columns) tends to be slow. A primary driver of this was the need to calculate all, or nearly all distances between all data points. Approximate nearest neighbor (ANN) algorithms work around this through various approaches, which warrant their own blog post. For now, it would suffice to understand that there are shortcuts that ANN algorithms take to give you if not the exact nearest neighbor, at least one of the nearest neighbors (hence the term approximate).

+

There are several algorithms that you can use - I shall proceed with faiss, because it has a nice Python interface and is rather easy to work with. You can use any algorithm - a full list of the major ones are available here.

+

I’ll explain why we’re in the nearest neighbor territory in due course.

+

Building the database

+

To build the database, all we need is the title_embeddings matrix.

+ + + + + +
1import faiss
+2def create_index(title_embeddings):
+3    d = title_embeddings.shape[1]    # Number of dimensions
+4    ann_index = faiss.IndexFlatL2(d) # Index using Eucledian Matrix
+5    ann_index.add(title_embeddings)  # Build the index
+6    
+7    return ann_index # Faiss considers databases an "index"

This does create a database. But remember, we’re trying to find representative samples - which means we need to do this by the category (or label). So let’s design a function that sends only the necessary data as that for a particular category, and then create the database. We’ll need three pieces of information from this function:

+
    +
  1. The actual faiss database.
  2. +
  3. The actual subset of data that was used to build this index.
  4. +
  5. The label indices with respect to the original data that went into the faiss database.
  6. +
+

(2) and (3) will help us later in rebuilding a “network graph” that will allow us to reference the original data points.

+ + + + + +
 1import faiss
+ 2import numpy as np
+ 3import polars as pl
+ 4
+ 5def create_index(label):
+ 6    faiss_indices = (
+ 7        data # this needs to be an argument if you want to create a generic function
+ 8        .with_row_count("row_idx")
+ 9        .filter(pl.col("category_label") == label)
+10        .get_column("row_idx")
+11        .to_list()
+12    )
+13    
+14    faiss_data = title_embeddings[faiss_indices]
+15    d = data.shape[1]               # Number of dimensions
+16    faiss_DB = faiss.IndexFlatIP(d) # Index using Inner Product
+17    faiss.normalize_L2(data)        # Normalized L2 with Inner Product search = cosine similarity
+18    # Why cosine similarity? It's easier to specify thresholds - they'll always be between 0 and 1.4.
+19    # If using Eucledian or other distance, we'll have to spend some time finding a good range
+20    # where distances are reasonable. See https://stats.stackexchange.com/a/146279 for details.
+21    faiss_DB.add(data)              # Build the index
+22    
+23    return faiss_DB, faiss_data, faiss_indices

Identifying the nearest neighbors

+

To proceed with getting a representative sample, the next step is to find the nearest neighbors for all data points in the database. This isn’t too hard - faiss index objects have a built-in search method to find the k nearest neighbors for a given index, along with the (approximate) distance to it. Let’s then write a function to get the following information: the label index for whom nearest neighbors are being searched, the indices of said nearest neighbors and the distance between them. In network graph parlance, this kind of data is called an edge list i.e. a list of pair of nodes that are connected, along with any additional information that specifies a property (in this case distance) of the edge that connects these nodes.

+ + + + + +
 1def get_edge_list(label, k=5):
+ 2    faiss_DB, faiss_data, faiss_indices = create_index(label)
+ 3    # To map the data back to the original `train[b'data']` array
+ 4    faiss_indices_map = {i: x for i,x in enumerate(faiss_indices)}
+ 5    # To map the indices back to the original strings
+ 6    title_name_map = {i: x for i,x in data.select("row_idx", "product_title").rows()}
+ 7    distances, neighbors = faiss_DB.search(faiss_data, k)
+ 8    
+ 9    return (
+10        pl.DataFrame({
+11            "from": faiss_indices})
+12        .with_columns(
+13            pl.Series("to", neighbors),
+14            pl.Series("distance", distances))
+15        .explode("to", "distance")
+16        .with_columns(
+17            pl.col("from")
+18            .map_dict(title_name_map),
+19            pl.col("to")
+20            .map_dict(faiss_indices_map)
+21            .map_dict(title_name_map))
+22        .filter(pl.col("from") != pl.col("to"))
+23    )                   

NetworkX and Connected Components

+

The next step in the process is to create a network graph using the edge-list. But why?

+

Remember that we have identified the (k=5) nearest neighbors of each data point. Let’s say that we have a point A that has a nearest neighbor B. C is not a nearest neighbor of A, but it is a nearest neighbor of B. In a network graph, if A and C are sufficiently similar enough to B within a particular minimum thershold, then A will be connected to C through B! Hopefully a small visual below would help.

+

How a network component is formed.

+

What happens when such a concept is extended for many data points? Not all of them would be connected - because we’re applying a minimum threshold that they have to meet. This is the only hueristic part of the rather fast process. Here’s one more helpful visual:

+

How a network cluster is formed.

+

Very starry night-eque vibes here. Let’s get to the code.

+ + + + + +
1import networkx as nx
+2def get_cluster_map(label, k=5, min_cosine_distance=0.95):
+3    edge_list = (
+4        get_edge_list(label, k=k)
+5        .filter(pl.col("distance") >= min_cosine_distance)
+6    )
+7    graph = nx.from_pandas_edgelist(edge_list.to_pandas(), source="from", target="to")
+8    return {i: list(x) for i,x in enumerate(nx.connected_components(graph))}

Getting clusters

+

Now that all the parts of the puzzle are together, let’s run it to see what kind of clusters you get for Cell Phone Accessories.

+ + + + + +
1clusters = get_cluster_map("Cell Phones Accessories", 5, 0.95)

Make sure to configure the following if your results aren’t good enough:

+
    +
  1. Relax the min_cosine_distance value if you want bigger clusters.
  2. +
  3. Increase the number of nearest neighbors if you want more matches.
  4. +
+

Viewing the components

+

There will likely be many clusters (you can see how many exactly with len(clusters)). Let’s look at a random cluster:

+ + + + + +
1>> clusters[3]
+2['smartphone lanyard with card slot for any phone up to 6 yellow 72570099',
+3 'smartphone lanyard with card slot for any phone up to 6 black 72570093',
+4 'smartphone lanyard with card slot for any phone up to 6 lightblue 72570097',
+5 'smartphone lanyard with card slot for any phone up to 6 blue 72570095',
+6 'smartphone lanyard with card slot for any phone up to 6 green 72570101',
+7 'smartphone lanyard with card slot for any phone up to 6 pink 72570091']

Let’s see another cluster that had 172(!) members in my run (the clusters themselves will be stable, but their indices may change in each run owing to some inherent randomness in the process).

+ + + + + +
 1>>> clusters[6]
+ 2['otm essentials iphone 8/7 modern clear printed phone case snowflakes iphone 8/7 op qq z051a',
+ 3 'otm essentials iphone 8/7 modern clear printed phone case iphone 8/7 arrows blue op qq a02 58',
+ 4 'otm essentials iphone 8/7/6s clear printed phone case single iphone 8/7/6s golden pineapple op qq z089a',
+ 5 'otm essentials iphone 8/7/6s clear printed phone case single iphone 8/7/6s butteryfly delight yellow op qq z029d',
+ 6 'otm essentials iphone 8/7 modern clear printed phone case iphone 8/7 luck of the irish op qq a01 45',
+ 7 'otm essentials iphone 8/7 modern clear printed phone case iphone 8/7 brides maid white op qq a02 16',
+ 8 ...
+ 9 'otm essentials iphone 8/7 modern clear printed phone case iphone 8/7 flying arrows white op qq hip 20',
+10 'otm essentials iphone 8/7 modern clear printed phone case iphone 8/7 brides maid pink white op qq a02 17',
+11 'otm essentials iphone 8/7 modern clear printed phone case iphone 8/7 anemone flowers white op qq z036a',
+12 'otm essentials iphone 8/7 modern clear printed phone case mustache iphone 8/7 op qq hip 08',
+13 'otm essentials iphone 8/7 modern clear printed phone case oh snap iphone 8/7 op qq z053a',
+14 'otm essentials iphone 8/7/6s clear printed phone case single iphone 8/7/6s desert cacti orange pink op qq a02 22']

Running for all categories

+

This isn’t that hard (although it may take more than a moment). Just iterate it for each category!

+ + + + + +
1clusters = [get_cluster_map(x, 5, 0.95) for x in data.get_column("category_label").unique()]

For the folks in a hurry!

+

I get it - you often want a solution that “just works”. I can come close to it. See below for code and a succinct explanation. For those of my readers who aren’t in a hurry, this also serves as a nice summary (and copy-pastable code)!

+

The code

+ + + + + +
 1import sentence_transformers
+ 2import faiss
+ 3import polars as pl
+ 4import numpy as np
+ 5
+ 6# Data is read here. You download the files from Kaggle here: 
+ 7# https://www.kaggle.com/datasets/lakritidis/product-classification-and-categorization
+ 8data = pl.read_csv("archive/shopmania.csv", new_columns=[
+ 9    "product_ID", "product_title", "category_ID", "category_label"])
+10data = (
+11    data
+12    .filter(pl.count().over("category_ID") == 10000)
+13    .with_row_count("row_idx")
+14)
+15
+16
+17# See list of models at www.sbert.net/docs/pretrained_models.html
+18ST = sentence_transformers.SentenceTransformer("all-mpnet-base-v2")
+19title_embeddings = (
+20    ST.encode(
+21        data.get_column("product_title").to_list(),
+22        # I'm on a MacBook, you should use `cuda` or `cpu`
+23        # if you've got different hardware.
+24        device="mps",
+25        show_progress_bar=True, convert_to_tensor=True)
+26    .cpu().numpy())
+27
+28# Code to create a FAISS index
+29def create_index(label):
+30    faiss_indices = (
+31        data # this needs to be an argument if you want to create a generic function
+32        .filter(pl.col("category_label") == label)
+33        .get_column("row_idx")
+34        .to_list()
+35    )
+36    
+37    faiss_data = title_embeddings[faiss_indices]
+38    d = faiss_data.shape[1]         # Number of dimensions
+39    faiss_DB = faiss.IndexFlatIP(d) # Index using Inner Product
+40    faiss.normalize_L2(faiss_data)  # Normalized L2 with Inner Product search = cosine similarity
+41    faiss_DB.add(faiss_data)        # Build the index
+42    
+43    return faiss_DB, faiss_data, faiss_indices
+44
+45# Code to create an edge-list
+46def get_edge_list(label, k=5):
+47    faiss_DB, faiss_data, faiss_indices = create_index(label)
+48    # To map the data back to the original `train[b'data']` array
+49    faiss_indices_map = {i: x for i,x in enumerate(faiss_indices)}
+50    # To map the indices back to the original strings
+51    title_name_map = {i: x for i,x in data.select("row_idx", "product_title").rows()}
+52    distances, neighbors = faiss_DB.search(faiss_data, k)
+53    
+54    return (
+55        pl.DataFrame({
+56            "from": faiss_indices})
+57        .with_columns(
+58            pl.Series("to", neighbors),
+59            pl.Series("distance", distances))
+60        .explode("to", "distance")
+61        .with_columns(
+62            pl.col("from")
+63            .map_dict(title_name_map),
+64            pl.col("to")
+65            .map_dict(faiss_indices_map)
+66            .map_dict(title_name_map))
+67        .filter(pl.col("from") != pl.col("to"))
+68    )
+69
+70# Code to extract components from a Network Graph
+71import networkx as nx
+72def get_cluster_map(label, k=5, min_cosine_distance=0.95):
+73    edge_list = (
+74        get_edge_list(label, k=k)
+75        .filter(pl.col("distance") >= min_cosine_distance)
+76    )
+77    graph = nx.from_pandas_edgelist(edge_list.to_pandas(), source="from", target="to")
+78    return {i: list(x) for i,x in enumerate(nx.connected_components(graph))}
+79
+80# Example call to a single category to obtain its clusters
+81clusters = get_cluster_map("Cell Phones Accessories", 5, 0.95)
+82# Example call to **all** categories to obtain all clusters
+83clusters = [get_cluster_map(x, 5, 0.95) for x in data.get_column("category_label").unique()]

How the code works

+

If you want to write down an algorithmic way of looking at this approach,

+
    +
  1. Obtain a 2D representation of the labelled/categorized data. This can be embeddings for strings, the final hidden state output from a generic CNN model for images, or a good ol’ tabular dataset where all numbers are normalized and can be expressed as such.
  2. +
  3. Create an ANN database (based on a package such as faiss) that allows you fast nearest neighbor searches. Use cosine similarity for an easy threshold determination step.
  4. +
  5. Obtain an edge-list of k (from 5 to 100) nearest neighbors for all (or a sample of data points in case your dataset is incredibly HUGE) data points in the ANN database.
  6. +
  7. Apply a minimum threshold on similarity (completely based on heuristics), and obtain the connected components of the network graph from the filtered edge-list you just created.
  8. +
  9. Map all indices back to their source data-points that make sense, and pick any number of items from each cluster (usually, I end up picking one element from each cluster), and you now have your representative sample!
  10. +
+]]>
\ No newline at end of file diff --git a/public/tags/network/index.html b/public/tags/network/index.html new file mode 100644 index 0000000..16b5731 --- /dev/null +++ b/public/tags/network/index.html @@ -0,0 +1,6 @@ +Network | Avinash's Blog
+

Avinash's Blog

Filtering for "Network"

© Avinash Mallya | Design via Bear Cub.
\ No newline at end of file diff --git a/public/tags/network/index.xml b/public/tags/network/index.xml new file mode 100644 index 0000000..b336cb2 --- /dev/null +++ b/public/tags/network/index.xml @@ -0,0 +1,383 @@ +Network on Avinash's Bloghttps://avimallu.dev/tags/network/Recent content in Network on Avinash's BlogHugo -- gohugo.ioen-US© Avinash MallyaThu, 19 Oct 2023 00:00:00 +0000Finding representative samples efficiently for large datasetshttps://avimallu.dev/blog/002_representative_samples/Thu, 19 Oct 2023 00:00:00 +0000https://avimallu.dev/blog/002_representative_samples/<h1 id="premise">Premise</h1> +<p>In this day and age, we&rsquo;re not short on data. <em>Good</em> data, on the other hand, is very valuable. When you&rsquo;ve got a large amount of improperly labelled data, it may become hard to find to find a representative dataset to train a model on such that it generalizes well.</p> +<p>Let&rsquo;s formalize the problem a little so that a proper approach can be developed. Here&rsquo;s the problem statement:</p> +<ol> +<li>You have a large-ish set of (imperfectly) labelled data points. These data points can be represented as a 2D matrix.</li> +<li>You need to train a model to classify these data points on either these labels, or on labels dervied from imperfect labels.</li> +<li>You need a good (but not perfect) representative sample for the model to be generalizable, but there are too many data points for each label to manually pick representative examples.</li> +</ol> +<h2 id="in-a-hurry">In a hurry?</h2> +<p>Here&rsquo;s what you need to do:</p>Premise +

In this day and age, we’re not short on data. Good data, on the other hand, is very valuable. When you’ve got a large amount of improperly labelled data, it may become hard to find to find a representative dataset to train a model on such that it generalizes well.

+

Let’s formalize the problem a little so that a proper approach can be developed. Here’s the problem statement:

+
    +
  1. You have a large-ish set of (imperfectly) labelled data points. These data points can be represented as a 2D matrix.
  2. +
  3. You need to train a model to classify these data points on either these labels, or on labels dervied from imperfect labels.
  4. +
  5. You need a good (but not perfect) representative sample for the model to be generalizable, but there are too many data points for each label to manually pick representative examples.
  6. +
+

In a hurry?

+

Here’s what you need to do:

+
    +
  1. Read the premise and see if it fits your problem.
  2. +
  3. Go to the For the folks in a hurry! section at the end to find the generic solution and how it works.
  4. +
+

Why do we need representative samples?

+

Generally, three things come to mind:

+
    +
  1. Allows the model to be generalizable for all kinds of data points within a category.
  2. +
  3. Allows for faster training of the model - you need fewer data points to get the same accuracy!
  4. +
  5. Allows maintaining the training set - if your training set needs validation by experts or annotations, this keeps your costs low!
  6. +
+

Define the data

+

This data can be practically anything that can be represented as a 2D matrix.

+

There are exceptions. Raw image data (as numbers) might get difficult because even if you flatten them, they’ll be significant correlation between features. For example, a face can appear practically anywhere in the image, and all pixels centered around the face will be highly correlated, even if they are on different lines. A workaround in this case would be to pipe the image through a CNN model that has been trained on some generic task and produces a 1D representation of a single image in the final hidden layer before the output. Other data will need further processing along similar lines.

+

Get a specific dataset

+

For this specific article, I will use the ShopMania dataset on Kaggle. I apologize in advance for not using a more easily accessible dataset (you need to sign into Kaggle to download it) - and I’m not 100% sure if the GPL allows me to create a copy of the data and place it in my own repository. Nevertheless, the data (if you download it and choose to use it instead of some other dataset) will look like this:

+
+

NOTE: whenever I want to show an output along with the code I used for it, you’ll see the characters >> indicating the command used, and the output to be without those prefixes.

+
+ + + + + +
 1>> import polars as pl
+ 2>> data = pl.read_csv("archive/shopmania.csv")
+ 3>> data
+ 4shape: (313_705, 4)
+ 5┌────────────┬──────────────────────────────────────────────────────┬─────────────┬────────────────┐
+ 6 product_ID  product_title                                         category_ID  category_label 
+ 7 ---         ---                                                   ---          ---            
+ 8 i64         str                                                   i64          str            
+ 9╞════════════╪══════════════════════════════════════════════════════╪═════════════╪════════════════╡
+10 2           twilight central park print                           2            Collectibles   
+11 3           fox print                                             2            Collectibles   
+12 4           circulo de papel wall art                             2            Collectibles   
+13 5           hidden path print                                     2            Collectibles   
+14                                                                                           
+15 313703      deago anti fog swimming diving full face mask         229          Water Sports   
+16             surface snorkel scuba fr gopro black s/m                                          
+17 313704      etc buys full face gopro compatible snorkel scuba     229          Water Sports   
+18             diving mask blue large/xtralarge blue                                             
+19 313705      men 039 s full face breathe free diving snorkel mask  229          Water Sports   
+20             scuba optional hd camera blue mask only adult men                                 
+21 313706      women 039 s full face breathe free diving snorkel     229          Water Sports   
+22             mask scuba optional hd camera black mask only                                     
+23             children and women                                                                
+24└────────────┴──────────────────────────────────────────────────────┴─────────────┴────────────────┘

The data documentation on Kaggle states:

+
+

The first dataset originates from ShopMania, a popular online product comparison platform. It enlists tens of millions of products organized in a three-level hierarchy that includes 230 categories. The two higher levels of the hierarchy include 39 categories, whereas the third lower level accommodates the rest 191 leaf categories. Each product is categorized into this tree structure by being mapped to only one leaf category. Some of these 191 leaf categories contain millions of products. However, shopmania.com allows only the first 10,000 products to be retrieved from each category. Under this restriction, our crawler managed to collect 313,706 products.

+
+

For demonstration, I’ll just limit the categories to those that have exactly 10,000 occurences.

+ + + + + +
1data = (
+2    data
+3    .filter(pl.count().over("category_ID") == 10000)
+4)

You’ll notice that there are only 17 categories in this dataset. Run this to verify that fact.

+ + + + + +
 1>>> data.get_column("category_label").unique()
+ 2shape: (17,)
+ 3Series: 'category_label' [str]
+ 4[
+ 5    "Kitchen & Dining"
+ 6    "Scarves and wraps"
+ 7    "Handbags & Wallets"
+ 8    "Rugs  Tapestry & Linens"
+ 9    "Cell Phones Accessories"
+10    "Men's Clothing"
+11    "Jewelry"
+12    "Belts"
+13    "Men Lingerie"
+14    "Crafts"
+15    "Football"
+16    "Medical Supplies"
+17    "Adult"
+18    "Hunting"
+19    "Women's Clothing"
+20    "Pet Supply"
+21    "Office Supplies"
+22]

Note that this is very easy in Polars, which is the package I typically use for data manipulation. I recommend using it over Pandas.

+

Specify the task

+

Okay - so now we have exactly 10,000 products per category. We only have the title of the product that can be leveraged for categorization. So let me define the task this way:

+
+

Craft a small representative sample for each category.

+
+

Why small? It helps that it’ll make the model faster to train - and keep the training data manageable in size.

+

Finding representative samples

+

I mentioned earlier that we need to represent data as a 2D matrix for the technique I have in mind to work. How can I translate a list of text to a matrix? The answer’s rather simple: use SentenceTransformers to get a string’s embedding. You could also use more classic techniques like computing TF-IDF values, or use more advanced transformers, but I’ve noticed that SentenceTransformers are able to capture semantic meaning of sentences rather well (assuming you use a good model suited for the language the data is in) - they are trained on sentence similarity after all.

+

Getting SentenceTransformer embeddings

+

This part is rather simple. If you’re unable to install SentenceTransformers, please check their website.

+ + + + + +
1import sentence_transformers
+2# See list of models at www.sbert.net/docs/pretrained_models.html
+3ST = sentence_transformers.SentenceTransformer("all-mpnet-base-v2")
+4title_embeddings = (
+5    ST.encode(
+6        data.get_column("product_title").to_list(),
+7        show_progress_bar=True, convert_to_tensor=True)
+8    .numpy())

This process will be slow (~30 minutes) if you don’t have a GPU. There are faster approaches, but they are slightly more involved than would be beneficial for a blog post. The wait will be worth it, I promise! In addition, the call to .numpy() at the end is to directly get a single numpy array - otherwise you get a list of numpy arrays, which is rather inefficient. Further, SentenceTransformers will try to run on the GPU if available, and if so, you will need to write .cpu().numpy() so that the tensor is copied from the GPU to the CPU.

+
+

NOTE: for a proof-of-concept implementation, or if you’re on the CPU, try the all-MiniLM-L6-v2 model. It’s a much smaller and much faster model, although you sacrifice a little in terms of accuracy.

+
+

The concept of approximate nearest neighbors

+

Performing any kind of nearest neighbor algorithm on medium scale datasets (even bordering 10,000 rows and tens of columns) tends to be slow. A primary driver of this was the need to calculate all, or nearly all distances between all data points. Approximate nearest neighbor (ANN) algorithms work around this through various approaches, which warrant their own blog post. For now, it would suffice to understand that there are shortcuts that ANN algorithms take to give you if not the exact nearest neighbor, at least one of the nearest neighbors (hence the term approximate).

+

There are several algorithms that you can use - I shall proceed with faiss, because it has a nice Python interface and is rather easy to work with. You can use any algorithm - a full list of the major ones are available here.

+

I’ll explain why we’re in the nearest neighbor territory in due course.

+

Building the database

+

To build the database, all we need is the title_embeddings matrix.

+ + + + + +
1import faiss
+2def create_index(title_embeddings):
+3    d = title_embeddings.shape[1]    # Number of dimensions
+4    ann_index = faiss.IndexFlatL2(d) # Index using Eucledian Matrix
+5    ann_index.add(title_embeddings)  # Build the index
+6    
+7    return ann_index # Faiss considers databases an "index"

This does create a database. But remember, we’re trying to find representative samples - which means we need to do this by the category (or label). So let’s design a function that sends only the necessary data as that for a particular category, and then create the database. We’ll need three pieces of information from this function:

+
    +
  1. The actual faiss database.
  2. +
  3. The actual subset of data that was used to build this index.
  4. +
  5. The label indices with respect to the original data that went into the faiss database.
  6. +
+

(2) and (3) will help us later in rebuilding a “network graph” that will allow us to reference the original data points.

+ + + + + +
 1import faiss
+ 2import numpy as np
+ 3import polars as pl
+ 4
+ 5def create_index(label):
+ 6    faiss_indices = (
+ 7        data # this needs to be an argument if you want to create a generic function
+ 8        .with_row_count("row_idx")
+ 9        .filter(pl.col("category_label") == label)
+10        .get_column("row_idx")
+11        .to_list()
+12    )
+13    
+14    faiss_data = title_embeddings[faiss_indices]
+15    d = data.shape[1]               # Number of dimensions
+16    faiss_DB = faiss.IndexFlatIP(d) # Index using Inner Product
+17    faiss.normalize_L2(data)        # Normalized L2 with Inner Product search = cosine similarity
+18    # Why cosine similarity? It's easier to specify thresholds - they'll always be between 0 and 1.4.
+19    # If using Eucledian or other distance, we'll have to spend some time finding a good range
+20    # where distances are reasonable. See https://stats.stackexchange.com/a/146279 for details.
+21    faiss_DB.add(data)              # Build the index
+22    
+23    return faiss_DB, faiss_data, faiss_indices

Identifying the nearest neighbors

+

To proceed with getting a representative sample, the next step is to find the nearest neighbors for all data points in the database. This isn’t too hard - faiss index objects have a built-in search method to find the k nearest neighbors for a given index, along with the (approximate) distance to it. Let’s then write a function to get the following information: the label index for whom nearest neighbors are being searched, the indices of said nearest neighbors and the distance between them. In network graph parlance, this kind of data is called an edge list i.e. a list of pair of nodes that are connected, along with any additional information that specifies a property (in this case distance) of the edge that connects these nodes.

+ + + + + +
 1def get_edge_list(label, k=5):
+ 2    faiss_DB, faiss_data, faiss_indices = create_index(label)
+ 3    # To map the data back to the original `train[b'data']` array
+ 4    faiss_indices_map = {i: x for i,x in enumerate(faiss_indices)}
+ 5    # To map the indices back to the original strings
+ 6    title_name_map = {i: x for i,x in data.select("row_idx", "product_title").rows()}
+ 7    distances, neighbors = faiss_DB.search(faiss_data, k)
+ 8    
+ 9    return (
+10        pl.DataFrame({
+11            "from": faiss_indices})
+12        .with_columns(
+13            pl.Series("to", neighbors),
+14            pl.Series("distance", distances))
+15        .explode("to", "distance")
+16        .with_columns(
+17            pl.col("from")
+18            .map_dict(title_name_map),
+19            pl.col("to")
+20            .map_dict(faiss_indices_map)
+21            .map_dict(title_name_map))
+22        .filter(pl.col("from") != pl.col("to"))
+23    )                   

NetworkX and Connected Components

+

The next step in the process is to create a network graph using the edge-list. But why?

+

Remember that we have identified the (k=5) nearest neighbors of each data point. Let’s say that we have a point A that has a nearest neighbor B. C is not a nearest neighbor of A, but it is a nearest neighbor of B. In a network graph, if A and C are sufficiently similar enough to B within a particular minimum thershold, then A will be connected to C through B! Hopefully a small visual below would help.

+

How a network component is formed.

+

What happens when such a concept is extended for many data points? Not all of them would be connected - because we’re applying a minimum threshold that they have to meet. This is the only hueristic part of the rather fast process. Here’s one more helpful visual:

+

How a network cluster is formed.

+

Very starry night-eque vibes here. Let’s get to the code.

+ + + + + +
1import networkx as nx
+2def get_cluster_map(label, k=5, min_cosine_distance=0.95):
+3    edge_list = (
+4        get_edge_list(label, k=k)
+5        .filter(pl.col("distance") >= min_cosine_distance)
+6    )
+7    graph = nx.from_pandas_edgelist(edge_list.to_pandas(), source="from", target="to")
+8    return {i: list(x) for i,x in enumerate(nx.connected_components(graph))}

Getting clusters

+

Now that all the parts of the puzzle are together, let’s run it to see what kind of clusters you get for Cell Phone Accessories.

+ + + + + +
1clusters = get_cluster_map("Cell Phones Accessories", 5, 0.95)

Make sure to configure the following if your results aren’t good enough:

+
    +
  1. Relax the min_cosine_distance value if you want bigger clusters.
  2. +
  3. Increase the number of nearest neighbors if you want more matches.
  4. +
+

Viewing the components

+

There will likely be many clusters (you can see how many exactly with len(clusters)). Let’s look at a random cluster:

+ + + + + +
1>> clusters[3]
+2['smartphone lanyard with card slot for any phone up to 6 yellow 72570099',
+3 'smartphone lanyard with card slot for any phone up to 6 black 72570093',
+4 'smartphone lanyard with card slot for any phone up to 6 lightblue 72570097',
+5 'smartphone lanyard with card slot for any phone up to 6 blue 72570095',
+6 'smartphone lanyard with card slot for any phone up to 6 green 72570101',
+7 'smartphone lanyard with card slot for any phone up to 6 pink 72570091']

Let’s see another cluster that had 172(!) members in my run (the clusters themselves will be stable, but their indices may change in each run owing to some inherent randomness in the process).

+ + + + + +
 1>>> clusters[6]
+ 2['otm essentials iphone 8/7 modern clear printed phone case snowflakes iphone 8/7 op qq z051a',
+ 3 'otm essentials iphone 8/7 modern clear printed phone case iphone 8/7 arrows blue op qq a02 58',
+ 4 'otm essentials iphone 8/7/6s clear printed phone case single iphone 8/7/6s golden pineapple op qq z089a',
+ 5 'otm essentials iphone 8/7/6s clear printed phone case single iphone 8/7/6s butteryfly delight yellow op qq z029d',
+ 6 'otm essentials iphone 8/7 modern clear printed phone case iphone 8/7 luck of the irish op qq a01 45',
+ 7 'otm essentials iphone 8/7 modern clear printed phone case iphone 8/7 brides maid white op qq a02 16',
+ 8 ...
+ 9 'otm essentials iphone 8/7 modern clear printed phone case iphone 8/7 flying arrows white op qq hip 20',
+10 'otm essentials iphone 8/7 modern clear printed phone case iphone 8/7 brides maid pink white op qq a02 17',
+11 'otm essentials iphone 8/7 modern clear printed phone case iphone 8/7 anemone flowers white op qq z036a',
+12 'otm essentials iphone 8/7 modern clear printed phone case mustache iphone 8/7 op qq hip 08',
+13 'otm essentials iphone 8/7 modern clear printed phone case oh snap iphone 8/7 op qq z053a',
+14 'otm essentials iphone 8/7/6s clear printed phone case single iphone 8/7/6s desert cacti orange pink op qq a02 22']

Running for all categories

+

This isn’t that hard (although it may take more than a moment). Just iterate it for each category!

+ + + + + +
1clusters = [get_cluster_map(x, 5, 0.95) for x in data.get_column("category_label").unique()]

For the folks in a hurry!

+

I get it - you often want a solution that “just works”. I can come close to it. See below for code and a succinct explanation. For those of my readers who aren’t in a hurry, this also serves as a nice summary (and copy-pastable code)!

+

The code

+ + + + + +
 1import sentence_transformers
+ 2import faiss
+ 3import polars as pl
+ 4import numpy as np
+ 5
+ 6# Data is read here. You download the files from Kaggle here: 
+ 7# https://www.kaggle.com/datasets/lakritidis/product-classification-and-categorization
+ 8data = pl.read_csv("archive/shopmania.csv", new_columns=[
+ 9    "product_ID", "product_title", "category_ID", "category_label"])
+10data = (
+11    data
+12    .filter(pl.count().over("category_ID") == 10000)
+13    .with_row_count("row_idx")
+14)
+15
+16
+17# See list of models at www.sbert.net/docs/pretrained_models.html
+18ST = sentence_transformers.SentenceTransformer("all-mpnet-base-v2")
+19title_embeddings = (
+20    ST.encode(
+21        data.get_column("product_title").to_list(),
+22        # I'm on a MacBook, you should use `cuda` or `cpu`
+23        # if you've got different hardware.
+24        device="mps",
+25        show_progress_bar=True, convert_to_tensor=True)
+26    .cpu().numpy())
+27
+28# Code to create a FAISS index
+29def create_index(label):
+30    faiss_indices = (
+31        data # this needs to be an argument if you want to create a generic function
+32        .filter(pl.col("category_label") == label)
+33        .get_column("row_idx")
+34        .to_list()
+35    )
+36    
+37    faiss_data = title_embeddings[faiss_indices]
+38    d = faiss_data.shape[1]         # Number of dimensions
+39    faiss_DB = faiss.IndexFlatIP(d) # Index using Inner Product
+40    faiss.normalize_L2(faiss_data)  # Normalized L2 with Inner Product search = cosine similarity
+41    faiss_DB.add(faiss_data)        # Build the index
+42    
+43    return faiss_DB, faiss_data, faiss_indices
+44
+45# Code to create an edge-list
+46def get_edge_list(label, k=5):
+47    faiss_DB, faiss_data, faiss_indices = create_index(label)
+48    # To map the data back to the original `train[b'data']` array
+49    faiss_indices_map = {i: x for i,x in enumerate(faiss_indices)}
+50    # To map the indices back to the original strings
+51    title_name_map = {i: x for i,x in data.select("row_idx", "product_title").rows()}
+52    distances, neighbors = faiss_DB.search(faiss_data, k)
+53    
+54    return (
+55        pl.DataFrame({
+56            "from": faiss_indices})
+57        .with_columns(
+58            pl.Series("to", neighbors),
+59            pl.Series("distance", distances))
+60        .explode("to", "distance")
+61        .with_columns(
+62            pl.col("from")
+63            .map_dict(title_name_map),
+64            pl.col("to")
+65            .map_dict(faiss_indices_map)
+66            .map_dict(title_name_map))
+67        .filter(pl.col("from") != pl.col("to"))
+68    )
+69
+70# Code to extract components from a Network Graph
+71import networkx as nx
+72def get_cluster_map(label, k=5, min_cosine_distance=0.95):
+73    edge_list = (
+74        get_edge_list(label, k=k)
+75        .filter(pl.col("distance") >= min_cosine_distance)
+76    )
+77    graph = nx.from_pandas_edgelist(edge_list.to_pandas(), source="from", target="to")
+78    return {i: list(x) for i,x in enumerate(nx.connected_components(graph))}
+79
+80# Example call to a single category to obtain its clusters
+81clusters = get_cluster_map("Cell Phones Accessories", 5, 0.95)
+82# Example call to **all** categories to obtain all clusters
+83clusters = [get_cluster_map(x, 5, 0.95) for x in data.get_column("category_label").unique()]

How the code works

+

If you want to write down an algorithmic way of looking at this approach,

+
    +
  1. Obtain a 2D representation of the labelled/categorized data. This can be embeddings for strings, the final hidden state output from a generic CNN model for images, or a good ol’ tabular dataset where all numbers are normalized and can be expressed as such.
  2. +
  3. Create an ANN database (based on a package such as faiss) that allows you fast nearest neighbor searches. Use cosine similarity for an easy threshold determination step.
  4. +
  5. Obtain an edge-list of k (from 5 to 100) nearest neighbors for all (or a sample of data points in case your dataset is incredibly HUGE) data points in the ANN database.
  6. +
  7. Apply a minimum threshold on similarity (completely based on heuristics), and obtain the connected components of the network graph from the filtered edge-list you just created.
  8. +
  9. Map all indices back to their source data-points that make sense, and pick any number of items from each cluster (usually, I end up picking one element from each cluster), and you now have your representative sample!
  10. +
+]]>
\ No newline at end of file diff --git a/public/tags/networkx/index.html b/public/tags/networkx/index.html new file mode 100644 index 0000000..bd47372 --- /dev/null +++ b/public/tags/networkx/index.html @@ -0,0 +1,6 @@ +Networkx | Avinash's Blog
+

Avinash's Blog

Filtering for "Networkx"

© Avinash Mallya | Design via Bear Cub.
\ No newline at end of file diff --git a/public/tags/networkx/index.xml b/public/tags/networkx/index.xml new file mode 100644 index 0000000..4c595dc --- /dev/null +++ b/public/tags/networkx/index.xml @@ -0,0 +1,383 @@ +Networkx on Avinash's Bloghttps://avimallu.dev/tags/networkx/Recent content in Networkx on Avinash's BlogHugo -- gohugo.ioen-US© Avinash MallyaThu, 19 Oct 2023 00:00:00 +0000Finding representative samples efficiently for large datasetshttps://avimallu.dev/blog/002_representative_samples/Thu, 19 Oct 2023 00:00:00 +0000https://avimallu.dev/blog/002_representative_samples/<h1 id="premise">Premise</h1> +<p>In this day and age, we&rsquo;re not short on data. <em>Good</em> data, on the other hand, is very valuable. When you&rsquo;ve got a large amount of improperly labelled data, it may become hard to find to find a representative dataset to train a model on such that it generalizes well.</p> +<p>Let&rsquo;s formalize the problem a little so that a proper approach can be developed. Here&rsquo;s the problem statement:</p> +<ol> +<li>You have a large-ish set of (imperfectly) labelled data points. These data points can be represented as a 2D matrix.</li> +<li>You need to train a model to classify these data points on either these labels, or on labels dervied from imperfect labels.</li> +<li>You need a good (but not perfect) representative sample for the model to be generalizable, but there are too many data points for each label to manually pick representative examples.</li> +</ol> +<h2 id="in-a-hurry">In a hurry?</h2> +<p>Here&rsquo;s what you need to do:</p>Premise +

In this day and age, we’re not short on data. Good data, on the other hand, is very valuable. When you’ve got a large amount of improperly labelled data, it may become hard to find to find a representative dataset to train a model on such that it generalizes well.

+

Let’s formalize the problem a little so that a proper approach can be developed. Here’s the problem statement:

+
    +
  1. You have a large-ish set of (imperfectly) labelled data points. These data points can be represented as a 2D matrix.
  2. +
  3. You need to train a model to classify these data points on either these labels, or on labels dervied from imperfect labels.
  4. +
  5. You need a good (but not perfect) representative sample for the model to be generalizable, but there are too many data points for each label to manually pick representative examples.
  6. +
+

In a hurry?

+

Here’s what you need to do:

+
    +
  1. Read the premise and see if it fits your problem.
  2. +
  3. Go to the For the folks in a hurry! section at the end to find the generic solution and how it works.
  4. +
+

Why do we need representative samples?

+

Generally, three things come to mind:

+
    +
  1. Allows the model to be generalizable for all kinds of data points within a category.
  2. +
  3. Allows for faster training of the model - you need fewer data points to get the same accuracy!
  4. +
  5. Allows maintaining the training set - if your training set needs validation by experts or annotations, this keeps your costs low!
  6. +
+

Define the data

+

This data can be practically anything that can be represented as a 2D matrix.

+

There are exceptions. Raw image data (as numbers) might get difficult because even if you flatten them, they’ll be significant correlation between features. For example, a face can appear practically anywhere in the image, and all pixels centered around the face will be highly correlated, even if they are on different lines. A workaround in this case would be to pipe the image through a CNN model that has been trained on some generic task and produces a 1D representation of a single image in the final hidden layer before the output. Other data will need further processing along similar lines.

+

Get a specific dataset

+

For this specific article, I will use the ShopMania dataset on Kaggle. I apologize in advance for not using a more easily accessible dataset (you need to sign into Kaggle to download it) - and I’m not 100% sure if the GPL allows me to create a copy of the data and place it in my own repository. Nevertheless, the data (if you download it and choose to use it instead of some other dataset) will look like this:

+
+

NOTE: whenever I want to show an output along with the code I used for it, you’ll see the characters >> indicating the command used, and the output to be without those prefixes.

+
+ + + + + +
 1>> import polars as pl
+ 2>> data = pl.read_csv("archive/shopmania.csv")
+ 3>> data
+ 4shape: (313_705, 4)
+ 5┌────────────┬──────────────────────────────────────────────────────┬─────────────┬────────────────┐
+ 6 product_ID  product_title                                         category_ID  category_label 
+ 7 ---         ---                                                   ---          ---            
+ 8 i64         str                                                   i64          str            
+ 9╞════════════╪══════════════════════════════════════════════════════╪═════════════╪════════════════╡
+10 2           twilight central park print                           2            Collectibles   
+11 3           fox print                                             2            Collectibles   
+12 4           circulo de papel wall art                             2            Collectibles   
+13 5           hidden path print                                     2            Collectibles   
+14                                                                                           
+15 313703      deago anti fog swimming diving full face mask         229          Water Sports   
+16             surface snorkel scuba fr gopro black s/m                                          
+17 313704      etc buys full face gopro compatible snorkel scuba     229          Water Sports   
+18             diving mask blue large/xtralarge blue                                             
+19 313705      men 039 s full face breathe free diving snorkel mask  229          Water Sports   
+20             scuba optional hd camera blue mask only adult men                                 
+21 313706      women 039 s full face breathe free diving snorkel     229          Water Sports   
+22             mask scuba optional hd camera black mask only                                     
+23             children and women                                                                
+24└────────────┴──────────────────────────────────────────────────────┴─────────────┴────────────────┘

The data documentation on Kaggle states:

+
+

The first dataset originates from ShopMania, a popular online product comparison platform. It enlists tens of millions of products organized in a three-level hierarchy that includes 230 categories. The two higher levels of the hierarchy include 39 categories, whereas the third lower level accommodates the rest 191 leaf categories. Each product is categorized into this tree structure by being mapped to only one leaf category. Some of these 191 leaf categories contain millions of products. However, shopmania.com allows only the first 10,000 products to be retrieved from each category. Under this restriction, our crawler managed to collect 313,706 products.

+
+

For demonstration, I’ll just limit the categories to those that have exactly 10,000 occurences.

+ + + + + +
1data = (
+2    data
+3    .filter(pl.count().over("category_ID") == 10000)
+4)

You’ll notice that there are only 17 categories in this dataset. Run this to verify that fact.

+ + + + + +
 1>>> data.get_column("category_label").unique()
+ 2shape: (17,)
+ 3Series: 'category_label' [str]
+ 4[
+ 5    "Kitchen & Dining"
+ 6    "Scarves and wraps"
+ 7    "Handbags & Wallets"
+ 8    "Rugs  Tapestry & Linens"
+ 9    "Cell Phones Accessories"
+10    "Men's Clothing"
+11    "Jewelry"
+12    "Belts"
+13    "Men Lingerie"
+14    "Crafts"
+15    "Football"
+16    "Medical Supplies"
+17    "Adult"
+18    "Hunting"
+19    "Women's Clothing"
+20    "Pet Supply"
+21    "Office Supplies"
+22]

Note that this is very easy in Polars, which is the package I typically use for data manipulation. I recommend using it over Pandas.

+

Specify the task

+

Okay - so now we have exactly 10,000 products per category. We only have the title of the product that can be leveraged for categorization. So let me define the task this way:

+
+

Craft a small representative sample for each category.

+
+

Why small? It helps that it’ll make the model faster to train - and keep the training data manageable in size.

+

Finding representative samples

+

I mentioned earlier that we need to represent data as a 2D matrix for the technique I have in mind to work. How can I translate a list of text to a matrix? The answer’s rather simple: use SentenceTransformers to get a string’s embedding. You could also use more classic techniques like computing TF-IDF values, or use more advanced transformers, but I’ve noticed that SentenceTransformers are able to capture semantic meaning of sentences rather well (assuming you use a good model suited for the language the data is in) - they are trained on sentence similarity after all.

+

Getting SentenceTransformer embeddings

+

This part is rather simple. If you’re unable to install SentenceTransformers, please check their website.

+ + + + + +
1import sentence_transformers
+2# See list of models at www.sbert.net/docs/pretrained_models.html
+3ST = sentence_transformers.SentenceTransformer("all-mpnet-base-v2")
+4title_embeddings = (
+5    ST.encode(
+6        data.get_column("product_title").to_list(),
+7        show_progress_bar=True, convert_to_tensor=True)
+8    .numpy())

This process will be slow (~30 minutes) if you don’t have a GPU. There are faster approaches, but they are slightly more involved than would be beneficial for a blog post. The wait will be worth it, I promise! In addition, the call to .numpy() at the end is to directly get a single numpy array - otherwise you get a list of numpy arrays, which is rather inefficient. Further, SentenceTransformers will try to run on the GPU if available, and if so, you will need to write .cpu().numpy() so that the tensor is copied from the GPU to the CPU.

+
+

NOTE: for a proof-of-concept implementation, or if you’re on the CPU, try the all-MiniLM-L6-v2 model. It’s a much smaller and much faster model, although you sacrifice a little in terms of accuracy.

+
+

The concept of approximate nearest neighbors

+

Performing any kind of nearest neighbor algorithm on medium scale datasets (even bordering 10,000 rows and tens of columns) tends to be slow. A primary driver of this was the need to calculate all, or nearly all distances between all data points. Approximate nearest neighbor (ANN) algorithms work around this through various approaches, which warrant their own blog post. For now, it would suffice to understand that there are shortcuts that ANN algorithms take to give you if not the exact nearest neighbor, at least one of the nearest neighbors (hence the term approximate).

+

There are several algorithms that you can use - I shall proceed with faiss, because it has a nice Python interface and is rather easy to work with. You can use any algorithm - a full list of the major ones are available here.

+

I’ll explain why we’re in the nearest neighbor territory in due course.

+

Building the database

+

To build the database, all we need is the title_embeddings matrix.

+ + + + + +
1import faiss
+2def create_index(title_embeddings):
+3    d = title_embeddings.shape[1]    # Number of dimensions
+4    ann_index = faiss.IndexFlatL2(d) # Index using Eucledian Matrix
+5    ann_index.add(title_embeddings)  # Build the index
+6    
+7    return ann_index # Faiss considers databases an "index"

This does create a database. But remember, we’re trying to find representative samples - which means we need to do this by the category (or label). So let’s design a function that sends only the necessary data as that for a particular category, and then create the database. We’ll need three pieces of information from this function:

+
    +
  1. The actual faiss database.
  2. +
  3. The actual subset of data that was used to build this index.
  4. +
  5. The label indices with respect to the original data that went into the faiss database.
  6. +
+

(2) and (3) will help us later in rebuilding a “network graph” that will allow us to reference the original data points.

+ + + + + +
 1import faiss
+ 2import numpy as np
+ 3import polars as pl
+ 4
+ 5def create_index(label):
+ 6    faiss_indices = (
+ 7        data # this needs to be an argument if you want to create a generic function
+ 8        .with_row_count("row_idx")
+ 9        .filter(pl.col("category_label") == label)
+10        .get_column("row_idx")
+11        .to_list()
+12    )
+13    
+14    faiss_data = title_embeddings[faiss_indices]
+15    d = data.shape[1]               # Number of dimensions
+16    faiss_DB = faiss.IndexFlatIP(d) # Index using Inner Product
+17    faiss.normalize_L2(data)        # Normalized L2 with Inner Product search = cosine similarity
+18    # Why cosine similarity? It's easier to specify thresholds - they'll always be between 0 and 1.4.
+19    # If using Eucledian or other distance, we'll have to spend some time finding a good range
+20    # where distances are reasonable. See https://stats.stackexchange.com/a/146279 for details.
+21    faiss_DB.add(data)              # Build the index
+22    
+23    return faiss_DB, faiss_data, faiss_indices

Identifying the nearest neighbors

+

To proceed with getting a representative sample, the next step is to find the nearest neighbors for all data points in the database. This isn’t too hard - faiss index objects have a built-in search method to find the k nearest neighbors for a given index, along with the (approximate) distance to it. Let’s then write a function to get the following information: the label index for whom nearest neighbors are being searched, the indices of said nearest neighbors and the distance between them. In network graph parlance, this kind of data is called an edge list i.e. a list of pair of nodes that are connected, along with any additional information that specifies a property (in this case distance) of the edge that connects these nodes.

+ + + + + +
 1def get_edge_list(label, k=5):
+ 2    faiss_DB, faiss_data, faiss_indices = create_index(label)
+ 3    # To map the data back to the original `train[b'data']` array
+ 4    faiss_indices_map = {i: x for i,x in enumerate(faiss_indices)}
+ 5    # To map the indices back to the original strings
+ 6    title_name_map = {i: x for i,x in data.select("row_idx", "product_title").rows()}
+ 7    distances, neighbors = faiss_DB.search(faiss_data, k)
+ 8    
+ 9    return (
+10        pl.DataFrame({
+11            "from": faiss_indices})
+12        .with_columns(
+13            pl.Series("to", neighbors),
+14            pl.Series("distance", distances))
+15        .explode("to", "distance")
+16        .with_columns(
+17            pl.col("from")
+18            .map_dict(title_name_map),
+19            pl.col("to")
+20            .map_dict(faiss_indices_map)
+21            .map_dict(title_name_map))
+22        .filter(pl.col("from") != pl.col("to"))
+23    )                   

NetworkX and Connected Components

+

The next step in the process is to create a network graph using the edge-list. But why?

+

Remember that we have identified the (k=5) nearest neighbors of each data point. Let’s say that we have a point A that has a nearest neighbor B. C is not a nearest neighbor of A, but it is a nearest neighbor of B. In a network graph, if A and C are sufficiently similar enough to B within a particular minimum thershold, then A will be connected to C through B! Hopefully a small visual below would help.

+

How a network component is formed.

+

What happens when such a concept is extended for many data points? Not all of them would be connected - because we’re applying a minimum threshold that they have to meet. This is the only hueristic part of the rather fast process. Here’s one more helpful visual:

+

How a network cluster is formed.

+

Very starry night-eque vibes here. Let’s get to the code.

+ + + + + +
1import networkx as nx
+2def get_cluster_map(label, k=5, min_cosine_distance=0.95):
+3    edge_list = (
+4        get_edge_list(label, k=k)
+5        .filter(pl.col("distance") >= min_cosine_distance)
+6    )
+7    graph = nx.from_pandas_edgelist(edge_list.to_pandas(), source="from", target="to")
+8    return {i: list(x) for i,x in enumerate(nx.connected_components(graph))}

Getting clusters

+

Now that all the parts of the puzzle are together, let’s run it to see what kind of clusters you get for Cell Phone Accessories.

+ + + + + +
1clusters = get_cluster_map("Cell Phones Accessories", 5, 0.95)

Make sure to configure the following if your results aren’t good enough:

+
    +
  1. Relax the min_cosine_distance value if you want bigger clusters.
  2. +
  3. Increase the number of nearest neighbors if you want more matches.
  4. +
+

Viewing the components

+

There will likely be many clusters (you can see how many exactly with len(clusters)). Let’s look at a random cluster:

+ + + + + +
1>> clusters[3]
+2['smartphone lanyard with card slot for any phone up to 6 yellow 72570099',
+3 'smartphone lanyard with card slot for any phone up to 6 black 72570093',
+4 'smartphone lanyard with card slot for any phone up to 6 lightblue 72570097',
+5 'smartphone lanyard with card slot for any phone up to 6 blue 72570095',
+6 'smartphone lanyard with card slot for any phone up to 6 green 72570101',
+7 'smartphone lanyard with card slot for any phone up to 6 pink 72570091']

Let’s see another cluster that had 172(!) members in my run (the clusters themselves will be stable, but their indices may change in each run owing to some inherent randomness in the process).

+ + + + + +
 1>>> clusters[6]
+ 2['otm essentials iphone 8/7 modern clear printed phone case snowflakes iphone 8/7 op qq z051a',
+ 3 'otm essentials iphone 8/7 modern clear printed phone case iphone 8/7 arrows blue op qq a02 58',
+ 4 'otm essentials iphone 8/7/6s clear printed phone case single iphone 8/7/6s golden pineapple op qq z089a',
+ 5 'otm essentials iphone 8/7/6s clear printed phone case single iphone 8/7/6s butteryfly delight yellow op qq z029d',
+ 6 'otm essentials iphone 8/7 modern clear printed phone case iphone 8/7 luck of the irish op qq a01 45',
+ 7 'otm essentials iphone 8/7 modern clear printed phone case iphone 8/7 brides maid white op qq a02 16',
+ 8 ...
+ 9 'otm essentials iphone 8/7 modern clear printed phone case iphone 8/7 flying arrows white op qq hip 20',
+10 'otm essentials iphone 8/7 modern clear printed phone case iphone 8/7 brides maid pink white op qq a02 17',
+11 'otm essentials iphone 8/7 modern clear printed phone case iphone 8/7 anemone flowers white op qq z036a',
+12 'otm essentials iphone 8/7 modern clear printed phone case mustache iphone 8/7 op qq hip 08',
+13 'otm essentials iphone 8/7 modern clear printed phone case oh snap iphone 8/7 op qq z053a',
+14 'otm essentials iphone 8/7/6s clear printed phone case single iphone 8/7/6s desert cacti orange pink op qq a02 22']

Running for all categories

+

This isn’t that hard (although it may take more than a moment). Just iterate it for each category!

+ + + + + +
1clusters = [get_cluster_map(x, 5, 0.95) for x in data.get_column("category_label").unique()]

For the folks in a hurry!

+

I get it - you often want a solution that “just works”. I can come close to it. See below for code and a succinct explanation. For those of my readers who aren’t in a hurry, this also serves as a nice summary (and copy-pastable code)!

+

The code

+ + + + + +
 1import sentence_transformers
+ 2import faiss
+ 3import polars as pl
+ 4import numpy as np
+ 5
+ 6# Data is read here. You download the files from Kaggle here: 
+ 7# https://www.kaggle.com/datasets/lakritidis/product-classification-and-categorization
+ 8data = pl.read_csv("archive/shopmania.csv", new_columns=[
+ 9    "product_ID", "product_title", "category_ID", "category_label"])
+10data = (
+11    data
+12    .filter(pl.count().over("category_ID") == 10000)
+13    .with_row_count("row_idx")
+14)
+15
+16
+17# See list of models at www.sbert.net/docs/pretrained_models.html
+18ST = sentence_transformers.SentenceTransformer("all-mpnet-base-v2")
+19title_embeddings = (
+20    ST.encode(
+21        data.get_column("product_title").to_list(),
+22        # I'm on a MacBook, you should use `cuda` or `cpu`
+23        # if you've got different hardware.
+24        device="mps",
+25        show_progress_bar=True, convert_to_tensor=True)
+26    .cpu().numpy())
+27
+28# Code to create a FAISS index
+29def create_index(label):
+30    faiss_indices = (
+31        data # this needs to be an argument if you want to create a generic function
+32        .filter(pl.col("category_label") == label)
+33        .get_column("row_idx")
+34        .to_list()
+35    )
+36    
+37    faiss_data = title_embeddings[faiss_indices]
+38    d = faiss_data.shape[1]         # Number of dimensions
+39    faiss_DB = faiss.IndexFlatIP(d) # Index using Inner Product
+40    faiss.normalize_L2(faiss_data)  # Normalized L2 with Inner Product search = cosine similarity
+41    faiss_DB.add(faiss_data)        # Build the index
+42    
+43    return faiss_DB, faiss_data, faiss_indices
+44
+45# Code to create an edge-list
+46def get_edge_list(label, k=5):
+47    faiss_DB, faiss_data, faiss_indices = create_index(label)
+48    # To map the data back to the original `train[b'data']` array
+49    faiss_indices_map = {i: x for i,x in enumerate(faiss_indices)}
+50    # To map the indices back to the original strings
+51    title_name_map = {i: x for i,x in data.select("row_idx", "product_title").rows()}
+52    distances, neighbors = faiss_DB.search(faiss_data, k)
+53    
+54    return (
+55        pl.DataFrame({
+56            "from": faiss_indices})
+57        .with_columns(
+58            pl.Series("to", neighbors),
+59            pl.Series("distance", distances))
+60        .explode("to", "distance")
+61        .with_columns(
+62            pl.col("from")
+63            .map_dict(title_name_map),
+64            pl.col("to")
+65            .map_dict(faiss_indices_map)
+66            .map_dict(title_name_map))
+67        .filter(pl.col("from") != pl.col("to"))
+68    )
+69
+70# Code to extract components from a Network Graph
+71import networkx as nx
+72def get_cluster_map(label, k=5, min_cosine_distance=0.95):
+73    edge_list = (
+74        get_edge_list(label, k=k)
+75        .filter(pl.col("distance") >= min_cosine_distance)
+76    )
+77    graph = nx.from_pandas_edgelist(edge_list.to_pandas(), source="from", target="to")
+78    return {i: list(x) for i,x in enumerate(nx.connected_components(graph))}
+79
+80# Example call to a single category to obtain its clusters
+81clusters = get_cluster_map("Cell Phones Accessories", 5, 0.95)
+82# Example call to **all** categories to obtain all clusters
+83clusters = [get_cluster_map(x, 5, 0.95) for x in data.get_column("category_label").unique()]

How the code works

+

If you want to write down an algorithmic way of looking at this approach,

+
    +
  1. Obtain a 2D representation of the labelled/categorized data. This can be embeddings for strings, the final hidden state output from a generic CNN model for images, or a good ol’ tabular dataset where all numbers are normalized and can be expressed as such.
  2. +
  3. Create an ANN database (based on a package such as faiss) that allows you fast nearest neighbor searches. Use cosine similarity for an easy threshold determination step.
  4. +
  5. Obtain an edge-list of k (from 5 to 100) nearest neighbors for all (or a sample of data points in case your dataset is incredibly HUGE) data points in the ANN database.
  6. +
  7. Apply a minimum threshold on similarity (completely based on heuristics), and obtain the connected components of the network graph from the filtered edge-list you just created.
  8. +
  9. Map all indices back to their source data-points that make sense, and pick any number of items from each cluster (usually, I end up picking one element from each cluster), and you now have your representative sample!
  10. +
+]]>
\ No newline at end of file diff --git a/public/tags/polars/index.html b/public/tags/polars/index.html new file mode 100644 index 0000000..a1f4c24 --- /dev/null +++ b/public/tags/polars/index.html @@ -0,0 +1,6 @@ +Polars | Avinash's Blog
+

Avinash's Blog

Filtering for "Polars"

© Avinash Mallya | Design via Bear Cub.
\ No newline at end of file diff --git a/public/tags/polars/index.xml b/public/tags/polars/index.xml new file mode 100644 index 0000000..56f37a9 --- /dev/null +++ b/public/tags/polars/index.xml @@ -0,0 +1,383 @@ +Polars on Avinash's Bloghttps://avimallu.dev/tags/polars/Recent content in Polars on Avinash's BlogHugo -- gohugo.ioen-US© Avinash MallyaThu, 19 Oct 2023 00:00:00 +0000Finding representative samples efficiently for large datasetshttps://avimallu.dev/blog/002_representative_samples/Thu, 19 Oct 2023 00:00:00 +0000https://avimallu.dev/blog/002_representative_samples/<h1 id="premise">Premise</h1> +<p>In this day and age, we&rsquo;re not short on data. <em>Good</em> data, on the other hand, is very valuable. When you&rsquo;ve got a large amount of improperly labelled data, it may become hard to find to find a representative dataset to train a model on such that it generalizes well.</p> +<p>Let&rsquo;s formalize the problem a little so that a proper approach can be developed. Here&rsquo;s the problem statement:</p> +<ol> +<li>You have a large-ish set of (imperfectly) labelled data points. These data points can be represented as a 2D matrix.</li> +<li>You need to train a model to classify these data points on either these labels, or on labels dervied from imperfect labels.</li> +<li>You need a good (but not perfect) representative sample for the model to be generalizable, but there are too many data points for each label to manually pick representative examples.</li> +</ol> +<h2 id="in-a-hurry">In a hurry?</h2> +<p>Here&rsquo;s what you need to do:</p>Premise +

In this day and age, we’re not short on data. Good data, on the other hand, is very valuable. When you’ve got a large amount of improperly labelled data, it may become hard to find to find a representative dataset to train a model on such that it generalizes well.

+

Let’s formalize the problem a little so that a proper approach can be developed. Here’s the problem statement:

+
    +
  1. You have a large-ish set of (imperfectly) labelled data points. These data points can be represented as a 2D matrix.
  2. +
  3. You need to train a model to classify these data points on either these labels, or on labels dervied from imperfect labels.
  4. +
  5. You need a good (but not perfect) representative sample for the model to be generalizable, but there are too many data points for each label to manually pick representative examples.
  6. +
+

In a hurry?

+

Here’s what you need to do:

+
    +
  1. Read the premise and see if it fits your problem.
  2. +
  3. Go to the For the folks in a hurry! section at the end to find the generic solution and how it works.
  4. +
+

Why do we need representative samples?

+

Generally, three things come to mind:

+
    +
  1. Allows the model to be generalizable for all kinds of data points within a category.
  2. +
  3. Allows for faster training of the model - you need fewer data points to get the same accuracy!
  4. +
  5. Allows maintaining the training set - if your training set needs validation by experts or annotations, this keeps your costs low!
  6. +
+

Define the data

+

This data can be practically anything that can be represented as a 2D matrix.

+

There are exceptions. Raw image data (as numbers) might get difficult because even if you flatten them, they’ll be significant correlation between features. For example, a face can appear practically anywhere in the image, and all pixels centered around the face will be highly correlated, even if they are on different lines. A workaround in this case would be to pipe the image through a CNN model that has been trained on some generic task and produces a 1D representation of a single image in the final hidden layer before the output. Other data will need further processing along similar lines.

+

Get a specific dataset

+

For this specific article, I will use the ShopMania dataset on Kaggle. I apologize in advance for not using a more easily accessible dataset (you need to sign into Kaggle to download it) - and I’m not 100% sure if the GPL allows me to create a copy of the data and place it in my own repository. Nevertheless, the data (if you download it and choose to use it instead of some other dataset) will look like this:

+
+

NOTE: whenever I want to show an output along with the code I used for it, you’ll see the characters >> indicating the command used, and the output to be without those prefixes.

+
+ + + + + +
 1>> import polars as pl
+ 2>> data = pl.read_csv("archive/shopmania.csv")
+ 3>> data
+ 4shape: (313_705, 4)
+ 5┌────────────┬──────────────────────────────────────────────────────┬─────────────┬────────────────┐
+ 6 product_ID  product_title                                         category_ID  category_label 
+ 7 ---         ---                                                   ---          ---            
+ 8 i64         str                                                   i64          str            
+ 9╞════════════╪══════════════════════════════════════════════════════╪═════════════╪════════════════╡
+10 2           twilight central park print                           2            Collectibles   
+11 3           fox print                                             2            Collectibles   
+12 4           circulo de papel wall art                             2            Collectibles   
+13 5           hidden path print                                     2            Collectibles   
+14                                                                                           
+15 313703      deago anti fog swimming diving full face mask         229          Water Sports   
+16             surface snorkel scuba fr gopro black s/m                                          
+17 313704      etc buys full face gopro compatible snorkel scuba     229          Water Sports   
+18             diving mask blue large/xtralarge blue                                             
+19 313705      men 039 s full face breathe free diving snorkel mask  229          Water Sports   
+20             scuba optional hd camera blue mask only adult men                                 
+21 313706      women 039 s full face breathe free diving snorkel     229          Water Sports   
+22             mask scuba optional hd camera black mask only                                     
+23             children and women                                                                
+24└────────────┴──────────────────────────────────────────────────────┴─────────────┴────────────────┘

The data documentation on Kaggle states:

+
+

The first dataset originates from ShopMania, a popular online product comparison platform. It enlists tens of millions of products organized in a three-level hierarchy that includes 230 categories. The two higher levels of the hierarchy include 39 categories, whereas the third lower level accommodates the rest 191 leaf categories. Each product is categorized into this tree structure by being mapped to only one leaf category. Some of these 191 leaf categories contain millions of products. However, shopmania.com allows only the first 10,000 products to be retrieved from each category. Under this restriction, our crawler managed to collect 313,706 products.

+
+

For demonstration, I’ll just limit the categories to those that have exactly 10,000 occurences.

+ + + + + +
1data = (
+2    data
+3    .filter(pl.count().over("category_ID") == 10000)
+4)

You’ll notice that there are only 17 categories in this dataset. Run this to verify that fact.

+ + + + + +
 1>>> data.get_column("category_label").unique()
+ 2shape: (17,)
+ 3Series: 'category_label' [str]
+ 4[
+ 5    "Kitchen & Dining"
+ 6    "Scarves and wraps"
+ 7    "Handbags & Wallets"
+ 8    "Rugs  Tapestry & Linens"
+ 9    "Cell Phones Accessories"
+10    "Men's Clothing"
+11    "Jewelry"
+12    "Belts"
+13    "Men Lingerie"
+14    "Crafts"
+15    "Football"
+16    "Medical Supplies"
+17    "Adult"
+18    "Hunting"
+19    "Women's Clothing"
+20    "Pet Supply"
+21    "Office Supplies"
+22]

Note that this is very easy in Polars, which is the package I typically use for data manipulation. I recommend using it over Pandas.

+

Specify the task

+

Okay - so now we have exactly 10,000 products per category. We only have the title of the product that can be leveraged for categorization. So let me define the task this way:

+
+

Craft a small representative sample for each category.

+
+

Why small? It helps that it’ll make the model faster to train - and keep the training data manageable in size.

+

Finding representative samples

+

I mentioned earlier that we need to represent data as a 2D matrix for the technique I have in mind to work. How can I translate a list of text to a matrix? The answer’s rather simple: use SentenceTransformers to get a string’s embedding. You could also use more classic techniques like computing TF-IDF values, or use more advanced transformers, but I’ve noticed that SentenceTransformers are able to capture semantic meaning of sentences rather well (assuming you use a good model suited for the language the data is in) - they are trained on sentence similarity after all.

+

Getting SentenceTransformer embeddings

+

This part is rather simple. If you’re unable to install SentenceTransformers, please check their website.

+ + + + + +
1import sentence_transformers
+2# See list of models at www.sbert.net/docs/pretrained_models.html
+3ST = sentence_transformers.SentenceTransformer("all-mpnet-base-v2")
+4title_embeddings = (
+5    ST.encode(
+6        data.get_column("product_title").to_list(),
+7        show_progress_bar=True, convert_to_tensor=True)
+8    .numpy())

This process will be slow (~30 minutes) if you don’t have a GPU. There are faster approaches, but they are slightly more involved than would be beneficial for a blog post. The wait will be worth it, I promise! In addition, the call to .numpy() at the end is to directly get a single numpy array - otherwise you get a list of numpy arrays, which is rather inefficient. Further, SentenceTransformers will try to run on the GPU if available, and if so, you will need to write .cpu().numpy() so that the tensor is copied from the GPU to the CPU.

+
+

NOTE: for a proof-of-concept implementation, or if you’re on the CPU, try the all-MiniLM-L6-v2 model. It’s a much smaller and much faster model, although you sacrifice a little in terms of accuracy.

+
+

The concept of approximate nearest neighbors

+

Performing any kind of nearest neighbor algorithm on medium scale datasets (even bordering 10,000 rows and tens of columns) tends to be slow. A primary driver of this was the need to calculate all, or nearly all distances between all data points. Approximate nearest neighbor (ANN) algorithms work around this through various approaches, which warrant their own blog post. For now, it would suffice to understand that there are shortcuts that ANN algorithms take to give you if not the exact nearest neighbor, at least one of the nearest neighbors (hence the term approximate).

+

There are several algorithms that you can use - I shall proceed with faiss, because it has a nice Python interface and is rather easy to work with. You can use any algorithm - a full list of the major ones are available here.

+

I’ll explain why we’re in the nearest neighbor territory in due course.

+

Building the database

+

To build the database, all we need is the title_embeddings matrix.

+ + + + + +
1import faiss
+2def create_index(title_embeddings):
+3    d = title_embeddings.shape[1]    # Number of dimensions
+4    ann_index = faiss.IndexFlatL2(d) # Index using Eucledian Matrix
+5    ann_index.add(title_embeddings)  # Build the index
+6    
+7    return ann_index # Faiss considers databases an "index"

This does create a database. But remember, we’re trying to find representative samples - which means we need to do this by the category (or label). So let’s design a function that sends only the necessary data as that for a particular category, and then create the database. We’ll need three pieces of information from this function:

+
    +
  1. The actual faiss database.
  2. +
  3. The actual subset of data that was used to build this index.
  4. +
  5. The label indices with respect to the original data that went into the faiss database.
  6. +
+

(2) and (3) will help us later in rebuilding a “network graph” that will allow us to reference the original data points.

+ + + + + +
 1import faiss
+ 2import numpy as np
+ 3import polars as pl
+ 4
+ 5def create_index(label):
+ 6    faiss_indices = (
+ 7        data # this needs to be an argument if you want to create a generic function
+ 8        .with_row_count("row_idx")
+ 9        .filter(pl.col("category_label") == label)
+10        .get_column("row_idx")
+11        .to_list()
+12    )
+13    
+14    faiss_data = title_embeddings[faiss_indices]
+15    d = data.shape[1]               # Number of dimensions
+16    faiss_DB = faiss.IndexFlatIP(d) # Index using Inner Product
+17    faiss.normalize_L2(data)        # Normalized L2 with Inner Product search = cosine similarity
+18    # Why cosine similarity? It's easier to specify thresholds - they'll always be between 0 and 1.4.
+19    # If using Eucledian or other distance, we'll have to spend some time finding a good range
+20    # where distances are reasonable. See https://stats.stackexchange.com/a/146279 for details.
+21    faiss_DB.add(data)              # Build the index
+22    
+23    return faiss_DB, faiss_data, faiss_indices

Identifying the nearest neighbors

+

To proceed with getting a representative sample, the next step is to find the nearest neighbors for all data points in the database. This isn’t too hard - faiss index objects have a built-in search method to find the k nearest neighbors for a given index, along with the (approximate) distance to it. Let’s then write a function to get the following information: the label index for whom nearest neighbors are being searched, the indices of said nearest neighbors and the distance between them. In network graph parlance, this kind of data is called an edge list i.e. a list of pair of nodes that are connected, along with any additional information that specifies a property (in this case distance) of the edge that connects these nodes.

+ + + + + +
 1def get_edge_list(label, k=5):
+ 2    faiss_DB, faiss_data, faiss_indices = create_index(label)
+ 3    # To map the data back to the original `train[b'data']` array
+ 4    faiss_indices_map = {i: x for i,x in enumerate(faiss_indices)}
+ 5    # To map the indices back to the original strings
+ 6    title_name_map = {i: x for i,x in data.select("row_idx", "product_title").rows()}
+ 7    distances, neighbors = faiss_DB.search(faiss_data, k)
+ 8    
+ 9    return (
+10        pl.DataFrame({
+11            "from": faiss_indices})
+12        .with_columns(
+13            pl.Series("to", neighbors),
+14            pl.Series("distance", distances))
+15        .explode("to", "distance")
+16        .with_columns(
+17            pl.col("from")
+18            .map_dict(title_name_map),
+19            pl.col("to")
+20            .map_dict(faiss_indices_map)
+21            .map_dict(title_name_map))
+22        .filter(pl.col("from") != pl.col("to"))
+23    )                   

NetworkX and Connected Components

+

The next step in the process is to create a network graph using the edge-list. But why?

+

Remember that we have identified the (k=5) nearest neighbors of each data point. Let’s say that we have a point A that has a nearest neighbor B. C is not a nearest neighbor of A, but it is a nearest neighbor of B. In a network graph, if A and C are sufficiently similar enough to B within a particular minimum thershold, then A will be connected to C through B! Hopefully a small visual below would help.

+

How a network component is formed.

+

What happens when such a concept is extended for many data points? Not all of them would be connected - because we’re applying a minimum threshold that they have to meet. This is the only hueristic part of the rather fast process. Here’s one more helpful visual:

+

How a network cluster is formed.

+

Very starry night-eque vibes here. Let’s get to the code.

+ + + + + +
1import networkx as nx
+2def get_cluster_map(label, k=5, min_cosine_distance=0.95):
+3    edge_list = (
+4        get_edge_list(label, k=k)
+5        .filter(pl.col("distance") >= min_cosine_distance)
+6    )
+7    graph = nx.from_pandas_edgelist(edge_list.to_pandas(), source="from", target="to")
+8    return {i: list(x) for i,x in enumerate(nx.connected_components(graph))}

Getting clusters

+

Now that all the parts of the puzzle are together, let’s run it to see what kind of clusters you get for Cell Phone Accessories.

+ + + + + +
1clusters = get_cluster_map("Cell Phones Accessories", 5, 0.95)

Make sure to configure the following if your results aren’t good enough:

+
    +
  1. Relax the min_cosine_distance value if you want bigger clusters.
  2. +
  3. Increase the number of nearest neighbors if you want more matches.
  4. +
+

Viewing the components

+

There will likely be many clusters (you can see how many exactly with len(clusters)). Let’s look at a random cluster:

+ + + + + +
1>> clusters[3]
+2['smartphone lanyard with card slot for any phone up to 6 yellow 72570099',
+3 'smartphone lanyard with card slot for any phone up to 6 black 72570093',
+4 'smartphone lanyard with card slot for any phone up to 6 lightblue 72570097',
+5 'smartphone lanyard with card slot for any phone up to 6 blue 72570095',
+6 'smartphone lanyard with card slot for any phone up to 6 green 72570101',
+7 'smartphone lanyard with card slot for any phone up to 6 pink 72570091']

Let’s see another cluster that had 172(!) members in my run (the clusters themselves will be stable, but their indices may change in each run owing to some inherent randomness in the process).

+ + + + + +
 1>>> clusters[6]
+ 2['otm essentials iphone 8/7 modern clear printed phone case snowflakes iphone 8/7 op qq z051a',
+ 3 'otm essentials iphone 8/7 modern clear printed phone case iphone 8/7 arrows blue op qq a02 58',
+ 4 'otm essentials iphone 8/7/6s clear printed phone case single iphone 8/7/6s golden pineapple op qq z089a',
+ 5 'otm essentials iphone 8/7/6s clear printed phone case single iphone 8/7/6s butteryfly delight yellow op qq z029d',
+ 6 'otm essentials iphone 8/7 modern clear printed phone case iphone 8/7 luck of the irish op qq a01 45',
+ 7 'otm essentials iphone 8/7 modern clear printed phone case iphone 8/7 brides maid white op qq a02 16',
+ 8 ...
+ 9 'otm essentials iphone 8/7 modern clear printed phone case iphone 8/7 flying arrows white op qq hip 20',
+10 'otm essentials iphone 8/7 modern clear printed phone case iphone 8/7 brides maid pink white op qq a02 17',
+11 'otm essentials iphone 8/7 modern clear printed phone case iphone 8/7 anemone flowers white op qq z036a',
+12 'otm essentials iphone 8/7 modern clear printed phone case mustache iphone 8/7 op qq hip 08',
+13 'otm essentials iphone 8/7 modern clear printed phone case oh snap iphone 8/7 op qq z053a',
+14 'otm essentials iphone 8/7/6s clear printed phone case single iphone 8/7/6s desert cacti orange pink op qq a02 22']

Running for all categories

+

This isn’t that hard (although it may take more than a moment). Just iterate it for each category!

+ + + + + +
1clusters = [get_cluster_map(x, 5, 0.95) for x in data.get_column("category_label").unique()]

For the folks in a hurry!

+

I get it - you often want a solution that “just works”. I can come close to it. See below for code and a succinct explanation. For those of my readers who aren’t in a hurry, this also serves as a nice summary (and copy-pastable code)!

+

The code

+ + + + + +
 1import sentence_transformers
+ 2import faiss
+ 3import polars as pl
+ 4import numpy as np
+ 5
+ 6# Data is read here. You download the files from Kaggle here: 
+ 7# https://www.kaggle.com/datasets/lakritidis/product-classification-and-categorization
+ 8data = pl.read_csv("archive/shopmania.csv", new_columns=[
+ 9    "product_ID", "product_title", "category_ID", "category_label"])
+10data = (
+11    data
+12    .filter(pl.count().over("category_ID") == 10000)
+13    .with_row_count("row_idx")
+14)
+15
+16
+17# See list of models at www.sbert.net/docs/pretrained_models.html
+18ST = sentence_transformers.SentenceTransformer("all-mpnet-base-v2")
+19title_embeddings = (
+20    ST.encode(
+21        data.get_column("product_title").to_list(),
+22        # I'm on a MacBook, you should use `cuda` or `cpu`
+23        # if you've got different hardware.
+24        device="mps",
+25        show_progress_bar=True, convert_to_tensor=True)
+26    .cpu().numpy())
+27
+28# Code to create a FAISS index
+29def create_index(label):
+30    faiss_indices = (
+31        data # this needs to be an argument if you want to create a generic function
+32        .filter(pl.col("category_label") == label)
+33        .get_column("row_idx")
+34        .to_list()
+35    )
+36    
+37    faiss_data = title_embeddings[faiss_indices]
+38    d = faiss_data.shape[1]         # Number of dimensions
+39    faiss_DB = faiss.IndexFlatIP(d) # Index using Inner Product
+40    faiss.normalize_L2(faiss_data)  # Normalized L2 with Inner Product search = cosine similarity
+41    faiss_DB.add(faiss_data)        # Build the index
+42    
+43    return faiss_DB, faiss_data, faiss_indices
+44
+45# Code to create an edge-list
+46def get_edge_list(label, k=5):
+47    faiss_DB, faiss_data, faiss_indices = create_index(label)
+48    # To map the data back to the original `train[b'data']` array
+49    faiss_indices_map = {i: x for i,x in enumerate(faiss_indices)}
+50    # To map the indices back to the original strings
+51    title_name_map = {i: x for i,x in data.select("row_idx", "product_title").rows()}
+52    distances, neighbors = faiss_DB.search(faiss_data, k)
+53    
+54    return (
+55        pl.DataFrame({
+56            "from": faiss_indices})
+57        .with_columns(
+58            pl.Series("to", neighbors),
+59            pl.Series("distance", distances))
+60        .explode("to", "distance")
+61        .with_columns(
+62            pl.col("from")
+63            .map_dict(title_name_map),
+64            pl.col("to")
+65            .map_dict(faiss_indices_map)
+66            .map_dict(title_name_map))
+67        .filter(pl.col("from") != pl.col("to"))
+68    )
+69
+70# Code to extract components from a Network Graph
+71import networkx as nx
+72def get_cluster_map(label, k=5, min_cosine_distance=0.95):
+73    edge_list = (
+74        get_edge_list(label, k=k)
+75        .filter(pl.col("distance") >= min_cosine_distance)
+76    )
+77    graph = nx.from_pandas_edgelist(edge_list.to_pandas(), source="from", target="to")
+78    return {i: list(x) for i,x in enumerate(nx.connected_components(graph))}
+79
+80# Example call to a single category to obtain its clusters
+81clusters = get_cluster_map("Cell Phones Accessories", 5, 0.95)
+82# Example call to **all** categories to obtain all clusters
+83clusters = [get_cluster_map(x, 5, 0.95) for x in data.get_column("category_label").unique()]

How the code works

+

If you want to write down an algorithmic way of looking at this approach,

+
    +
  1. Obtain a 2D representation of the labelled/categorized data. This can be embeddings for strings, the final hidden state output from a generic CNN model for images, or a good ol’ tabular dataset where all numbers are normalized and can be expressed as such.
  2. +
  3. Create an ANN database (based on a package such as faiss) that allows you fast nearest neighbor searches. Use cosine similarity for an easy threshold determination step.
  4. +
  5. Obtain an edge-list of k (from 5 to 100) nearest neighbors for all (or a sample of data points in case your dataset is incredibly HUGE) data points in the ANN database.
  6. +
  7. Apply a minimum threshold on similarity (completely based on heuristics), and obtain the connected components of the network graph from the filtered edge-list you just created.
  8. +
  9. Map all indices back to their source data-points that make sense, and pick any number of items from each cluster (usually, I end up picking one element from each cluster), and you now have your representative sample!
  10. +
+]]>
\ No newline at end of file diff --git a/public/tags/powerpoint/index.html b/public/tags/powerpoint/index.html new file mode 100644 index 0000000..4a5fa8a --- /dev/null +++ b/public/tags/powerpoint/index.html @@ -0,0 +1,6 @@ +Powerpoint | Avinash's Blog
+

Avinash's Blog

Filtering for "Powerpoint"

© Avinash Mallya | Design via Bear Cub.
\ No newline at end of file diff --git a/public/tags/powerpoint/index.xml b/public/tags/powerpoint/index.xml new file mode 100644 index 0000000..c60b4bb --- /dev/null +++ b/public/tags/powerpoint/index.xml @@ -0,0 +1,101 @@ +Powerpoint on Avinash's Bloghttps://avimallu.dev/tags/powerpoint/Recent content in Powerpoint on Avinash's BlogHugo -- gohugo.ioen-US© Avinash MallyaFri, 20 Oct 2023 00:00:00 +0000Quick hacks to make client-ready presentationshttps://avimallu.dev/blog/003_powerpointsnap/Fri, 20 Oct 2023 00:00:00 +0000https://avimallu.dev/blog/003_powerpointsnap/<h1 id="premise">Premise</h1> +<p>When I worked in healthcare consulting, I often spent a LOT of my time creating PowerPoint presentations (<em>decks</em> in consulting lingo - not even <em>slide decks</em>). However, it was rather repetitive. Thus, was born PowerPointSnap.</p> +<h1 id="what-is-it">What is it?</h1> +<p>I&rsquo;ll write this down as pointers.</p> +<ol> +<li>It&rsquo;s a VBA based PowerPoint add-on. Just a set of commands that work well with each other.</li> +<li>It&rsquo;s Windows only - it&rsquo;s unlikely to work on MacOS.</li> +<li>It&rsquo;s installation-free and is not an executable, which makes it perfect for locked-down corporate environments, as long as you have the permission to download files.</li> +</ol> +<h1 id="how-do-i-get-it">How do I get it?</h1> +<p>The project is available on this <a href="https://github.com/avimallu/PowerPointSnap">Github repo</a>. The instructions to install it are available there, but here&rsquo;s the down-low:</p>Premise +

When I worked in healthcare consulting, I often spent a LOT of my time creating PowerPoint presentations (decks in consulting lingo - not even slide decks). However, it was rather repetitive. Thus, was born PowerPointSnap.

+

What is it?

+

I’ll write this down as pointers.

+
    +
  1. It’s a VBA based PowerPoint add-on. Just a set of commands that work well with each other.
  2. +
  3. It’s Windows only - it’s unlikely to work on MacOS.
  4. +
  5. It’s installation-free and is not an executable, which makes it perfect for locked-down corporate environments, as long as you have the permission to download files.
  6. +
+

How do I get it?

+

The project is available on this Github repo. The instructions to install it are available there, but here’s the down-low:

+
    +
  1. Download the Snap.ppam file to your system.
  2. +
  3. Enable the developer options.
  4. +
  5. Go to the Developer tab, and click on PowerPoint Add-ins.
  6. +
  7. Click on Add New. Choose the location of the file you just dowloaded. Click Close.
  8. +
  9. To uninstall, repeat the process, and simply click on Remove this time.
  10. +
+

What can I do with it?

+

Frankly, a LOT. The base concept of this tool is:

+
    +
  1. “Set” a shape as the one you want to copy a property from.
  2. +
  3. Select any property from the list to automatically apply it.
  4. +
+

Here’s a non-exhaustive list of all the options available.

+

Apply properties of shapes directly

+

This is the part of the interface that can be used for shapes (which include charts and tables).

+

The UI for copying shape properties

+

To use, first select a shape object, click on “Set”. Then, choose the object you want to Snap its properties to (see how I got the inspiration for the name?). You should be able to copy all compatible properties - if something is not copy-able, the tool will show an error, and then let you exit.

+

Note that it’s probably not to apply a property of a shape to a table - if you want to make the entire table orange, there are probably better built-in ways to do it than to use Snap.

+

Beautify charts with Snappable properties

+

Charts are also supported, with dedicated features for it.

+

The UI for copying chart properties

+

What do these features do? You should be able to hover over the option and get a tooltip that shows what it’s capable of, but here’s another summary just in case:

+
    +
  1. Sync Value/Date Axis: this will try to align the range, the ticks, the numeric values etc. of the “set” chart to the one you’ve selected. I couldn’t put in just $x$ and $y$ here because Microsoft internally doesn’t label them that way. Try either of these two options (you can undo!) and see what works best for your chart. This doesn’t work well yet for 3D charts.
  2. +
  3. Sync Plot/Title/Legend: often, you want to centre a title, or make sure that multiple charts that show nearly identical things for different variables all look exactly the same from a client perspective. But that’s usually difficult if you’ve already configured the charts a little - which can be remedied with this option!
  4. +
  5. Format Painter: this is simply a helper for the normal format painter to align the formats of the text that you’ve selected with the way it originally is in the “set” chart. The reason for this feature is simply to avoid going back to Home to click on the Format Painter option again.
  6. +
  7. Reset Axes Scales: in case you messed up somewhere, you can use this to rever to PowerPoint defaults.
  8. +
+

The next two options deserve their own section.

+

Customize the labels programmatically

+

Your immediate senior in a consulting environment would frown at your chart, and then exclaim, “I think that’s too many labels for the data points. Can you show them every two/three/four labels? I know this is manual work, but it’s a one time thing!”

+

It’s never a one time affair. But don’t worry, we have this nice feature to help us. If you click on the Customize Label option, you will get this (without the “Set” option):

+

The UI for customizing labels.

+

Never mind the rather unfriendly legend entries. They’re just here to demonstrate that you can do the following kinds of whacky abilities with your own chart!

+

Screenshots of the chart snapability

+

Of course, visuals will do it more justice. For example, look at this image:

+

There’s a lot wrong with this image. But primarily, the charts are of different sizes, the axes are different, the labels are too clustered, and the titles aren’t centered.

+

Here’s what you can do:

+
    +
  1. Click on the left chart. Press “Set” in the toolbar for Snap.
  2. +
  3. Click on the right chart, and then go through the following: +
      +
    1. In Shapes, click on Dim. This will align the shapes of the chart.
    2. +
    3. Use the guides that you get while moving the chart to align the positions of the two charts now that their shapes are equal.
    4. +
    5. You’ll notice that the chart area doesn’t still match, nor does the title.
    6. +
    7. In Charts, click on Sync Plot Area and Sync Title Area, and watch the magic unfold.
    8. +
    9. Now, click on the second chart, and click on “Set”. Let’s align the axes of the first chart to the second one.
    10. +
    11. Click on the first chart, and then in Charts, click Sync Value Axis.
    12. +
    +
  4. +
  5. Let’s bring that senior’s exclamation back into play - (s)he wants you to highlight only Profit labels, and that too every 2 iterations. To do this: +
      +
    1. Click on Customize Labels after clicking on either chart.
    2. +
    3. You’ll get the screen shown in the previous section. Make sure to adjust the values such that it’s exactly like the screenshot there.
    4. +
    5. Click on “Save and Run”. This will save the configuration you’ve selected, and run it on the chart you’ve selected.
    6. +
    7. Click the other chart. Then, in Charts, click on Rerun Customization.
    8. +
    +
  6. +
+

This is what your results should look like:

+

Everything almost consistent. Your senior rests their eyes, and secretly wonder how you managed to do it quickly… maybe they should change some requirements…

+

Of course, getting those calculations right is a whole different thing that will need some work.

+

Align table dimensions

+

Oftentimes, you have two tables that show similar values… you know the drill. Here’s what you can do in a scenario such as this:

+

Similar data, but vastly different tables.

+

This is what the Tables section of the tool looks like:

+

The UI for Tables

+

To align these tables together,

+
    +
  1. Click on the left table. Press “Set” in the toolbar for Snap.
  2. +
  3. Click on the right table.
  4. +
  5. Click on Shapes, inside it, Dim. Now the shapes of the table are the same.
  6. +
  7. In Tables, click on Sync Column Widths. Now the columns are also the same.
  8. +
  9. If you try to align by rows, it fails because the number of rows are not the same in the two tables.
  10. +
+

Here’s what you’ll end up with:

+

Similar data, and similar enough tables.

+

Pretty neat, eh?

+]]>
\ No newline at end of file diff --git a/public/tags/ppt/index.html b/public/tags/ppt/index.html new file mode 100644 index 0000000..0d21300 --- /dev/null +++ b/public/tags/ppt/index.html @@ -0,0 +1,6 @@ +Ppt | Avinash's Blog
+

Avinash's Blog

Filtering for "Ppt"

© Avinash Mallya | Design via Bear Cub.
\ No newline at end of file diff --git a/public/tags/ppt/index.xml b/public/tags/ppt/index.xml new file mode 100644 index 0000000..91fbf20 --- /dev/null +++ b/public/tags/ppt/index.xml @@ -0,0 +1,101 @@ +Ppt on Avinash's Bloghttps://avimallu.dev/tags/ppt/Recent content in Ppt on Avinash's BlogHugo -- gohugo.ioen-US© Avinash MallyaFri, 20 Oct 2023 00:00:00 +0000Quick hacks to make client-ready presentationshttps://avimallu.dev/blog/003_powerpointsnap/Fri, 20 Oct 2023 00:00:00 +0000https://avimallu.dev/blog/003_powerpointsnap/<h1 id="premise">Premise</h1> +<p>When I worked in healthcare consulting, I often spent a LOT of my time creating PowerPoint presentations (<em>decks</em> in consulting lingo - not even <em>slide decks</em>). However, it was rather repetitive. Thus, was born PowerPointSnap.</p> +<h1 id="what-is-it">What is it?</h1> +<p>I&rsquo;ll write this down as pointers.</p> +<ol> +<li>It&rsquo;s a VBA based PowerPoint add-on. Just a set of commands that work well with each other.</li> +<li>It&rsquo;s Windows only - it&rsquo;s unlikely to work on MacOS.</li> +<li>It&rsquo;s installation-free and is not an executable, which makes it perfect for locked-down corporate environments, as long as you have the permission to download files.</li> +</ol> +<h1 id="how-do-i-get-it">How do I get it?</h1> +<p>The project is available on this <a href="https://github.com/avimallu/PowerPointSnap">Github repo</a>. The instructions to install it are available there, but here&rsquo;s the down-low:</p>Premise +

When I worked in healthcare consulting, I often spent a LOT of my time creating PowerPoint presentations (decks in consulting lingo - not even slide decks). However, it was rather repetitive. Thus, was born PowerPointSnap.

+

What is it?

+

I’ll write this down as pointers.

+
    +
  1. It’s a VBA based PowerPoint add-on. Just a set of commands that work well with each other.
  2. +
  3. It’s Windows only - it’s unlikely to work on MacOS.
  4. +
  5. It’s installation-free and is not an executable, which makes it perfect for locked-down corporate environments, as long as you have the permission to download files.
  6. +
+

How do I get it?

+

The project is available on this Github repo. The instructions to install it are available there, but here’s the down-low:

+
    +
  1. Download the Snap.ppam file to your system.
  2. +
  3. Enable the developer options.
  4. +
  5. Go to the Developer tab, and click on PowerPoint Add-ins.
  6. +
  7. Click on Add New. Choose the location of the file you just dowloaded. Click Close.
  8. +
  9. To uninstall, repeat the process, and simply click on Remove this time.
  10. +
+

What can I do with it?

+

Frankly, a LOT. The base concept of this tool is:

+
    +
  1. “Set” a shape as the one you want to copy a property from.
  2. +
  3. Select any property from the list to automatically apply it.
  4. +
+

Here’s a non-exhaustive list of all the options available.

+

Apply properties of shapes directly

+

This is the part of the interface that can be used for shapes (which include charts and tables).

+

The UI for copying shape properties

+

To use, first select a shape object, click on “Set”. Then, choose the object you want to Snap its properties to (see how I got the inspiration for the name?). You should be able to copy all compatible properties - if something is not copy-able, the tool will show an error, and then let you exit.

+

Note that it’s probably not to apply a property of a shape to a table - if you want to make the entire table orange, there are probably better built-in ways to do it than to use Snap.

+

Beautify charts with Snappable properties

+

Charts are also supported, with dedicated features for it.

+

The UI for copying chart properties

+

What do these features do? You should be able to hover over the option and get a tooltip that shows what it’s capable of, but here’s another summary just in case:

+
    +
  1. Sync Value/Date Axis: this will try to align the range, the ticks, the numeric values etc. of the “set” chart to the one you’ve selected. I couldn’t put in just $x$ and $y$ here because Microsoft internally doesn’t label them that way. Try either of these two options (you can undo!) and see what works best for your chart. This doesn’t work well yet for 3D charts.
  2. +
  3. Sync Plot/Title/Legend: often, you want to centre a title, or make sure that multiple charts that show nearly identical things for different variables all look exactly the same from a client perspective. But that’s usually difficult if you’ve already configured the charts a little - which can be remedied with this option!
  4. +
  5. Format Painter: this is simply a helper for the normal format painter to align the formats of the text that you’ve selected with the way it originally is in the “set” chart. The reason for this feature is simply to avoid going back to Home to click on the Format Painter option again.
  6. +
  7. Reset Axes Scales: in case you messed up somewhere, you can use this to rever to PowerPoint defaults.
  8. +
+

The next two options deserve their own section.

+

Customize the labels programmatically

+

Your immediate senior in a consulting environment would frown at your chart, and then exclaim, “I think that’s too many labels for the data points. Can you show them every two/three/four labels? I know this is manual work, but it’s a one time thing!”

+

It’s never a one time affair. But don’t worry, we have this nice feature to help us. If you click on the Customize Label option, you will get this (without the “Set” option):

+

The UI for customizing labels.

+

Never mind the rather unfriendly legend entries. They’re just here to demonstrate that you can do the following kinds of whacky abilities with your own chart!

+

Screenshots of the chart snapability

+

Of course, visuals will do it more justice. For example, look at this image:

+

There’s a lot wrong with this image. But primarily, the charts are of different sizes, the axes are different, the labels are too clustered, and the titles aren’t centered.

+

Here’s what you can do:

+
    +
  1. Click on the left chart. Press “Set” in the toolbar for Snap.
  2. +
  3. Click on the right chart, and then go through the following: +
      +
    1. In Shapes, click on Dim. This will align the shapes of the chart.
    2. +
    3. Use the guides that you get while moving the chart to align the positions of the two charts now that their shapes are equal.
    4. +
    5. You’ll notice that the chart area doesn’t still match, nor does the title.
    6. +
    7. In Charts, click on Sync Plot Area and Sync Title Area, and watch the magic unfold.
    8. +
    9. Now, click on the second chart, and click on “Set”. Let’s align the axes of the first chart to the second one.
    10. +
    11. Click on the first chart, and then in Charts, click Sync Value Axis.
    12. +
    +
  4. +
  5. Let’s bring that senior’s exclamation back into play - (s)he wants you to highlight only Profit labels, and that too every 2 iterations. To do this: +
      +
    1. Click on Customize Labels after clicking on either chart.
    2. +
    3. You’ll get the screen shown in the previous section. Make sure to adjust the values such that it’s exactly like the screenshot there.
    4. +
    5. Click on “Save and Run”. This will save the configuration you’ve selected, and run it on the chart you’ve selected.
    6. +
    7. Click the other chart. Then, in Charts, click on Rerun Customization.
    8. +
    +
  6. +
+

This is what your results should look like:

+

Everything almost consistent. Your senior rests their eyes, and secretly wonder how you managed to do it quickly… maybe they should change some requirements…

+

Of course, getting those calculations right is a whole different thing that will need some work.

+

Align table dimensions

+

Oftentimes, you have two tables that show similar values… you know the drill. Here’s what you can do in a scenario such as this:

+

Similar data, but vastly different tables.

+

This is what the Tables section of the tool looks like:

+

The UI for Tables

+

To align these tables together,

+
    +
  1. Click on the left table. Press “Set” in the toolbar for Snap.
  2. +
  3. Click on the right table.
  4. +
  5. Click on Shapes, inside it, Dim. Now the shapes of the table are the same.
  6. +
  7. In Tables, click on Sync Column Widths. Now the columns are also the same.
  8. +
  9. If you try to align by rows, it fails because the number of rows are not the same in the two tables.
  10. +
+

Here’s what you’ll end up with:

+

Similar data, and similar enough tables.

+

Pretty neat, eh?

+]]>
\ No newline at end of file diff --git a/public/tags/representative/index.html b/public/tags/representative/index.html new file mode 100644 index 0000000..964cfb7 --- /dev/null +++ b/public/tags/representative/index.html @@ -0,0 +1,6 @@ +Representative | Avinash's Blog
+

Avinash's Blog

Filtering for "Representative"

© Avinash Mallya | Design via Bear Cub.
\ No newline at end of file diff --git a/public/tags/representative/index.xml b/public/tags/representative/index.xml new file mode 100644 index 0000000..213d14c --- /dev/null +++ b/public/tags/representative/index.xml @@ -0,0 +1,383 @@ +Representative on Avinash's Bloghttps://avimallu.dev/tags/representative/Recent content in Representative on Avinash's BlogHugo -- gohugo.ioen-US© Avinash MallyaThu, 19 Oct 2023 00:00:00 +0000Finding representative samples efficiently for large datasetshttps://avimallu.dev/blog/002_representative_samples/Thu, 19 Oct 2023 00:00:00 +0000https://avimallu.dev/blog/002_representative_samples/<h1 id="premise">Premise</h1> +<p>In this day and age, we&rsquo;re not short on data. <em>Good</em> data, on the other hand, is very valuable. When you&rsquo;ve got a large amount of improperly labelled data, it may become hard to find to find a representative dataset to train a model on such that it generalizes well.</p> +<p>Let&rsquo;s formalize the problem a little so that a proper approach can be developed. Here&rsquo;s the problem statement:</p> +<ol> +<li>You have a large-ish set of (imperfectly) labelled data points. These data points can be represented as a 2D matrix.</li> +<li>You need to train a model to classify these data points on either these labels, or on labels dervied from imperfect labels.</li> +<li>You need a good (but not perfect) representative sample for the model to be generalizable, but there are too many data points for each label to manually pick representative examples.</li> +</ol> +<h2 id="in-a-hurry">In a hurry?</h2> +<p>Here&rsquo;s what you need to do:</p>Premise +

In this day and age, we’re not short on data. Good data, on the other hand, is very valuable. When you’ve got a large amount of improperly labelled data, it may become hard to find to find a representative dataset to train a model on such that it generalizes well.

+

Let’s formalize the problem a little so that a proper approach can be developed. Here’s the problem statement:

+
    +
  1. You have a large-ish set of (imperfectly) labelled data points. These data points can be represented as a 2D matrix.
  2. +
  3. You need to train a model to classify these data points on either these labels, or on labels dervied from imperfect labels.
  4. +
  5. You need a good (but not perfect) representative sample for the model to be generalizable, but there are too many data points for each label to manually pick representative examples.
  6. +
+

In a hurry?

+

Here’s what you need to do:

+
    +
  1. Read the premise and see if it fits your problem.
  2. +
  3. Go to the For the folks in a hurry! section at the end to find the generic solution and how it works.
  4. +
+

Why do we need representative samples?

+

Generally, three things come to mind:

+
    +
  1. Allows the model to be generalizable for all kinds of data points within a category.
  2. +
  3. Allows for faster training of the model - you need fewer data points to get the same accuracy!
  4. +
  5. Allows maintaining the training set - if your training set needs validation by experts or annotations, this keeps your costs low!
  6. +
+

Define the data

+

This data can be practically anything that can be represented as a 2D matrix.

+

There are exceptions. Raw image data (as numbers) might get difficult because even if you flatten them, they’ll be significant correlation between features. For example, a face can appear practically anywhere in the image, and all pixels centered around the face will be highly correlated, even if they are on different lines. A workaround in this case would be to pipe the image through a CNN model that has been trained on some generic task and produces a 1D representation of a single image in the final hidden layer before the output. Other data will need further processing along similar lines.

+

Get a specific dataset

+

For this specific article, I will use the ShopMania dataset on Kaggle. I apologize in advance for not using a more easily accessible dataset (you need to sign into Kaggle to download it) - and I’m not 100% sure if the GPL allows me to create a copy of the data and place it in my own repository. Nevertheless, the data (if you download it and choose to use it instead of some other dataset) will look like this:

+
+

NOTE: whenever I want to show an output along with the code I used for it, you’ll see the characters >> indicating the command used, and the output to be without those prefixes.

+
+ + + + + +
 1>> import polars as pl
+ 2>> data = pl.read_csv("archive/shopmania.csv")
+ 3>> data
+ 4shape: (313_705, 4)
+ 5┌────────────┬──────────────────────────────────────────────────────┬─────────────┬────────────────┐
+ 6 product_ID  product_title                                         category_ID  category_label 
+ 7 ---         ---                                                   ---          ---            
+ 8 i64         str                                                   i64          str            
+ 9╞════════════╪══════════════════════════════════════════════════════╪═════════════╪════════════════╡
+10 2           twilight central park print                           2            Collectibles   
+11 3           fox print                                             2            Collectibles   
+12 4           circulo de papel wall art                             2            Collectibles   
+13 5           hidden path print                                     2            Collectibles   
+14                                                                                           
+15 313703      deago anti fog swimming diving full face mask         229          Water Sports   
+16             surface snorkel scuba fr gopro black s/m                                          
+17 313704      etc buys full face gopro compatible snorkel scuba     229          Water Sports   
+18             diving mask blue large/xtralarge blue                                             
+19 313705      men 039 s full face breathe free diving snorkel mask  229          Water Sports   
+20             scuba optional hd camera blue mask only adult men                                 
+21 313706      women 039 s full face breathe free diving snorkel     229          Water Sports   
+22             mask scuba optional hd camera black mask only                                     
+23             children and women                                                                
+24└────────────┴──────────────────────────────────────────────────────┴─────────────┴────────────────┘

The data documentation on Kaggle states:

+
+

The first dataset originates from ShopMania, a popular online product comparison platform. It enlists tens of millions of products organized in a three-level hierarchy that includes 230 categories. The two higher levels of the hierarchy include 39 categories, whereas the third lower level accommodates the rest 191 leaf categories. Each product is categorized into this tree structure by being mapped to only one leaf category. Some of these 191 leaf categories contain millions of products. However, shopmania.com allows only the first 10,000 products to be retrieved from each category. Under this restriction, our crawler managed to collect 313,706 products.

+
+

For demonstration, I’ll just limit the categories to those that have exactly 10,000 occurences.

+ + + + + +
1data = (
+2    data
+3    .filter(pl.count().over("category_ID") == 10000)
+4)

You’ll notice that there are only 17 categories in this dataset. Run this to verify that fact.

+ + + + + +
 1>>> data.get_column("category_label").unique()
+ 2shape: (17,)
+ 3Series: 'category_label' [str]
+ 4[
+ 5    "Kitchen & Dining"
+ 6    "Scarves and wraps"
+ 7    "Handbags & Wallets"
+ 8    "Rugs  Tapestry & Linens"
+ 9    "Cell Phones Accessories"
+10    "Men's Clothing"
+11    "Jewelry"
+12    "Belts"
+13    "Men Lingerie"
+14    "Crafts"
+15    "Football"
+16    "Medical Supplies"
+17    "Adult"
+18    "Hunting"
+19    "Women's Clothing"
+20    "Pet Supply"
+21    "Office Supplies"
+22]

Note that this is very easy in Polars, which is the package I typically use for data manipulation. I recommend using it over Pandas.

+

Specify the task

+

Okay - so now we have exactly 10,000 products per category. We only have the title of the product that can be leveraged for categorization. So let me define the task this way:

+
+

Craft a small representative sample for each category.

+
+

Why small? It helps that it’ll make the model faster to train - and keep the training data manageable in size.

+

Finding representative samples

+

I mentioned earlier that we need to represent data as a 2D matrix for the technique I have in mind to work. How can I translate a list of text to a matrix? The answer’s rather simple: use SentenceTransformers to get a string’s embedding. You could also use more classic techniques like computing TF-IDF values, or use more advanced transformers, but I’ve noticed that SentenceTransformers are able to capture semantic meaning of sentences rather well (assuming you use a good model suited for the language the data is in) - they are trained on sentence similarity after all.

+

Getting SentenceTransformer embeddings

+

This part is rather simple. If you’re unable to install SentenceTransformers, please check their website.

+ + + + + +
1import sentence_transformers
+2# See list of models at www.sbert.net/docs/pretrained_models.html
+3ST = sentence_transformers.SentenceTransformer("all-mpnet-base-v2")
+4title_embeddings = (
+5    ST.encode(
+6        data.get_column("product_title").to_list(),
+7        show_progress_bar=True, convert_to_tensor=True)
+8    .numpy())

This process will be slow (~30 minutes) if you don’t have a GPU. There are faster approaches, but they are slightly more involved than would be beneficial for a blog post. The wait will be worth it, I promise! In addition, the call to .numpy() at the end is to directly get a single numpy array - otherwise you get a list of numpy arrays, which is rather inefficient. Further, SentenceTransformers will try to run on the GPU if available, and if so, you will need to write .cpu().numpy() so that the tensor is copied from the GPU to the CPU.

+
+

NOTE: for a proof-of-concept implementation, or if you’re on the CPU, try the all-MiniLM-L6-v2 model. It’s a much smaller and much faster model, although you sacrifice a little in terms of accuracy.

+
+

The concept of approximate nearest neighbors

+

Performing any kind of nearest neighbor algorithm on medium scale datasets (even bordering 10,000 rows and tens of columns) tends to be slow. A primary driver of this was the need to calculate all, or nearly all distances between all data points. Approximate nearest neighbor (ANN) algorithms work around this through various approaches, which warrant their own blog post. For now, it would suffice to understand that there are shortcuts that ANN algorithms take to give you if not the exact nearest neighbor, at least one of the nearest neighbors (hence the term approximate).

+

There are several algorithms that you can use - I shall proceed with faiss, because it has a nice Python interface and is rather easy to work with. You can use any algorithm - a full list of the major ones are available here.

+

I’ll explain why we’re in the nearest neighbor territory in due course.

+

Building the database

+

To build the database, all we need is the title_embeddings matrix.

+ + + + + +
1import faiss
+2def create_index(title_embeddings):
+3    d = title_embeddings.shape[1]    # Number of dimensions
+4    ann_index = faiss.IndexFlatL2(d) # Index using Eucledian Matrix
+5    ann_index.add(title_embeddings)  # Build the index
+6    
+7    return ann_index # Faiss considers databases an "index"

This does create a database. But remember, we’re trying to find representative samples - which means we need to do this by the category (or label). So let’s design a function that sends only the necessary data as that for a particular category, and then create the database. We’ll need three pieces of information from this function:

+
    +
  1. The actual faiss database.
  2. +
  3. The actual subset of data that was used to build this index.
  4. +
  5. The label indices with respect to the original data that went into the faiss database.
  6. +
+

(2) and (3) will help us later in rebuilding a “network graph” that will allow us to reference the original data points.

+ + + + + +
 1import faiss
+ 2import numpy as np
+ 3import polars as pl
+ 4
+ 5def create_index(label):
+ 6    faiss_indices = (
+ 7        data # this needs to be an argument if you want to create a generic function
+ 8        .with_row_count("row_idx")
+ 9        .filter(pl.col("category_label") == label)
+10        .get_column("row_idx")
+11        .to_list()
+12    )
+13    
+14    faiss_data = title_embeddings[faiss_indices]
+15    d = data.shape[1]               # Number of dimensions
+16    faiss_DB = faiss.IndexFlatIP(d) # Index using Inner Product
+17    faiss.normalize_L2(data)        # Normalized L2 with Inner Product search = cosine similarity
+18    # Why cosine similarity? It's easier to specify thresholds - they'll always be between 0 and 1.4.
+19    # If using Eucledian or other distance, we'll have to spend some time finding a good range
+20    # where distances are reasonable. See https://stats.stackexchange.com/a/146279 for details.
+21    faiss_DB.add(data)              # Build the index
+22    
+23    return faiss_DB, faiss_data, faiss_indices

Identifying the nearest neighbors

+

To proceed with getting a representative sample, the next step is to find the nearest neighbors for all data points in the database. This isn’t too hard - faiss index objects have a built-in search method to find the k nearest neighbors for a given index, along with the (approximate) distance to it. Let’s then write a function to get the following information: the label index for whom nearest neighbors are being searched, the indices of said nearest neighbors and the distance between them. In network graph parlance, this kind of data is called an edge list i.e. a list of pair of nodes that are connected, along with any additional information that specifies a property (in this case distance) of the edge that connects these nodes.

+ + + + + +
 1def get_edge_list(label, k=5):
+ 2    faiss_DB, faiss_data, faiss_indices = create_index(label)
+ 3    # To map the data back to the original `train[b'data']` array
+ 4    faiss_indices_map = {i: x for i,x in enumerate(faiss_indices)}
+ 5    # To map the indices back to the original strings
+ 6    title_name_map = {i: x for i,x in data.select("row_idx", "product_title").rows()}
+ 7    distances, neighbors = faiss_DB.search(faiss_data, k)
+ 8    
+ 9    return (
+10        pl.DataFrame({
+11            "from": faiss_indices})
+12        .with_columns(
+13            pl.Series("to", neighbors),
+14            pl.Series("distance", distances))
+15        .explode("to", "distance")
+16        .with_columns(
+17            pl.col("from")
+18            .map_dict(title_name_map),
+19            pl.col("to")
+20            .map_dict(faiss_indices_map)
+21            .map_dict(title_name_map))
+22        .filter(pl.col("from") != pl.col("to"))
+23    )                   

NetworkX and Connected Components

+

The next step in the process is to create a network graph using the edge-list. But why?

+

Remember that we have identified the (k=5) nearest neighbors of each data point. Let’s say that we have a point A that has a nearest neighbor B. C is not a nearest neighbor of A, but it is a nearest neighbor of B. In a network graph, if A and C are sufficiently similar enough to B within a particular minimum thershold, then A will be connected to C through B! Hopefully a small visual below would help.

+

How a network component is formed.

+

What happens when such a concept is extended for many data points? Not all of them would be connected - because we’re applying a minimum threshold that they have to meet. This is the only hueristic part of the rather fast process. Here’s one more helpful visual:

+

How a network cluster is formed.

+

Very starry night-eque vibes here. Let’s get to the code.

+ + + + + +
1import networkx as nx
+2def get_cluster_map(label, k=5, min_cosine_distance=0.95):
+3    edge_list = (
+4        get_edge_list(label, k=k)
+5        .filter(pl.col("distance") >= min_cosine_distance)
+6    )
+7    graph = nx.from_pandas_edgelist(edge_list.to_pandas(), source="from", target="to")
+8    return {i: list(x) for i,x in enumerate(nx.connected_components(graph))}

Getting clusters

+

Now that all the parts of the puzzle are together, let’s run it to see what kind of clusters you get for Cell Phone Accessories.

+ + + + + +
1clusters = get_cluster_map("Cell Phones Accessories", 5, 0.95)

Make sure to configure the following if your results aren’t good enough:

+
    +
  1. Relax the min_cosine_distance value if you want bigger clusters.
  2. +
  3. Increase the number of nearest neighbors if you want more matches.
  4. +
+

Viewing the components

+

There will likely be many clusters (you can see how many exactly with len(clusters)). Let’s look at a random cluster:

+ + + + + +
1>> clusters[3]
+2['smartphone lanyard with card slot for any phone up to 6 yellow 72570099',
+3 'smartphone lanyard with card slot for any phone up to 6 black 72570093',
+4 'smartphone lanyard with card slot for any phone up to 6 lightblue 72570097',
+5 'smartphone lanyard with card slot for any phone up to 6 blue 72570095',
+6 'smartphone lanyard with card slot for any phone up to 6 green 72570101',
+7 'smartphone lanyard with card slot for any phone up to 6 pink 72570091']

Let’s see another cluster that had 172(!) members in my run (the clusters themselves will be stable, but their indices may change in each run owing to some inherent randomness in the process).

+ + + + + +
 1>>> clusters[6]
+ 2['otm essentials iphone 8/7 modern clear printed phone case snowflakes iphone 8/7 op qq z051a',
+ 3 'otm essentials iphone 8/7 modern clear printed phone case iphone 8/7 arrows blue op qq a02 58',
+ 4 'otm essentials iphone 8/7/6s clear printed phone case single iphone 8/7/6s golden pineapple op qq z089a',
+ 5 'otm essentials iphone 8/7/6s clear printed phone case single iphone 8/7/6s butteryfly delight yellow op qq z029d',
+ 6 'otm essentials iphone 8/7 modern clear printed phone case iphone 8/7 luck of the irish op qq a01 45',
+ 7 'otm essentials iphone 8/7 modern clear printed phone case iphone 8/7 brides maid white op qq a02 16',
+ 8 ...
+ 9 'otm essentials iphone 8/7 modern clear printed phone case iphone 8/7 flying arrows white op qq hip 20',
+10 'otm essentials iphone 8/7 modern clear printed phone case iphone 8/7 brides maid pink white op qq a02 17',
+11 'otm essentials iphone 8/7 modern clear printed phone case iphone 8/7 anemone flowers white op qq z036a',
+12 'otm essentials iphone 8/7 modern clear printed phone case mustache iphone 8/7 op qq hip 08',
+13 'otm essentials iphone 8/7 modern clear printed phone case oh snap iphone 8/7 op qq z053a',
+14 'otm essentials iphone 8/7/6s clear printed phone case single iphone 8/7/6s desert cacti orange pink op qq a02 22']

Running for all categories

+

This isn’t that hard (although it may take more than a moment). Just iterate it for each category!

+ + + + + +
1clusters = [get_cluster_map(x, 5, 0.95) for x in data.get_column("category_label").unique()]

For the folks in a hurry!

+

I get it - you often want a solution that “just works”. I can come close to it. See below for code and a succinct explanation. For those of my readers who aren’t in a hurry, this also serves as a nice summary (and copy-pastable code)!

+

The code

+ + + + + +
 1import sentence_transformers
+ 2import faiss
+ 3import polars as pl
+ 4import numpy as np
+ 5
+ 6# Data is read here. You download the files from Kaggle here: 
+ 7# https://www.kaggle.com/datasets/lakritidis/product-classification-and-categorization
+ 8data = pl.read_csv("archive/shopmania.csv", new_columns=[
+ 9    "product_ID", "product_title", "category_ID", "category_label"])
+10data = (
+11    data
+12    .filter(pl.count().over("category_ID") == 10000)
+13    .with_row_count("row_idx")
+14)
+15
+16
+17# See list of models at www.sbert.net/docs/pretrained_models.html
+18ST = sentence_transformers.SentenceTransformer("all-mpnet-base-v2")
+19title_embeddings = (
+20    ST.encode(
+21        data.get_column("product_title").to_list(),
+22        # I'm on a MacBook, you should use `cuda` or `cpu`
+23        # if you've got different hardware.
+24        device="mps",
+25        show_progress_bar=True, convert_to_tensor=True)
+26    .cpu().numpy())
+27
+28# Code to create a FAISS index
+29def create_index(label):
+30    faiss_indices = (
+31        data # this needs to be an argument if you want to create a generic function
+32        .filter(pl.col("category_label") == label)
+33        .get_column("row_idx")
+34        .to_list()
+35    )
+36    
+37    faiss_data = title_embeddings[faiss_indices]
+38    d = faiss_data.shape[1]         # Number of dimensions
+39    faiss_DB = faiss.IndexFlatIP(d) # Index using Inner Product
+40    faiss.normalize_L2(faiss_data)  # Normalized L2 with Inner Product search = cosine similarity
+41    faiss_DB.add(faiss_data)        # Build the index
+42    
+43    return faiss_DB, faiss_data, faiss_indices
+44
+45# Code to create an edge-list
+46def get_edge_list(label, k=5):
+47    faiss_DB, faiss_data, faiss_indices = create_index(label)
+48    # To map the data back to the original `train[b'data']` array
+49    faiss_indices_map = {i: x for i,x in enumerate(faiss_indices)}
+50    # To map the indices back to the original strings
+51    title_name_map = {i: x for i,x in data.select("row_idx", "product_title").rows()}
+52    distances, neighbors = faiss_DB.search(faiss_data, k)
+53    
+54    return (
+55        pl.DataFrame({
+56            "from": faiss_indices})
+57        .with_columns(
+58            pl.Series("to", neighbors),
+59            pl.Series("distance", distances))
+60        .explode("to", "distance")
+61        .with_columns(
+62            pl.col("from")
+63            .map_dict(title_name_map),
+64            pl.col("to")
+65            .map_dict(faiss_indices_map)
+66            .map_dict(title_name_map))
+67        .filter(pl.col("from") != pl.col("to"))
+68    )
+69
+70# Code to extract components from a Network Graph
+71import networkx as nx
+72def get_cluster_map(label, k=5, min_cosine_distance=0.95):
+73    edge_list = (
+74        get_edge_list(label, k=k)
+75        .filter(pl.col("distance") >= min_cosine_distance)
+76    )
+77    graph = nx.from_pandas_edgelist(edge_list.to_pandas(), source="from", target="to")
+78    return {i: list(x) for i,x in enumerate(nx.connected_components(graph))}
+79
+80# Example call to a single category to obtain its clusters
+81clusters = get_cluster_map("Cell Phones Accessories", 5, 0.95)
+82# Example call to **all** categories to obtain all clusters
+83clusters = [get_cluster_map(x, 5, 0.95) for x in data.get_column("category_label").unique()]

How the code works

+

If you want to write down an algorithmic way of looking at this approach,

+
    +
  1. Obtain a 2D representation of the labelled/categorized data. This can be embeddings for strings, the final hidden state output from a generic CNN model for images, or a good ol’ tabular dataset where all numbers are normalized and can be expressed as such.
  2. +
  3. Create an ANN database (based on a package such as faiss) that allows you fast nearest neighbor searches. Use cosine similarity for an easy threshold determination step.
  4. +
  5. Obtain an edge-list of k (from 5 to 100) nearest neighbors for all (or a sample of data points in case your dataset is incredibly HUGE) data points in the ANN database.
  6. +
  7. Apply a minimum threshold on similarity (completely based on heuristics), and obtain the connected components of the network graph from the filtered edge-list you just created.
  8. +
  9. Map all indices back to their source data-points that make sense, and pick any number of items from each cluster (usually, I end up picking one element from each cluster), and you now have your representative sample!
  10. +
+]]>
\ No newline at end of file diff --git a/public/tags/samples/index.html b/public/tags/samples/index.html new file mode 100644 index 0000000..e78be10 --- /dev/null +++ b/public/tags/samples/index.html @@ -0,0 +1,6 @@ +Samples | Avinash's Blog
+

Avinash's Blog

Filtering for "Samples"

© Avinash Mallya | Design via Bear Cub.
\ No newline at end of file diff --git a/public/tags/samples/index.xml b/public/tags/samples/index.xml new file mode 100644 index 0000000..5746d8c --- /dev/null +++ b/public/tags/samples/index.xml @@ -0,0 +1,383 @@ +Samples on Avinash's Bloghttps://avimallu.dev/tags/samples/Recent content in Samples on Avinash's BlogHugo -- gohugo.ioen-US© Avinash MallyaThu, 19 Oct 2023 00:00:00 +0000Finding representative samples efficiently for large datasetshttps://avimallu.dev/blog/002_representative_samples/Thu, 19 Oct 2023 00:00:00 +0000https://avimallu.dev/blog/002_representative_samples/<h1 id="premise">Premise</h1> +<p>In this day and age, we&rsquo;re not short on data. <em>Good</em> data, on the other hand, is very valuable. When you&rsquo;ve got a large amount of improperly labelled data, it may become hard to find to find a representative dataset to train a model on such that it generalizes well.</p> +<p>Let&rsquo;s formalize the problem a little so that a proper approach can be developed. Here&rsquo;s the problem statement:</p> +<ol> +<li>You have a large-ish set of (imperfectly) labelled data points. These data points can be represented as a 2D matrix.</li> +<li>You need to train a model to classify these data points on either these labels, or on labels dervied from imperfect labels.</li> +<li>You need a good (but not perfect) representative sample for the model to be generalizable, but there are too many data points for each label to manually pick representative examples.</li> +</ol> +<h2 id="in-a-hurry">In a hurry?</h2> +<p>Here&rsquo;s what you need to do:</p>Premise +

In this day and age, we’re not short on data. Good data, on the other hand, is very valuable. When you’ve got a large amount of improperly labelled data, it may become hard to find to find a representative dataset to train a model on such that it generalizes well.

+

Let’s formalize the problem a little so that a proper approach can be developed. Here’s the problem statement:

+
    +
  1. You have a large-ish set of (imperfectly) labelled data points. These data points can be represented as a 2D matrix.
  2. +
  3. You need to train a model to classify these data points on either these labels, or on labels dervied from imperfect labels.
  4. +
  5. You need a good (but not perfect) representative sample for the model to be generalizable, but there are too many data points for each label to manually pick representative examples.
  6. +
+

In a hurry?

+

Here’s what you need to do:

+
    +
  1. Read the premise and see if it fits your problem.
  2. +
  3. Go to the For the folks in a hurry! section at the end to find the generic solution and how it works.
  4. +
+

Why do we need representative samples?

+

Generally, three things come to mind:

+
    +
  1. Allows the model to be generalizable for all kinds of data points within a category.
  2. +
  3. Allows for faster training of the model - you need fewer data points to get the same accuracy!
  4. +
  5. Allows maintaining the training set - if your training set needs validation by experts or annotations, this keeps your costs low!
  6. +
+

Define the data

+

This data can be practically anything that can be represented as a 2D matrix.

+

There are exceptions. Raw image data (as numbers) might get difficult because even if you flatten them, they’ll be significant correlation between features. For example, a face can appear practically anywhere in the image, and all pixels centered around the face will be highly correlated, even if they are on different lines. A workaround in this case would be to pipe the image through a CNN model that has been trained on some generic task and produces a 1D representation of a single image in the final hidden layer before the output. Other data will need further processing along similar lines.

+

Get a specific dataset

+

For this specific article, I will use the ShopMania dataset on Kaggle. I apologize in advance for not using a more easily accessible dataset (you need to sign into Kaggle to download it) - and I’m not 100% sure if the GPL allows me to create a copy of the data and place it in my own repository. Nevertheless, the data (if you download it and choose to use it instead of some other dataset) will look like this:

+
+

NOTE: whenever I want to show an output along with the code I used for it, you’ll see the characters >> indicating the command used, and the output to be without those prefixes.

+
+ + + + + +
 1>> import polars as pl
+ 2>> data = pl.read_csv("archive/shopmania.csv")
+ 3>> data
+ 4shape: (313_705, 4)
+ 5┌────────────┬──────────────────────────────────────────────────────┬─────────────┬────────────────┐
+ 6 product_ID  product_title                                         category_ID  category_label 
+ 7 ---         ---                                                   ---          ---            
+ 8 i64         str                                                   i64          str            
+ 9╞════════════╪══════════════════════════════════════════════════════╪═════════════╪════════════════╡
+10 2           twilight central park print                           2            Collectibles   
+11 3           fox print                                             2            Collectibles   
+12 4           circulo de papel wall art                             2            Collectibles   
+13 5           hidden path print                                     2            Collectibles   
+14                                                                                           
+15 313703      deago anti fog swimming diving full face mask         229          Water Sports   
+16             surface snorkel scuba fr gopro black s/m                                          
+17 313704      etc buys full face gopro compatible snorkel scuba     229          Water Sports   
+18             diving mask blue large/xtralarge blue                                             
+19 313705      men 039 s full face breathe free diving snorkel mask  229          Water Sports   
+20             scuba optional hd camera blue mask only adult men                                 
+21 313706      women 039 s full face breathe free diving snorkel     229          Water Sports   
+22             mask scuba optional hd camera black mask only                                     
+23             children and women                                                                
+24└────────────┴──────────────────────────────────────────────────────┴─────────────┴────────────────┘

The data documentation on Kaggle states:

+
+

The first dataset originates from ShopMania, a popular online product comparison platform. It enlists tens of millions of products organized in a three-level hierarchy that includes 230 categories. The two higher levels of the hierarchy include 39 categories, whereas the third lower level accommodates the rest 191 leaf categories. Each product is categorized into this tree structure by being mapped to only one leaf category. Some of these 191 leaf categories contain millions of products. However, shopmania.com allows only the first 10,000 products to be retrieved from each category. Under this restriction, our crawler managed to collect 313,706 products.

+
+

For demonstration, I’ll just limit the categories to those that have exactly 10,000 occurences.

+ + + + + +
1data = (
+2    data
+3    .filter(pl.count().over("category_ID") == 10000)
+4)

You’ll notice that there are only 17 categories in this dataset. Run this to verify that fact.

+ + + + + +
 1>>> data.get_column("category_label").unique()
+ 2shape: (17,)
+ 3Series: 'category_label' [str]
+ 4[
+ 5    "Kitchen & Dining"
+ 6    "Scarves and wraps"
+ 7    "Handbags & Wallets"
+ 8    "Rugs  Tapestry & Linens"
+ 9    "Cell Phones Accessories"
+10    "Men's Clothing"
+11    "Jewelry"
+12    "Belts"
+13    "Men Lingerie"
+14    "Crafts"
+15    "Football"
+16    "Medical Supplies"
+17    "Adult"
+18    "Hunting"
+19    "Women's Clothing"
+20    "Pet Supply"
+21    "Office Supplies"
+22]

Note that this is very easy in Polars, which is the package I typically use for data manipulation. I recommend using it over Pandas.

+

Specify the task

+

Okay - so now we have exactly 10,000 products per category. We only have the title of the product that can be leveraged for categorization. So let me define the task this way:

+
+

Craft a small representative sample for each category.

+
+

Why small? It helps that it’ll make the model faster to train - and keep the training data manageable in size.

+

Finding representative samples

+

I mentioned earlier that we need to represent data as a 2D matrix for the technique I have in mind to work. How can I translate a list of text to a matrix? The answer’s rather simple: use SentenceTransformers to get a string’s embedding. You could also use more classic techniques like computing TF-IDF values, or use more advanced transformers, but I’ve noticed that SentenceTransformers are able to capture semantic meaning of sentences rather well (assuming you use a good model suited for the language the data is in) - they are trained on sentence similarity after all.

+

Getting SentenceTransformer embeddings

+

This part is rather simple. If you’re unable to install SentenceTransformers, please check their website.

+ + + + + +
1import sentence_transformers
+2# See list of models at www.sbert.net/docs/pretrained_models.html
+3ST = sentence_transformers.SentenceTransformer("all-mpnet-base-v2")
+4title_embeddings = (
+5    ST.encode(
+6        data.get_column("product_title").to_list(),
+7        show_progress_bar=True, convert_to_tensor=True)
+8    .numpy())

This process will be slow (~30 minutes) if you don’t have a GPU. There are faster approaches, but they are slightly more involved than would be beneficial for a blog post. The wait will be worth it, I promise! In addition, the call to .numpy() at the end is to directly get a single numpy array - otherwise you get a list of numpy arrays, which is rather inefficient. Further, SentenceTransformers will try to run on the GPU if available, and if so, you will need to write .cpu().numpy() so that the tensor is copied from the GPU to the CPU.

+
+

NOTE: for a proof-of-concept implementation, or if you’re on the CPU, try the all-MiniLM-L6-v2 model. It’s a much smaller and much faster model, although you sacrifice a little in terms of accuracy.

+
+

The concept of approximate nearest neighbors

+

Performing any kind of nearest neighbor algorithm on medium scale datasets (even bordering 10,000 rows and tens of columns) tends to be slow. A primary driver of this was the need to calculate all, or nearly all distances between all data points. Approximate nearest neighbor (ANN) algorithms work around this through various approaches, which warrant their own blog post. For now, it would suffice to understand that there are shortcuts that ANN algorithms take to give you if not the exact nearest neighbor, at least one of the nearest neighbors (hence the term approximate).

+

There are several algorithms that you can use - I shall proceed with faiss, because it has a nice Python interface and is rather easy to work with. You can use any algorithm - a full list of the major ones are available here.

+

I’ll explain why we’re in the nearest neighbor territory in due course.

+

Building the database

+

To build the database, all we need is the title_embeddings matrix.

+ + + + + +
1import faiss
+2def create_index(title_embeddings):
+3    d = title_embeddings.shape[1]    # Number of dimensions
+4    ann_index = faiss.IndexFlatL2(d) # Index using Eucledian Matrix
+5    ann_index.add(title_embeddings)  # Build the index
+6    
+7    return ann_index # Faiss considers databases an "index"

This does create a database. But remember, we’re trying to find representative samples - which means we need to do this by the category (or label). So let’s design a function that sends only the necessary data as that for a particular category, and then create the database. We’ll need three pieces of information from this function:

+
    +
  1. The actual faiss database.
  2. +
  3. The actual subset of data that was used to build this index.
  4. +
  5. The label indices with respect to the original data that went into the faiss database.
  6. +
+

(2) and (3) will help us later in rebuilding a “network graph” that will allow us to reference the original data points.

+ + + + + +
 1import faiss
+ 2import numpy as np
+ 3import polars as pl
+ 4
+ 5def create_index(label):
+ 6    faiss_indices = (
+ 7        data # this needs to be an argument if you want to create a generic function
+ 8        .with_row_count("row_idx")
+ 9        .filter(pl.col("category_label") == label)
+10        .get_column("row_idx")
+11        .to_list()
+12    )
+13    
+14    faiss_data = title_embeddings[faiss_indices]
+15    d = data.shape[1]               # Number of dimensions
+16    faiss_DB = faiss.IndexFlatIP(d) # Index using Inner Product
+17    faiss.normalize_L2(data)        # Normalized L2 with Inner Product search = cosine similarity
+18    # Why cosine similarity? It's easier to specify thresholds - they'll always be between 0 and 1.4.
+19    # If using Eucledian or other distance, we'll have to spend some time finding a good range
+20    # where distances are reasonable. See https://stats.stackexchange.com/a/146279 for details.
+21    faiss_DB.add(data)              # Build the index
+22    
+23    return faiss_DB, faiss_data, faiss_indices

Identifying the nearest neighbors

+

To proceed with getting a representative sample, the next step is to find the nearest neighbors for all data points in the database. This isn’t too hard - faiss index objects have a built-in search method to find the k nearest neighbors for a given index, along with the (approximate) distance to it. Let’s then write a function to get the following information: the label index for whom nearest neighbors are being searched, the indices of said nearest neighbors and the distance between them. In network graph parlance, this kind of data is called an edge list i.e. a list of pair of nodes that are connected, along with any additional information that specifies a property (in this case distance) of the edge that connects these nodes.

+ + + + + +
 1def get_edge_list(label, k=5):
+ 2    faiss_DB, faiss_data, faiss_indices = create_index(label)
+ 3    # To map the data back to the original `train[b'data']` array
+ 4    faiss_indices_map = {i: x for i,x in enumerate(faiss_indices)}
+ 5    # To map the indices back to the original strings
+ 6    title_name_map = {i: x for i,x in data.select("row_idx", "product_title").rows()}
+ 7    distances, neighbors = faiss_DB.search(faiss_data, k)
+ 8    
+ 9    return (
+10        pl.DataFrame({
+11            "from": faiss_indices})
+12        .with_columns(
+13            pl.Series("to", neighbors),
+14            pl.Series("distance", distances))
+15        .explode("to", "distance")
+16        .with_columns(
+17            pl.col("from")
+18            .map_dict(title_name_map),
+19            pl.col("to")
+20            .map_dict(faiss_indices_map)
+21            .map_dict(title_name_map))
+22        .filter(pl.col("from") != pl.col("to"))
+23    )                   

NetworkX and Connected Components

+

The next step in the process is to create a network graph using the edge-list. But why?

+

Remember that we have identified the (k=5) nearest neighbors of each data point. Let’s say that we have a point A that has a nearest neighbor B. C is not a nearest neighbor of A, but it is a nearest neighbor of B. In a network graph, if A and C are sufficiently similar enough to B within a particular minimum thershold, then A will be connected to C through B! Hopefully a small visual below would help.

+

How a network component is formed.

+

What happens when such a concept is extended for many data points? Not all of them would be connected - because we’re applying a minimum threshold that they have to meet. This is the only hueristic part of the rather fast process. Here’s one more helpful visual:

+

How a network cluster is formed.

+

Very starry night-eque vibes here. Let’s get to the code.

+ + + + + +
1import networkx as nx
+2def get_cluster_map(label, k=5, min_cosine_distance=0.95):
+3    edge_list = (
+4        get_edge_list(label, k=k)
+5        .filter(pl.col("distance") >= min_cosine_distance)
+6    )
+7    graph = nx.from_pandas_edgelist(edge_list.to_pandas(), source="from", target="to")
+8    return {i: list(x) for i,x in enumerate(nx.connected_components(graph))}

Getting clusters

+

Now that all the parts of the puzzle are together, let’s run it to see what kind of clusters you get for Cell Phone Accessories.

+ + + + + +
1clusters = get_cluster_map("Cell Phones Accessories", 5, 0.95)

Make sure to configure the following if your results aren’t good enough:

+
    +
  1. Relax the min_cosine_distance value if you want bigger clusters.
  2. +
  3. Increase the number of nearest neighbors if you want more matches.
  4. +
+

Viewing the components

+

There will likely be many clusters (you can see how many exactly with len(clusters)). Let’s look at a random cluster:

+ + + + + +
1>> clusters[3]
+2['smartphone lanyard with card slot for any phone up to 6 yellow 72570099',
+3 'smartphone lanyard with card slot for any phone up to 6 black 72570093',
+4 'smartphone lanyard with card slot for any phone up to 6 lightblue 72570097',
+5 'smartphone lanyard with card slot for any phone up to 6 blue 72570095',
+6 'smartphone lanyard with card slot for any phone up to 6 green 72570101',
+7 'smartphone lanyard with card slot for any phone up to 6 pink 72570091']

Let’s see another cluster that had 172(!) members in my run (the clusters themselves will be stable, but their indices may change in each run owing to some inherent randomness in the process).

+ + + + + +
 1>>> clusters[6]
+ 2['otm essentials iphone 8/7 modern clear printed phone case snowflakes iphone 8/7 op qq z051a',
+ 3 'otm essentials iphone 8/7 modern clear printed phone case iphone 8/7 arrows blue op qq a02 58',
+ 4 'otm essentials iphone 8/7/6s clear printed phone case single iphone 8/7/6s golden pineapple op qq z089a',
+ 5 'otm essentials iphone 8/7/6s clear printed phone case single iphone 8/7/6s butteryfly delight yellow op qq z029d',
+ 6 'otm essentials iphone 8/7 modern clear printed phone case iphone 8/7 luck of the irish op qq a01 45',
+ 7 'otm essentials iphone 8/7 modern clear printed phone case iphone 8/7 brides maid white op qq a02 16',
+ 8 ...
+ 9 'otm essentials iphone 8/7 modern clear printed phone case iphone 8/7 flying arrows white op qq hip 20',
+10 'otm essentials iphone 8/7 modern clear printed phone case iphone 8/7 brides maid pink white op qq a02 17',
+11 'otm essentials iphone 8/7 modern clear printed phone case iphone 8/7 anemone flowers white op qq z036a',
+12 'otm essentials iphone 8/7 modern clear printed phone case mustache iphone 8/7 op qq hip 08',
+13 'otm essentials iphone 8/7 modern clear printed phone case oh snap iphone 8/7 op qq z053a',
+14 'otm essentials iphone 8/7/6s clear printed phone case single iphone 8/7/6s desert cacti orange pink op qq a02 22']

Running for all categories

+

This isn’t that hard (although it may take more than a moment). Just iterate it for each category!

+ + + + + +
1clusters = [get_cluster_map(x, 5, 0.95) for x in data.get_column("category_label").unique()]

For the folks in a hurry!

+

I get it - you often want a solution that “just works”. I can come close to it. See below for code and a succinct explanation. For those of my readers who aren’t in a hurry, this also serves as a nice summary (and copy-pastable code)!

+

The code

+ + + + + +
 1import sentence_transformers
+ 2import faiss
+ 3import polars as pl
+ 4import numpy as np
+ 5
+ 6# Data is read here. You download the files from Kaggle here: 
+ 7# https://www.kaggle.com/datasets/lakritidis/product-classification-and-categorization
+ 8data = pl.read_csv("archive/shopmania.csv", new_columns=[
+ 9    "product_ID", "product_title", "category_ID", "category_label"])
+10data = (
+11    data
+12    .filter(pl.count().over("category_ID") == 10000)
+13    .with_row_count("row_idx")
+14)
+15
+16
+17# See list of models at www.sbert.net/docs/pretrained_models.html
+18ST = sentence_transformers.SentenceTransformer("all-mpnet-base-v2")
+19title_embeddings = (
+20    ST.encode(
+21        data.get_column("product_title").to_list(),
+22        # I'm on a MacBook, you should use `cuda` or `cpu`
+23        # if you've got different hardware.
+24        device="mps",
+25        show_progress_bar=True, convert_to_tensor=True)
+26    .cpu().numpy())
+27
+28# Code to create a FAISS index
+29def create_index(label):
+30    faiss_indices = (
+31        data # this needs to be an argument if you want to create a generic function
+32        .filter(pl.col("category_label") == label)
+33        .get_column("row_idx")
+34        .to_list()
+35    )
+36    
+37    faiss_data = title_embeddings[faiss_indices]
+38    d = faiss_data.shape[1]         # Number of dimensions
+39    faiss_DB = faiss.IndexFlatIP(d) # Index using Inner Product
+40    faiss.normalize_L2(faiss_data)  # Normalized L2 with Inner Product search = cosine similarity
+41    faiss_DB.add(faiss_data)        # Build the index
+42    
+43    return faiss_DB, faiss_data, faiss_indices
+44
+45# Code to create an edge-list
+46def get_edge_list(label, k=5):
+47    faiss_DB, faiss_data, faiss_indices = create_index(label)
+48    # To map the data back to the original `train[b'data']` array
+49    faiss_indices_map = {i: x for i,x in enumerate(faiss_indices)}
+50    # To map the indices back to the original strings
+51    title_name_map = {i: x for i,x in data.select("row_idx", "product_title").rows()}
+52    distances, neighbors = faiss_DB.search(faiss_data, k)
+53    
+54    return (
+55        pl.DataFrame({
+56            "from": faiss_indices})
+57        .with_columns(
+58            pl.Series("to", neighbors),
+59            pl.Series("distance", distances))
+60        .explode("to", "distance")
+61        .with_columns(
+62            pl.col("from")
+63            .map_dict(title_name_map),
+64            pl.col("to")
+65            .map_dict(faiss_indices_map)
+66            .map_dict(title_name_map))
+67        .filter(pl.col("from") != pl.col("to"))
+68    )
+69
+70# Code to extract components from a Network Graph
+71import networkx as nx
+72def get_cluster_map(label, k=5, min_cosine_distance=0.95):
+73    edge_list = (
+74        get_edge_list(label, k=k)
+75        .filter(pl.col("distance") >= min_cosine_distance)
+76    )
+77    graph = nx.from_pandas_edgelist(edge_list.to_pandas(), source="from", target="to")
+78    return {i: list(x) for i,x in enumerate(nx.connected_components(graph))}
+79
+80# Example call to a single category to obtain its clusters
+81clusters = get_cluster_map("Cell Phones Accessories", 5, 0.95)
+82# Example call to **all** categories to obtain all clusters
+83clusters = [get_cluster_map(x, 5, 0.95) for x in data.get_column("category_label").unique()]

How the code works

+

If you want to write down an algorithmic way of looking at this approach,

+
    +
  1. Obtain a 2D representation of the labelled/categorized data. This can be embeddings for strings, the final hidden state output from a generic CNN model for images, or a good ol’ tabular dataset where all numbers are normalized and can be expressed as such.
  2. +
  3. Create an ANN database (based on a package such as faiss) that allows you fast nearest neighbor searches. Use cosine similarity for an easy threshold determination step.
  4. +
  5. Obtain an edge-list of k (from 5 to 100) nearest neighbors for all (or a sample of data points in case your dataset is incredibly HUGE) data points in the ANN database.
  6. +
  7. Apply a minimum threshold on similarity (completely based on heuristics), and obtain the connected components of the network graph from the filtered edge-list you just created.
  8. +
  9. Map all indices back to their source data-points that make sense, and pick any number of items from each cluster (usually, I end up picking one element from each cluster), and you now have your representative sample!
  10. +
+]]>
\ No newline at end of file diff --git a/public/tags/vba/index.html b/public/tags/vba/index.html new file mode 100644 index 0000000..d478cda --- /dev/null +++ b/public/tags/vba/index.html @@ -0,0 +1,6 @@ +Vba | Avinash's Blog
+

Avinash's Blog

Filtering for "Vba"

© Avinash Mallya | Design via Bear Cub.
\ No newline at end of file diff --git a/public/tags/vba/index.xml b/public/tags/vba/index.xml new file mode 100644 index 0000000..7e60b87 --- /dev/null +++ b/public/tags/vba/index.xml @@ -0,0 +1,101 @@ +Vba on Avinash's Bloghttps://avimallu.dev/tags/vba/Recent content in Vba on Avinash's BlogHugo -- gohugo.ioen-US© Avinash MallyaFri, 20 Oct 2023 00:00:00 +0000Quick hacks to make client-ready presentationshttps://avimallu.dev/blog/003_powerpointsnap/Fri, 20 Oct 2023 00:00:00 +0000https://avimallu.dev/blog/003_powerpointsnap/<h1 id="premise">Premise</h1> +<p>When I worked in healthcare consulting, I often spent a LOT of my time creating PowerPoint presentations (<em>decks</em> in consulting lingo - not even <em>slide decks</em>). However, it was rather repetitive. Thus, was born PowerPointSnap.</p> +<h1 id="what-is-it">What is it?</h1> +<p>I&rsquo;ll write this down as pointers.</p> +<ol> +<li>It&rsquo;s a VBA based PowerPoint add-on. Just a set of commands that work well with each other.</li> +<li>It&rsquo;s Windows only - it&rsquo;s unlikely to work on MacOS.</li> +<li>It&rsquo;s installation-free and is not an executable, which makes it perfect for locked-down corporate environments, as long as you have the permission to download files.</li> +</ol> +<h1 id="how-do-i-get-it">How do I get it?</h1> +<p>The project is available on this <a href="https://github.com/avimallu/PowerPointSnap">Github repo</a>. The instructions to install it are available there, but here&rsquo;s the down-low:</p>Premise +

When I worked in healthcare consulting, I often spent a LOT of my time creating PowerPoint presentations (decks in consulting lingo - not even slide decks). However, it was rather repetitive. Thus, was born PowerPointSnap.

+

What is it?

+

I’ll write this down as pointers.

+
    +
  1. It’s a VBA based PowerPoint add-on. Just a set of commands that work well with each other.
  2. +
  3. It’s Windows only - it’s unlikely to work on MacOS.
  4. +
  5. It’s installation-free and is not an executable, which makes it perfect for locked-down corporate environments, as long as you have the permission to download files.
  6. +
+

How do I get it?

+

The project is available on this Github repo. The instructions to install it are available there, but here’s the down-low:

+
    +
  1. Download the Snap.ppam file to your system.
  2. +
  3. Enable the developer options.
  4. +
  5. Go to the Developer tab, and click on PowerPoint Add-ins.
  6. +
  7. Click on Add New. Choose the location of the file you just dowloaded. Click Close.
  8. +
  9. To uninstall, repeat the process, and simply click on Remove this time.
  10. +
+

What can I do with it?

+

Frankly, a LOT. The base concept of this tool is:

+
    +
  1. “Set” a shape as the one you want to copy a property from.
  2. +
  3. Select any property from the list to automatically apply it.
  4. +
+

Here’s a non-exhaustive list of all the options available.

+

Apply properties of shapes directly

+

This is the part of the interface that can be used for shapes (which include charts and tables).

+

The UI for copying shape properties

+

To use, first select a shape object, click on “Set”. Then, choose the object you want to Snap its properties to (see how I got the inspiration for the name?). You should be able to copy all compatible properties - if something is not copy-able, the tool will show an error, and then let you exit.

+

Note that it’s probably not to apply a property of a shape to a table - if you want to make the entire table orange, there are probably better built-in ways to do it than to use Snap.

+

Beautify charts with Snappable properties

+

Charts are also supported, with dedicated features for it.

+

The UI for copying chart properties

+

What do these features do? You should be able to hover over the option and get a tooltip that shows what it’s capable of, but here’s another summary just in case:

+
    +
  1. Sync Value/Date Axis: this will try to align the range, the ticks, the numeric values etc. of the “set” chart to the one you’ve selected. I couldn’t put in just $x$ and $y$ here because Microsoft internally doesn’t label them that way. Try either of these two options (you can undo!) and see what works best for your chart. This doesn’t work well yet for 3D charts.
  2. +
  3. Sync Plot/Title/Legend: often, you want to centre a title, or make sure that multiple charts that show nearly identical things for different variables all look exactly the same from a client perspective. But that’s usually difficult if you’ve already configured the charts a little - which can be remedied with this option!
  4. +
  5. Format Painter: this is simply a helper for the normal format painter to align the formats of the text that you’ve selected with the way it originally is in the “set” chart. The reason for this feature is simply to avoid going back to Home to click on the Format Painter option again.
  6. +
  7. Reset Axes Scales: in case you messed up somewhere, you can use this to rever to PowerPoint defaults.
  8. +
+

The next two options deserve their own section.

+

Customize the labels programmatically

+

Your immediate senior in a consulting environment would frown at your chart, and then exclaim, “I think that’s too many labels for the data points. Can you show them every two/three/four labels? I know this is manual work, but it’s a one time thing!”

+

It’s never a one time affair. But don’t worry, we have this nice feature to help us. If you click on the Customize Label option, you will get this (without the “Set” option):

+

The UI for customizing labels.

+

Never mind the rather unfriendly legend entries. They’re just here to demonstrate that you can do the following kinds of whacky abilities with your own chart!

+

Screenshots of the chart snapability

+

Of course, visuals will do it more justice. For example, look at this image:

+

There’s a lot wrong with this image. But primarily, the charts are of different sizes, the axes are different, the labels are too clustered, and the titles aren’t centered.

+

Here’s what you can do:

+
    +
  1. Click on the left chart. Press “Set” in the toolbar for Snap.
  2. +
  3. Click on the right chart, and then go through the following: +
      +
    1. In Shapes, click on Dim. This will align the shapes of the chart.
    2. +
    3. Use the guides that you get while moving the chart to align the positions of the two charts now that their shapes are equal.
    4. +
    5. You’ll notice that the chart area doesn’t still match, nor does the title.
    6. +
    7. In Charts, click on Sync Plot Area and Sync Title Area, and watch the magic unfold.
    8. +
    9. Now, click on the second chart, and click on “Set”. Let’s align the axes of the first chart to the second one.
    10. +
    11. Click on the first chart, and then in Charts, click Sync Value Axis.
    12. +
    +
  4. +
  5. Let’s bring that senior’s exclamation back into play - (s)he wants you to highlight only Profit labels, and that too every 2 iterations. To do this: +
      +
    1. Click on Customize Labels after clicking on either chart.
    2. +
    3. You’ll get the screen shown in the previous section. Make sure to adjust the values such that it’s exactly like the screenshot there.
    4. +
    5. Click on “Save and Run”. This will save the configuration you’ve selected, and run it on the chart you’ve selected.
    6. +
    7. Click the other chart. Then, in Charts, click on Rerun Customization.
    8. +
    +
  6. +
+

This is what your results should look like:

+

Everything almost consistent. Your senior rests their eyes, and secretly wonder how you managed to do it quickly… maybe they should change some requirements…

+

Of course, getting those calculations right is a whole different thing that will need some work.

+

Align table dimensions

+

Oftentimes, you have two tables that show similar values… you know the drill. Here’s what you can do in a scenario such as this:

+

Similar data, but vastly different tables.

+

This is what the Tables section of the tool looks like:

+

The UI for Tables

+

To align these tables together,

+
    +
  1. Click on the left table. Press “Set” in the toolbar for Snap.
  2. +
  3. Click on the right table.
  4. +
  5. Click on Shapes, inside it, Dim. Now the shapes of the table are the same.
  6. +
  7. In Tables, click on Sync Column Widths. Now the columns are also the same.
  8. +
  9. If you try to align by rows, it fails because the number of rows are not the same in the two tables.
  10. +
+

Here’s what you’ll end up with:

+

Similar data, and similar enough tables.

+

Pretty neat, eh?

+]]>
\ No newline at end of file diff --git a/static/favicon.ico b/static/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..5c7d39b3ad1f83ca8ab030fedb36bb3e6e922b10 GIT binary patch literal 4286 zcmchaOD|+W6vwL{9zmi7lNPT=yqkrE1>MOkSP3E?(f9yjBeAra4R;|D*X`R)Mn}uvx%XDp`JFmdx2moX4*BQv3H%okj}YI4 z5Oq@Wk@zl!=jtcR?0y3S147C(I5-%Rib*|5QHlkh@ErmRO#I|M*j{PFQop5A&9(Xi zBWy6i&c(gd-=U!)`U-&srol$ee@Rh$dpr64eyzsFMq)KIG?1O@>gouxmT@~+vrjO< zGMGHxs^3*rRg{*Nrsa0I$>nm9(+N4191bTr91bNpeB|@_lyJ>;V9^e8yWQF!e1m}; z8!_m)hG!KO6}rs}mzl3Ta9D_AdU~41$H(TucWC2XuUVOjA=+aeTzf{@5q_Xv+T^etCJh^1*Ri`)j=~D=VX! znHid$ou$pqOf64ua7b_GqvyS?QPoH+EVv;2RAl0 z=;`T+CMG7RyStl4Mn<&Y6YSE`(uDbckH5FKNA>mfn!miftb8Fqp-_nMdw6)Dv$Hcg zKR>74-CeC{G)lohkT7T88~;T4MqgJ}Ry2QZZjKN$>bJJG($UcoH8(fYvfOfGORzi{s^Dza$B|q1qF0*aY6Fjp!j%4x$Hg5K0nU4 zU;FW%BloZ$<@4H$7?bgR{i`S+6~I_4pb4)BGg+ANFR{OLq3Csi~pU(^EAMaIRyHoduiu>@(T^k22I_ zam+%zoeNm^vESJ-`I(i?KHuZxoW$ao*%vJQgAXywY`Lyeo>MuOd9I|HG26zCYl%si{fH?{CuI4d!nNTw@MG$-X(v-yQ4| z77X+kOt7VLr55G=AB@3Q2rMuSw&?Hg_Zl&%JQ(qDoT;|x_oBg+Q&->{RDFj^i?N7G gtG`Q96^r2$zB%WLeJF(MhkU`+%@_Uy^H8$?0bHIQqW}N^ literal 0 HcmV?d00001 diff --git a/themes/hugo-bearcub/.github/workflows/gh-pages.yml b/themes/hugo-bearcub/.github/workflows/gh-pages.yml new file mode 100644 index 0000000..9f07252 --- /dev/null +++ b/themes/hugo-bearcub/.github/workflows/gh-pages.yml @@ -0,0 +1,32 @@ +name: github pages + +on: + push: + branches: + - main # Set a branch that will trigger a deployment + pull_request: + +jobs: + deploy: + runs-on: ubuntu-22.04 + steps: + - uses: actions/checkout@v3 + with: + submodules: true # Fetch Hugo themes (true OR recursive) + fetch-depth: 0 # Fetch all history for .GitInfo and .Lastmod + + - name: Setup Hugo + uses: peaceiris/actions-hugo@v3 + with: + hugo-version: 'latest' + extended: true + + - name: Build + run: hugo --minify --gc --destination ../public --source ./exampleSite --themesDir ../.. --baseURL https://clente.github.io/hugo-bearcub/ + + - name: Deploy + uses: peaceiris/actions-gh-pages@v4 + if: github.ref == 'refs/heads/main' + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + publish_dir: ./public diff --git a/themes/hugo-bearcub/.gitignore b/themes/hugo-bearcub/.gitignore new file mode 100644 index 0000000..6f93da2 --- /dev/null +++ b/themes/hugo-bearcub/.gitignore @@ -0,0 +1,5 @@ +.hugo_build.lock +.DS_Store +resources/ +todo.md +exampleSite/public/ \ No newline at end of file diff --git a/themes/hugo-bearcub/LICENSE b/themes/hugo-bearcub/LICENSE new file mode 100644 index 0000000..5c93582 --- /dev/null +++ b/themes/hugo-bearcub/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2020 Jan Raasch +Copyright (c) 2023 Caio Lente + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/themes/hugo-bearcub/README.md b/themes/hugo-bearcub/README.md new file mode 100644 index 0000000..a084e50 --- /dev/null +++ b/themes/hugo-bearcub/README.md @@ -0,0 +1,245 @@ +# ᕦʕ •ᴥ•ʔᕤ Bear Cub + +[![github pages](https://github.com/clente/hugo-bearcub/actions/workflows/gh-pages.yml/badge.svg)](https://github.com/clente/hugo-bearcub/actions/workflows/gh-pages.yml) +[![MIT license](https://img.shields.io/github/license/clente/hugo-bearcub)](https://github.com/clente/hugo-bearcub/blob/main/LICENSE) + +## Overview + +🐻 A lightweight [Hugo](https://gohugo.io/) theme based on [Bear +Blog](https://bearblog.dev) and [Hugo Bear +Blog](https://github.com/janraasch/hugo-bearblog). + +**Bear Cub** takes care of speed and optimization, so you can focus on writing +good content. It is free, multilingual, optimized for search engines, +no-nonsense, responsive, light, and fast. Really fast. + +## Installation + +Follow Hugo's [quick start](https://gohugo.io/getting-started/quick-start/) to +create an empty website and then clone **Bear Cub** into the themes directory as +a [Git submodule](https://git-scm.com/book/en/v2/Git-Tools-Submodules): + +```sh +git submodule add https://github.com/clente/hugo-bearcub themes/hugo-bearcub +``` + +To finish off, append a line to the site configuration file: + +```sh +echo 'theme = "hugo-bearcub"' >> hugo.toml +``` + +## Features + +Like [Bear Blog](https://bearblog.dev), this theme: +- Is free and open source +- Looks great on any device +- Makes tiny (~5kb), optimized, and awesome pages +- Has no trackers, ads, or scripts +- Automatically generates an RSS feed + +But that's not all! **Bear Cub** is also... + +### Accessible + +**Bear Cub** has a few accessibility upgrades when compared to its predecessors. +The color palette has been overhauled to make sure everything is +[readable](https://web.dev/color-and-contrast-accessibility/) for users with low +vision impairments or color deficiencies, and some interactive elements were +made bigger to facilitate [clicking](https://web.dev/accessible-tap-targets/) +for users with a motor impairment. + +These small changes mean that **Bear Cub** passes Google's [PageSpeed +test](https://pagespeed.web.dev/report?url=https%3A%2F%2Fclente.github.io%2Fhugo-bearcub%2F) +with flying colors. + +![PageSpeed score](https://raw.githubusercontent.com/clente/hugo-bearcub/main/images/pagespeed.webp) + +### Secure + +[**Bear Cub**'s demo](https://clente.github.io/hugo-bearcub/) is hosted on GitHub +and therefore I'm not in control of its [Content Security +Policy](https://infosec.mozilla.org/guidelines/web_security#content-security-policy). +However, the theme itself was made with security in mind: there are no inline +styles and it uses no JavaScript at all. + +If you want to improve your [Mozilla +Observatory](https://observatory.mozilla.org/) score even further, you should be +able to simply add a few headers to your hosting service's configuration (e.g. +[Netlify](https://docs.netlify.com/routing/headers/) or [Cloudflare +Pages](https://developers.cloudflare.com/pages/platform/headers/)) and never +have to think about it again. My `_headers` file, for example, looks like this: + +``` +/* + X-Content-Type-Options: nosniff + Strict-Transport-Security: "max-age=31536000; includeSubDomains; preload" env=HTTPS + Cache-Control: max-age=31536000, public + X-Frame-Options: deny + Referrer-Policy: no-referrer + Feature-Policy: microphone 'none'; payment 'none'; geolocation 'none'; midi 'none'; sync-xhr 'none'; camera 'none'; magnetometer 'none'; gyroscope 'none' + Content-Security-Policy: default-src 'none'; manifest-src 'self'; font-src 'self'; img-src 'self'; style-src 'self'; form-action 'none'; frame-ancestors 'none'; base-uri 'none' + X-XSS-Protection: 1; mode=block +``` + +### Multilingual + +If you need to write a blog that supports more than one language, **Bear Cub** +has you covered! Check out the demo's [`hugo.toml` +file](https://github.com/clente/hugo-bearcub/blob/main/exampleSite/hugo.toml) +for a sample of how you can setup multilingual support. + +By default, the theme creates a translation button that gets disabled when the +current page is only available in any other language. You can also choose to +hide this button (instead of disabling it) by setting `hideUntranslated = +true`. + +### More + +Every once in a while, as I keep using **Bear Cub**, I notice that there is some +functionality missing. Currently, these are the "advanced features" that I have +already implemented: + +- Full-text RSS feed: an enhanced RSS feed template that includes the (properly + encoded) full content of your posts in the feed itself. +- Static content: you can create empty blog entries that act as links to static + files by including `link: "{url}"` in a post's [front + matter](https://gohugo.io/content-management/front-matter/). You can also add + `render: false` to your [build + options](https://gohugo.io/content-management/build-options/#readout) to avoid + rendering blank posts. +- Skip link: a "skip to main content" link that is temporarily invisible, but + can be focused by people who need a keyboard to navigate the web (see [PR + #5](https://github.com/clente/hugo-bearcub/pull/5) by + [@2kool4idkwhat](https://github.com/2kool4idkwhat) for more information). +- Reply by email: if you supply an email address, the theme creates a "Reply to + this post by email" button at the end of every post (see Kev Quirk's [original + implementation](https://kevquirk.com/adding-the-post-title-to-my-reply-by-email-button)). + This button can be suppressed on a case-by-case by setting `hideReply: true` + in a post's [front matter](https://gohugo.io/content-management/front-matter/) + (see [PR #18](https://github.com/clente/hugo-bearcub/pull/18) by + [@chrsmutti](https://github.com/chrsmutti)). +- `absfigure` shortcode: a shortcut to use the `figure` shortcode that also + converts relative URLs into absolute URLs by using the `absURL` function. +- Single-use CSS (EXPERIMENTAL): you can add some styles to a single page by + writing the CSS you need in `assets/{custom_css}.css` and then including + `style: "{custom_css}.css"` in the [front + matter](https://gohugo.io/content-management/front-matter/) of said page. +- Conditional CSS (EXPERIMENTAL): since **Bear Cub** does syntax highlighting + without inline styles (see `hugo.toml` for more information), it only load its + `syntax.css` if, and only if, a code block is actually present in the current + page. +- Alternative "Herman" style (EXPERIMENTAL): if you want to check out a more + modern CSS style, you can change the `themeStyle` parameter to `"herman"` in + order to activate [Herman Martinus's](https://herman.bearblog.dev/) version of + the [Blogster Minimal](https://blogster-minimal.netlify.app/) theme for + [Astro](https://astro.build/). +- Dynamic social card generation (EXPERIMENTAL): if you don't add preview images + to a post, this template will generate one based on the title. You can see an + example below. + +![Social card example](https://raw.githubusercontent.com/clente/hugo-bearcub/main/images/social_card.webp) + +## Configuration + +**Bear Cub** can be customized with a `hugo.toml` file. Check out the +[configuration](https://github.com/clente/hugo-bearcub/blob/main/exampleSite/hugo.toml) +of the [demo](https://clente.github.io/hugo-bearcub/) for more information. + +```toml +# Basic config +baseURL = "https://example.com" +theme = "hugo-bearcub" +copyright = "John Doe (CC BY 4.0)" +defaultContentLanguage = "en" + +# Generate a nice robots.txt for SEO +enableRobotsTXT = true + +# Setup syntax highlighting without inline styles. For more information about +# why you'd want to avoid inline styles, see +# https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy/style-src#unsafe_inline_styles +[markup] + [markup.highlight] + lineNos = true + lineNumbersInTable = false + # This allows Bear Cub to use a variation of Dracula that is more accessible + # to people with poor eyesight. For more information about color contrast + # and accessibility, see https://web.dev/color-and-contrast-accessibility/ + noClasses = false + +# Multilingual mode config. More for information about how to setup translation, +# see https://gohugo.io/content-management/multilingual/ +[languages] + [languages.en] + title = "Bear Cub" + languageName = "en-US 🇺🇸" + LanguageCode = "en-US" + contentDir = "content" + [languages.en.params] + madeWith = "Made with [Bear Cub](https://github.com/clente/hugo-bearcub)" + [languages.pt] + title = "Bear Cub" + languageName = "pt-BR 🇧🇷" + LanguageCode = "pt-BR" + contentDir = "content.pt" + [languages.pt.params] + madeWith = "Feito com [Bear Cub](https://github.com/clente/hugo-bearcub)" + +[params] + # The description of your website + description = "Bear Cub Demo" + + # The path to your favicon + favicon = "images/favicon.png" + + # These images will show up when services want to generate a preview of a link + # to your site. Ignored if `generateSocialCard = true`. For more information + # about previews, see https://gohugo.io/templates/internal#twitter-cards and + # https://gohugo.io/templates/internal#open-graph + images = ["images/share.webp"] + + # This title is used as the site_name on the Hugo's internal opengraph + # structured data template + title = "Bear Cub" + + # Dates are displayed following the format below. For more information about + # formatting, see https://gohugo.io/functions/format/ + dateFormat = "2006-01-02" + + # If your blog is multilingual but you haven't translated a page, this theme + # will create a disabled link. By setting `hideUntranslated` to true, you can + # have the theme simply not show any link + hideUntranslated = false + + # (EXPERIMENTAL) This theme has two options for its CSS styles: "original" and + # "herman". The former is what you see on Bear Cub's demo (an optimized + # version of Hugo Bear Blog), while the latter has a more modern look based on + # Herman Martinus's version of the Blogster Minimal theme for Astro. + themeStyle = "original" + + # (EXPERIMENTAL) This theme is capable of dynamically generating social cards + # for posts that don't have `images` defined in their front matter; By setting + # `generateSocialCard` to false, you can prevent this behavior. For more + # information see layouts/partials/social_card.html + generateSocialCard = true + + # Social media. Delete any item you aren't using to make sure it won't show up + # in your website's metadata. + [params.social] + twitter = "example" # Twitter handle (without '@') + facebook_admin = "0000000000" # Facebook Page Admin ID + + # Author metadata. This is mostly used for the RSS feed of your site, but the + # email is also added to the footer of each post. You can hide the "reply to" + # link by using a `hideReply` param in front matter. + [params.author] + name = "John Doe" # Your name as shown in the RSS feed metadata + email = "me@example.com" # Added to the footer so readers can reply to posts +``` + +## Contributing + +If you come across any problems while using **Bear Cub**, you can file an +[issue](https://github.com/clente/hugo-bearcub/issues) or create a [pull +request](https://github.com/clente/hugo-bearcub/pulls). diff --git a/themes/hugo-bearcub/assets/herman.css b/themes/hugo-bearcub/assets/herman.css new file mode 100644 index 0000000..f2573c3 --- /dev/null +++ b/themes/hugo-bearcub/assets/herman.css @@ -0,0 +1,202 @@ +:root { + font-size: 62.5%; /* 10px */ + --color-dark: #181a20; + --color-light: #fafafa; + --color-primary: #1a8fe3; + --size: 1rem; + --spacing: calc(var(--size) * 2.4); +} + +body { + background: var(--color-dark); + color: var(--color-light); + padding: 4rem; + font-family: Avenir, 'Avenir Next LT Pro', Montserrat, Corbel, 'URW Gothic', + source-sans-pro, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", + "Segoe UI Symbol", "Noto Color Emoji"; + font-size: calc(var(--size) * 1.8); + line-height: 1.5; + min-height: 80vh; + max-width: 1600px; + margin: 0 auto; + word-wrap: break-word; +} + +header, +main, +footer { + max-width: 70ch; + margin-inline: auto; +} + +header { + padding-bottom: var(--spacing); +} + +nav a, a.blog-tags { + margin-right: calc(var(--spacing) / 2); +} +a.blog-tags { + line-height: 2; +} + +main { + padding-bottom: var(--spacing); +} + +footer { + text-align: center; + padding-top: var(--spacing); +} + +a { + color: currentColor; + text-decoration-color: var(--color-primary); + text-decoration-thickness: 0.3ex; + text-underline-offset: 0.3ex; +} + +a:hover { + text-decoration-thickness: 0.4ex; +} + +img { + display: block; + max-width: 100%; + height: auto; +} + +h1, +h2, +h3, +h4 { + font-weight: 700; + line-height: 1.3; +} + +h1 { + font-size: calc(var(--size) * 4.2); +} +h2 { + font-size: calc(var(--size) * 3.4); +} +h3 { + font-size: calc(var(--size) * 2.6); +} +h4 { + font-size: calc(var(--size) * 1.8); +} + +ul, +ol { + padding-inline-start: var(--spacing); +} +li { + margin-block-start: var(--spacing); +} + +blockquote { + padding-inline-start: var(--spacing); + border-inline-start: 0.2em solid; + font-style: italic; + max-width: 50ch; +} + +:is(h1, h2, h3, h4, blockquote) { + margin-block-end: calc(var(--spacing) / 2); +} +:is(h1, h2, h3, h4) + * { + margin-block-start: calc(var(--spacing) / 3); +} +:is(h1, h2, h3, h4) + :where(h2, h3, h4) { + margin-block-start: calc(var(--spacing) * 2); +} + +.title { + text-decoration: none; +} +.title h1 { + font-size: calc(var(--size) * 3.4); + margin-top: calc(var(--spacing) / 2); +} + +ul.blog-posts { + list-style-type: none; + padding: unset; +} +ul.blog-posts li { + display: flex; + flex-direction: column; +} +ul.blog-posts li span { + min-width: 11ch; +} + +p.byline { + opacity: 0.5; +} + +code { + font-family: ui-monospace, 'Cascadia Code', 'Source Code Pro', + Menlo, Consolas, 'DejaVu Sans Mono', monospace; + padding: 2px calc(var(--spacing) / 4); + background-color: #282a36; + font-size: calc(var(--size) * 1.4); +} +pre code { + display: block; + padding: var(--spacing); + overflow-x: auto; + -webkit-text-size-adjust: 100%; + -moz-text-size-adjust: 100%; +} + +table { + width: 100%; +} +table, +th, +td { + border: 1px solid; + border-collapse: collapse; + border-color: var(--color-light); + padding: calc(var(--spacing) / 2); +} + +.disabled { + color: currentColor; + cursor: not-allowed; + opacity: 0.5; +} + +@media screen and (min-width: 600px) { + ul.blog-posts li { + flex-direction: row; + gap: calc(var(--spacing) / 2); + } +} + +/* "Skip to main content" link */ +.skip-link { + position: absolute; + top: 5; + transform: translateY(-600%); + transition: transform 0.5s; + background-color: #181a20; + padding: 6px; +} + +.skip-link:focus { + transform: translateY(0%); +} + +figure { + margin-inline-start: 0em; + margin-inline-end: 0em; +} + +figcaption > p { + margin-block-start: 9px; + text-align: center; + font-style: italic; +} diff --git a/themes/hugo-bearcub/assets/images/social_card_bg.png b/themes/hugo-bearcub/assets/images/social_card_bg.png new file mode 100644 index 0000000000000000000000000000000000000000..857ea631a1f66be042e2be0e50834e281390abef GIT binary patch literal 6698 zcmeAS@N?(olHy`uVBq!ia0y~yV7^nUk#C56lsTcvPQUjyF)=hTc$kE){7 z;3~h6MhJ1(0FE1&_nsU?XD6}dTi#a0!zN?>!XfNYSkzLEl1NlCV?QiN}S zf^&XRs)DJWsh)w79hZVlQA(Oskc%5sGmvMilu=SrV5P5LUS6(OZmgGIl&)`RX=$l% zV5DzkqzhD`TU?n}l31aeSF8*&0%C?sYH@N=WBsGXXk*T{Itv*pj>f~yOV;atFxJ*rJ0$oksibtVANRw^=773x+InWRT&u= z8S5ID=o*=a7#dj_nOFhY2F6yw``*jqs3AhN~zX(i=}MX8SIz-YEr za!gCh1V&M%0x$z*rst&=DHtgj=^5ympz12mNCldR+kg5{*Xe`u9?W?*`WPOt0V_bt ztU!GbF<>D8EKT&`#R-rDFOX96fTd6ou(&yuzM+zVfw3_Y7&RDC!oZ+0v2@~TZzo5Q zcKfXwrwlZdRU&XJOWyrF) z3cB2m65p!1bMER!!OAw{=ddK|9PoM6%v~tg%R1_MWRk5?-F;v^kZhn~OM3>ah=BIxoH%(f7Voi`k@>CYjqA%UEroS@m zEWDU(6eM!y-~YF(<>V#Tg>0{0`0u2_y{d(Y++MDSf7qDxToSw?_fRSL?0LBZFLu8; zy6V|2_Ty}GV#Btc;G2{0^t@T>+M(2wYI(iKAAV(t5?lCIYSuJu+ut{z|B!Qf{V6nj z!*2H4qI(-Z@y2~lfApmJ)JkBz!CBxDSc3Z2iD^)^;1h7+x}^vn6vY|EU3cSv-K5-YOps-1<_2)cz~qCfhmkYierWmNQ^O< z4M-{^oC0xJd?bNnLxUzWkP6L^kbO5VG22WQ%mvv4FO#tv1;*kIV literal 0 HcmV?d00001 diff --git a/themes/hugo-bearcub/assets/images/social_card_fg.png b/themes/hugo-bearcub/assets/images/social_card_fg.png new file mode 100644 index 0000000000000000000000000000000000000000..e005b0a23f2b3122e3937917e42b627bf7dc9fe4 GIT binary patch literal 4656 zcmeHJ{ZkZW9A6v~<*i{-NgQ!!4Th4ty<6b$cJ9FA?mVtIVh)UhCTqES?ruA7_t;&$ z1*aEZs1ZxinW&T+F>NG;N}~jFWS~Yww6yGX#)itI97YGVEE($AJzhoaAGjax_IaMq z=lgk{=lgxW-{;vW4U^Z@~_03MprV^_M4V<_#?W2IR(l`UWdUOK;)1I4w4CC*x( zQ|rQVbE0)32?hK>pit3Y$?&A8$7Ed+wxwYlLuHEK(_;=>5o%;PfMzMPlqxJI8r5+w zH)%Jm9yf+PJ?0gJ0Ey$lU{D#%P_mo{S8KIeTt(mnp@0kpU&9ELs9^Zzl0-R{#y2z@^q8YAZ5(Px*(Ks z8)P*ai#XOzS3-=pTk=q=*{D%#H5vt>49URIky8#$XYE)dZg`C$KYFkN^X#5C_Z6wFSm)u%vCE zVQ6NB1VPevRPQ+TSe{|Q%en1o{i-zVK;7o{{-Fr_ZZsvmVP3{i``ODYu2yxF&Zn1r zv@m+F=GdYeiC=5HOC!w*rXR}_+aK)?ijnwK&z?fz*%JJ1y2OWVKiMyDa)!F-S!M;9O7d9d%0eU#o=TP;aR^>m=+82FCs!KA600aa+kJ>zl_;sxH(vQ!$U4dvEG8UpbfXUGgAS zeEN&z?xC)s&)@s)ho}>Co1S{2y)V9r&AYTI>6;#KGL?Dt#Nds{@1J}?<&ia|A9O`M$6fevByR0B&(FVZ>TiMf#{58j8IK?_4@kcVWLMLJu(920GL(o- z!`~X>x>2ONTfJ~|;@FzK8yhl%(fR|BYxK#)G-7^Jw~TnqmXhv{L@gbzVDJ;IeBTqDERLHME!zX`&xrSQY> co=@iZBlVG*eXZ+zVXh!nbD^m%@0pGN0pBM+NdN!< literal 0 HcmV?d00001 diff --git a/themes/hugo-bearcub/assets/original.css b/themes/hugo-bearcub/assets/original.css new file mode 100644 index 0000000..480cc6a --- /dev/null +++ b/themes/hugo-bearcub/assets/original.css @@ -0,0 +1,180 @@ +body { + font-family: Verdana, sans-serif; + margin: auto; + padding: 20px; + max-width: 720px; + text-align: left; + background-color: #1d1f27; + word-wrap: break-word; + overflow-wrap: break-word; + line-height: 1.5; + color: #c9d1d9; +} + +h1, +h2, +h3, +h4, +h5, +h6, +strong, +b { + color: #eee; +} + +a { + color: #8cc2dd; +} + +.title { + text-decoration: none; + border: 0; +} +.title h1 { + font-size: 24px; + margin: 19.92px 0 19.92px 0; +} + +.title span { + font-weight: 400; +} + +nav a { + margin-right: 10px; +} + +textarea { + background-color: #252525; + color: #ddd; + width: 100%; + font-size: 16px; +} + +input { + background-color: #252525; + color: #ddd; + font-size: 16px; +} + +content { + line-height: 1.6; +} + +table { + width: 100%; +} + +table, +th, +td { + border: 1px solid; + border-collapse: collapse; + border-color: #c9d1d9; + padding: 5px; +} + +img { + max-width: 100%; + height: auto; +} + +code { + padding: 2px 5px; + color: #f8f8f2; + background-color: #282a36; +} + +pre code { + display: block; + padding: 20px; + white-space: pre-wrap; + font-size: 14px; + overflow-x: auto; + text-wrap: nowrap; +} + +blockquote { + border-left: 1px solid #999; + color: #ccc; + padding-left: 20px; + font-style: italic; +} + +footer { + padding: 25px; + text-align: center; +} + +.helptext { + color: #aaa; + font-size: small; +} + +.errorlist { + color: #eba613; + font-size: small; +} + +/* blog posts */ +ul.blog-posts { + list-style-type: none; + padding: unset; +} + +ul.blog-posts li { + display: flex; + margin-bottom: 10px; +} + +ul.blog-posts li span { + flex: 0 0 130px; +} + +ul.blog-posts li a:visited { + color: #8b6fcb; +} + +a.blog-tags { + line-height: 2; + margin-right: 12px; +} + +h3.blog-filter { + margin-bottom: 0; +} + +.disabled { + color: currentColor; + cursor: not-allowed; + opacity: 0.7; +} + +p.byline { + font-style: italic; +} + +/* "Skip to main content" link */ +.skip-link { + position: absolute; + top: 5; + transform: translateY(-600%); + transition: transform 0.5s; + background-color: #1d1f27; + padding: 6px; +} + +.skip-link:focus { + transform: translateY(0%); +} + +figure { + margin-inline-start: 0em; + margin-inline-end: 0em; +} + +figcaption > p { + margin-block-start: 0px; + text-align: center; + font-style: italic; + color: #ccc; +} diff --git a/themes/hugo-bearcub/assets/syntax.css b/themes/hugo-bearcub/assets/syntax.css new file mode 100644 index 0000000..a28d967 --- /dev/null +++ b/themes/hugo-bearcub/assets/syntax.css @@ -0,0 +1,91 @@ +/* This style is a variant of Dracula that is more accessible to people with poor eyesight */ +/* See https://web.dev/color-and-contrast-accessibility/ */ +/* And https://xyproto.github.io/splash/docs/dracula.html */ +/* And https://github.com/alecthomas/chroma/blob/a40c95e447a577322e20eac58f2f7c0d026665b0/styles/dracula.xml */ + +/* Background */ .bg { color: #f8f8f2; background-color: #282a36; } +/* PreWrapper */ .chroma { color: #f8f8f2; background-color: #282a36; } +/* Other .chroma .x { } */ +/* Error .chroma .err { } */ +/* CodeLine .chroma .cl { } */ +/* LineLink */ .chroma .lnlinks { outline: none; text-decoration: none; color: inherit } +/* LineTableTD */ .chroma .lntd { vertical-align: top; padding: 0; margin: 0; border: 0; } +/* LineTable */ .chroma .lntable { border-spacing: 0; padding: 0; margin: 0; border: 0; } +/* LineHighlight */ .chroma .hl { background-color: #ffffcc } +/* LineNumbersTable */ .chroma .lnt { white-space: pre; user-select: none; margin-right: 0.4em; padding: 0 0.4em 0 0.4em;color: #929292 } +/* LineNumbers */ .chroma .ln { white-space: pre; user-select: none; margin-right: 0.4em; padding: 0 0.4em 0 0.4em;color: #929292 } +/* Line */ .chroma .line { display: flex; } +/* Keyword */ .chroma .k { color: #ff79c6 } +/* KeywordConstant */ .chroma .kc { color: #ff79c6 } +/* KeywordDeclaration */ .chroma .kd { color: #8be9fd; font-style: italic } +/* KeywordNamespace */ .chroma .kn { color: #ff79c6 } +/* KeywordPseudo */ .chroma .kp { color: #ff79c6 } +/* KeywordReserved */ .chroma .kr { color: #ff79c6 } +/* KeywordType */ .chroma .kt { color: #8be9fd } +/* Name .chroma .n { } */ +/* NameAttribute */ .chroma .na { color: #50fa7b } +/* NameBuiltin */ .chroma .nb { color: #8be9fd; font-style: italic } +/* NameBuiltinPseudo .chroma .bp { } */ +/* NameClass */ .chroma .nc { color: #50fa7b } +/* NameConstant .chroma .no { } */ +/* NameDecorator .chroma .nd { } */ +/* NameEntity .chroma .ni { } */ +/* NameException .chroma .ne { } */ +/* NameFunction */ .chroma .nf { color: #50fa7b } +/* NameFunctionMagic .chroma .fm { } */ +/* NameLabel */ .chroma .nl { color: #8be9fd; font-style: italic } +/* NameNamespace .chroma .nn { } */ +/* NameOther .chroma .nx { } */ +/* NameProperty .chroma .py { } */ +/* NameTag */ .chroma .nt { color: #ff79c6 } +/* NameVariable */ .chroma .nv { color: #8be9fd; font-style: italic } +/* NameVariableClass */ .chroma .vc { color: #8be9fd; font-style: italic } +/* NameVariableGlobal */ .chroma .vg { color: #8be9fd; font-style: italic } +/* NameVariableInstance */ .chroma .vi { color: #8be9fd; font-style: italic } +/* NameVariableMagic .chroma .vm { } */ +/* Literal .chroma .l { } */ +/* LiteralDate .chroma .ld { } */ +/* LiteralString */ .chroma .s { color: #f1fa8c } +/* LiteralStringAffix */ .chroma .sa { color: #f1fa8c } +/* LiteralStringBacktick */ .chroma .sb { color: #f1fa8c } +/* LiteralStringChar */ .chroma .sc { color: #f1fa8c } +/* LiteralStringDelimiter */ .chroma .dl { color: #f1fa8c } +/* LiteralStringDoc */ .chroma .sd { color: #f1fa8c } +/* LiteralStringDouble */ .chroma .s2 { color: #f1fa8c } +/* LiteralStringEscape */ .chroma .se { color: #f1fa8c } +/* LiteralStringHeredoc */ .chroma .sh { color: #f1fa8c } +/* LiteralStringInterpol */ .chroma .si { color: #f1fa8c } +/* LiteralStringOther */ .chroma .sx { color: #f1fa8c } +/* LiteralStringRegex */ .chroma .sr { color: #f1fa8c } +/* LiteralStringSingle */ .chroma .s1 { color: #f1fa8c } +/* LiteralStringSymbol */ .chroma .ss { color: #f1fa8c } +/* LiteralNumber */ .chroma .m { color: #bd93f9 } +/* LiteralNumberBin */ .chroma .mb { color: #bd93f9 } +/* LiteralNumberFloat */ .chroma .mf { color: #bd93f9 } +/* LiteralNumberHex */ .chroma .mh { color: #bd93f9 } +/* LiteralNumberInteger */ .chroma .mi { color: #bd93f9 } +/* LiteralNumberIntegerLong */ .chroma .il { color: #bd93f9 } +/* LiteralNumberOct */ .chroma .mo { color: #bd93f9 } +/* Operator */ .chroma .o { color: #ff79c6 } +/* OperatorWord */ .chroma .ow { color: #ff79c6 } +/* Punctuation .chroma .p { } */ +/* Comment */ .chroma .c { color: #8491b8 } +/* CommentHashbang */ .chroma .ch { color: #8491b8 } +/* CommentMultiline */ .chroma .cm { color: #8491b8 } +/* CommentSingle */ .chroma .c1 { color: #8491b8 } +/* CommentSpecial */ .chroma .cs { color: #8491b8 } +/* CommentPreproc */ .chroma .cp { color: #ff79c6 } +/* CommentPreprocFile */ .chroma .cpf { color: #ff79c6 } +/* Generic .chroma .g { } */ +/* GenericDeleted */ .chroma .gd { color: #ff5555 } +/* GenericEmph */ .chroma .ge { text-decoration: underline } +/* GenericError .chroma .gr { } */ +/* GenericHeading */ .chroma .gh { font-weight: bold } +/* GenericInserted */ .chroma .gi { color: #50fa7b; font-weight: bold } +/* GenericOutput */ .chroma .go { color: #44475a } +/* GenericPrompt .chroma .gp { } */ +/* GenericStrong .chroma .gs { } */ +/* GenericSubheading */ .chroma .gu { font-weight: bold } +/* GenericTraceback .chroma .gt { } */ +/* GenericUnderline */ .chroma .gl { text-decoration: underline } +/* TextWhitespace .chroma .w { } */ diff --git a/themes/hugo-bearcub/exampleSite/content.pt/_index.md b/themes/hugo-bearcub/exampleSite/content.pt/_index.md new file mode 100644 index 0000000..4cf0d7e --- /dev/null +++ b/themes/hugo-bearcub/exampleSite/content.pt/_index.md @@ -0,0 +1,35 @@ +--- +title: "Início" +menu: "main" +weight: 1 +--- + +# ᕦʕ •ᴥ•ʔᕤ Bear Cub + +Os sites de hoje em dia são pesados, lentos e cheios de scripts, propagandas e +rastreadores. Isso ficou tão comum que nós perdemos toda a perspectiva, tanto +que achamos normal uma página web ter vários megabytes. + +> The internet has become a bloated mess. Huge JavaScript libraries, countless +> client-side queries and overly complex frontend frameworks are par for the +> course these days. +> +> --- [Kev Quirk](https://512kb.club/) + +Vamos mudar isso, um site de cada vez! **Bear Cub** é um tema +[Hugo](https://gohugo.io/) baseado no [Hugo +Bear](https://github.com/janraasch/hugo-bearblog/) que toma conta da velocidade +e otimização para que você possa focar em escrever bons textos. + +Ele é gratuito, multilíngue, otimizado para buscadores, simples, responsivo, +leve e rápido. Muito rápido. + +Quando comparado ao seu predecessor, o **Bear Cub** tem alguns upgrades de +[privacidade](https://themarkup.org/blacklight?url=clente.github.io/hugo-bearcub/) +e +[acessibilidade](https://pagespeed.web.dev/report?url=https%3A%2F%2Fclente.github.io%2Fhugo-bearcub%2F). +Ele também é compatível com as práticas mais modernas de +[segurança](https://github.com/clente/hugo-bearcub#secure) para que seus +usuários possam aproveitar seu site sem medo. + +Feito com 💟 por [Caio lente](https://lente.dev). diff --git a/themes/hugo-bearcub/exampleSite/content.pt/blog/_index.md b/themes/hugo-bearcub/exampleSite/content.pt/blog/_index.md new file mode 100644 index 0000000..7588ac1 --- /dev/null +++ b/themes/hugo-bearcub/exampleSite/content.pt/blog/_index.md @@ -0,0 +1,5 @@ +--- +title: "Blog" +menu: "main" +weight: 2 +--- \ No newline at end of file diff --git a/themes/hugo-bearcub/exampleSite/content/_index.md b/themes/hugo-bearcub/exampleSite/content/_index.md new file mode 100644 index 0000000..10c388f --- /dev/null +++ b/themes/hugo-bearcub/exampleSite/content/_index.md @@ -0,0 +1,35 @@ +--- +title: "Home" +menu: "main" +weight: 1 +--- + +# ᕦʕ •ᴥ•ʔᕤ Bear Cub + +Today's websites are bloated, slow, and full of scripts, ads, and trackers. This +became so commonplace that we lost all sense of perspective, to the point that +we now think multi-megabyte webpages are normal. + +> The internet has become a bloated mess. Huge JavaScript libraries, countless +> client-side queries and overly complex frontend frameworks are par for the +> course these days. +> +> --- [Kev Quirk](https://512kb.club/) + +Let's change this, one website at a time! **Bear Cub** is a +[Hugo](https://gohugo.io/) theme based on [Hugo +Bear](https://github.com/janraasch/hugo-bearblog/) that takes care of speed and +optimization, so you can focus on writing good content. + +It is free, multilingual, optimized for search engines, no-nonsense, responsive, +light, and fast. Really fast. + +When compared to its predecessor, **Bear Cub** has a few +[privacy](https://themarkup.org/blacklight?url=clente.github.io/hugo-bearcub/) +and +[accessibility](https://pagespeed.web.dev/report?url=https%3A%2F%2Fclente.github.io%2Fhugo-bearcub%2F) +upgrades. It's also compatible with modern +[security](https://github.com/clente/hugo-bearcub#secure) standards, so your +users don't have to worry about browsing your website. + +Made with 💟 by [Caio lente](https://lente.dev/en). diff --git a/themes/hugo-bearcub/exampleSite/content/blog/_index.md b/themes/hugo-bearcub/exampleSite/content/blog/_index.md new file mode 100644 index 0000000..7588ac1 --- /dev/null +++ b/themes/hugo-bearcub/exampleSite/content/blog/_index.md @@ -0,0 +1,5 @@ +--- +title: "Blog" +menu: "main" +weight: 2 +--- \ No newline at end of file diff --git a/themes/hugo-bearcub/exampleSite/content/blog/emoji-support.md b/themes/hugo-bearcub/exampleSite/content/blog/emoji-support.md new file mode 100644 index 0000000..f17f49a --- /dev/null +++ b/themes/hugo-bearcub/exampleSite/content/blog/emoji-support.md @@ -0,0 +1,46 @@ ++++ +author = "Hugo Authors" +title = "Emoji Support" +date = "2019-03-05" +description = "Guide to emoji usage in Hugo" +tags = [ + "emoji", +] ++++ + +Emoji can be enabled in a Hugo project in a number of ways. + +The [`emojify`](https://gohugo.io/functions/emojify/) function can be called directly in templates or [Inline Shortcodes](https://gohugo.io/templates/shortcode-templates/#inline-shortcodes). + +To enable emoji globally, set `enableEmoji` to `true` in your site's [configuration](https://gohugo.io/getting-started/configuration/) and then you can type emoji shorthand codes directly in content files; e.g. + +

🙈 :see_no_evil: 🙉 :hear_no_evil: 🙊 :speak_no_evil:

+
+ +The [Emoji cheat sheet](http://www.emoji-cheat-sheet.com/) is a useful reference for emoji shorthand codes. + +*** + +**N.B.** The above steps enable Unicode Standard emoji characters and sequences in Hugo, however the rendering of these glyphs depends on the browser and the platform. To style the emoji you can either use a third party emoji font or a font stack; e.g. + +{{< highlight html >}} +.emoji { + font-family: Apple Color Emoji, Segoe UI Emoji, NotoColorEmoji, Segoe UI Symbol, Android Emoji, EmojiSymbols; +} +{{< /highlight >}} + +{{< css.inline >}} + +{{< /css.inline >}} diff --git a/themes/hugo-bearcub/exampleSite/content/blog/markdown-syntax.md b/themes/hugo-bearcub/exampleSite/content/blog/markdown-syntax.md new file mode 100644 index 0000000..06990d7 --- /dev/null +++ b/themes/hugo-bearcub/exampleSite/content/blog/markdown-syntax.md @@ -0,0 +1,148 @@ ++++ +author = "Hugo Authors" +title = "Markdown Syntax Guide" +date = "2019-03-11" +description = "Sample article showcasing basic Markdown syntax and formatting for HTML elements." +tags = [ + "markdown", + "css", + "html", +] +categories = [ + "themes", + "syntax", +] +series = ["Themes Guide"] +aliases = ["migrate-from-jekyl"] ++++ + +This article offers a sample of basic Markdown syntax that can be used in Hugo content files, also it shows whether basic HTML elements are decorated with CSS in a Hugo theme. + + +## Headings + +The following HTML `

`—`

` elements represent six levels of section headings. `

` is the highest section level while `

` is the lowest. + +# H1 +## H2 +### H3 +#### H4 +##### H5 +###### H6 + +## Paragraph + +Xerum, quo qui aut unt expliquam qui dolut labo. Aque venitatiusda cum, voluptionse latur sitiae dolessi aut parist aut dollo enim qui voluptate ma dolestendit peritin re plis aut quas inctum laceat est volestemque commosa as cus endigna tectur, offic to cor sequas etum rerum idem sintibus eiur? Quianimin porecus evelectur, cum que nis nust voloribus ratem aut omnimi, sitatur? Quiatem. Nam, omnis sum am facea corem alique molestrunt et eos evelece arcillit ut aut eos eos nus, sin conecerem erum fuga. Ri oditatquam, ad quibus unda veliamenimin cusam et facea ipsamus es exerum sitate dolores editium rerore eost, temped molorro ratiae volorro te reribus dolorer sperchicium faceata tiustia prat. + +Itatur? Quiatae cullecum rem ent aut odis in re eossequodi nonsequ idebis ne sapicia is sinveli squiatum, core et que aut hariosam ex eat. + +## Blockquotes + +The blockquote element represents content that is quoted from another source, optionally with a citation which must be within a `footer` or `cite` element, and optionally with in-line changes such as annotations and abbreviations. + +#### Blockquote without attribution + +> Tiam, ad mint andaepu dandae nostion secatur sequo quae. +> **Note** that you can use *Markdown syntax* within a blockquote. + +#### Blockquote with attribution + +> Don't communicate by sharing memory, share memory by communicating.
+> — Rob Pike[^1] + +[^1]: The above quote is excerpted from Rob Pike's [talk](https://www.youtube.com/watch?v=PAAkCSZUG1c) during Gopherfest, November 18, 2015. + +## Tables + +Tables aren't part of the core Markdown spec, but Hugo supports supports them out-of-the-box. + + Name | Age +--------|------ + Bob | 27 + Alice | 23 + +#### Inline Markdown within tables + +| Italics | Bold | Code | +| -------- | -------- | ------ | +| *italics* | **bold** | `code` | + +## Code Blocks + +#### Code block with backticks + +```html + + + + + Example HTML5 Document + + +

Test

+ + +``` + +#### Code block indented with four spaces + + + + + + Example HTML5 Document + + +

Test

+ + + +#### Code block with Hugo's internal highlight shortcode +{{< highlight html >}} + + + + + Example HTML5 Document + + +

Test

+ + +{{< /highlight >}} + +## List Types + +#### Ordered List + +1. First item +2. Second item +3. Third item + +#### Unordered List + +* List item +* Another item +* And another item + +#### Nested list + +* Fruit + * Apple + * Orange + * Banana +* Dairy + * Milk + * Cheese + +## Other Elements — abbr, sub, sup, kbd, mark + +GIF is a bitmap image format. + +H2O + +Xn + Yn = Zn + +Press CTRL+ALT+Delete to end the session. + +Most salamanders are nocturnal, and hunt for insects, worms, and other small creatures. diff --git a/themes/hugo-bearcub/exampleSite/content/blog/math-typesetting.md b/themes/hugo-bearcub/exampleSite/content/blog/math-typesetting.md new file mode 100644 index 0000000..62831a9 --- /dev/null +++ b/themes/hugo-bearcub/exampleSite/content/blog/math-typesetting.md @@ -0,0 +1,49 @@ +--- +author: Hugo Authors +title: Math Typesetting +date: 2019-03-08 +description: A brief guide to setup KaTeX +math: true +--- + +Mathematical notation in a Hugo project can be enabled by using third party JavaScript libraries. + + +In this example we will be using [KaTeX](https://katex.org/) + +- Create a partial under `/layouts/partials/math.html` +- Within this partial reference the [Auto-render Extension](https://katex.org/docs/autorender.html) or host these scripts locally. +- Include the partial in your templates like so: + +```bash +{{ if or .Params.math .Site.Params.math }} +{{ partial "math.html" . }} +{{ end }} +``` + +- To enable KaTex globally set the parameter `math` to `true` in a project's configuration +- To enable KaTex on a per page basis include the parameter `math: true` in content files + +**Note:** Use the online reference of [Supported TeX Functions](https://katex.org/docs/supported.html) + +{{< math.inline >}} +{{ if or .Page.Params.math .Site.Params.math }} + + + + +{{ end }} +{{}} + +### Examples + +{{< math.inline >}} +

+Inline math: \(\varphi = \dfrac{1+\sqrt5}{2}= 1.6180339887…\) +

+{{}} + +Block math: +$$ + \varphi = 1+\frac{1} {1+\frac{1} {1+\frac{1} {1+\cdots} } } +$$ diff --git a/themes/hugo-bearcub/exampleSite/content/blog/placeholder-text.md b/themes/hugo-bearcub/exampleSite/content/blog/placeholder-text.md new file mode 100644 index 0000000..9ed5f69 --- /dev/null +++ b/themes/hugo-bearcub/exampleSite/content/blog/placeholder-text.md @@ -0,0 +1,45 @@ ++++ +author = "Hugo Authors" +title = "Placeholder Text" +date = "2019-03-09" +description = "Lorem Ipsum Dolor Si Amet" +tags = [ + "markdown", + "text", +] ++++ + +Lorem est tota propiore conpellat pectoribus de pectora summo. Redit teque digerit hominumque toris verebor lumina non cervice subde tollit usus habet Arctonque, furores quas nec ferunt. Quoque montibus nunc caluere tempus inhospita parcite confusaque translucet patri vestro qui optatis lumine cognoscere flos nubis! Fronde ipsamque patulos Dryopen deorum. + +1. Exierant elisi ambit vivere dedere +2. Duce pollice +3. Eris modo +4. Spargitque ferrea quos palude + +Rursus nulli murmur; hastile inridet ut ab gravi sententia! Nomine potitus silentia flumen, sustinet placuit petis in dilapsa erat sunt. Atria tractus malis. + +1. Comas hunc haec pietate fetum procerum dixit +2. Post torum vates letum Tiresia +3. Flumen querellas +4. Arcanaque montibus omnes +5. Quidem et + +# Vagus elidunt + + + +[The Van de Graaf Canon](https://en.wikipedia.org/wiki/Canons_of_page_construction#Van_de_Graaf_canon) + +## Mane refeci capiebant unda mulcebat + +Victa caducifer, malo vulnere contra dicere aurato, ludit regale, voca! Retorsit colit est profanae esse virescere furit nec; iaculi matertera et visa est, viribus. Divesque creatis, tecta novat collumque vulnus est, parvas. **Faces illo pepulere** tempus adest. Tendit flamma, ab opes virum sustinet, sidus sequendo urbis. + +Iubar proles corpore raptos vero auctor imperium; sed et huic: manus caeli Lelegas tu lux. Verbis obstitit intus oblectamina fixis linguisque ausus sperare Echionides cornuaque tenent clausit possit. Omnia putatur. Praeteritae refert ausus; ferebant e primus lora nutat, vici quae mea ipse. Et iter nil spectatae vulnus haerentia iuste et exercebat, sui et. + +Eurytus Hector, materna ipsumque ut Politen, nec, nate, ignari, vernum cohaesit sequitur. Vel **mitis temploque** vocatus, inque alis, *oculos nomen* non silvis corpore coniunx ne displicet illa. Crescunt non unus, vidit visa quantum inmiti flumina mortis facto sic: undique a alios vincula sunt iactata abdita! Suspenderat ego fuit tendit: luna, ante urbem Propoetides **parte**. + +{{< css.inline >}} + +{{< /css.inline >}} diff --git a/themes/hugo-bearcub/exampleSite/content/blog/rich-content.md b/themes/hugo-bearcub/exampleSite/content/blog/rich-content.md new file mode 100644 index 0000000..3c406af --- /dev/null +++ b/themes/hugo-bearcub/exampleSite/content/blog/rich-content.md @@ -0,0 +1,34 @@ ++++ +author = "Hugo Authors" +title = "Rich Content" +date = "2019-03-10" +description = "A brief description of Hugo Shortcodes" +tags = [ + "shortcodes", + "privacy", +] ++++ + +Hugo ships with several [Built-in Shortcodes](https://gohugo.io/content-management/shortcodes/#use-hugos-built-in-shortcodes) for rich content, along with a [Privacy Config](https://gohugo.io/about/hugo-and-gdpr/) and a set of Simple Shortcodes that enable static and no-JS versions of various social media embeds. + +--- + +## YouTube Privacy Enhanced Shortcode + +{{< youtube ZJthWmvUzzc >}} + +
+ +--- + +## Twitter Simple Shortcode + +{{< x user="DesignReviewed" id="1085870671291310081" >}} + +
+ +--- + +## Vimeo Simple Shortcode + +{{< vimeo_simple 48912912 >}} diff --git a/themes/hugo-bearcub/exampleSite/hugo.toml b/themes/hugo-bearcub/exampleSite/hugo.toml new file mode 100644 index 0000000..04690c0 --- /dev/null +++ b/themes/hugo-bearcub/exampleSite/hugo.toml @@ -0,0 +1,89 @@ +# Basic config +baseURL = "https://example.com" +theme = "hugo-bearcub" +copyright = "John Doe (CC BY 4.0)" +defaultContentLanguage = "en" + +# Generate a nice robots.txt for SEO +enableRobotsTXT = true + +# Setup syntax highlighting without inline styles. For more information about +# why you'd want to avoid inline styles, see +# https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy/style-src#unsafe_inline_styles +[markup] + [markup.highlight] + lineNos = true + lineNumbersInTable = false + # This allows Bear Cub to use a variation of Dracula that is more accessible + # to people with poor eyesight. For more information about color contrast + # and accessibility, see https://web.dev/color-and-contrast-accessibility/ + noClasses = false + +# Multilingual mode config. More for information about how to setup translation, +# see https://gohugo.io/content-management/multilingual/ +[languages] + [languages.en] + title = "Bear Cub" + languageName = "en-US 🇺🇸" + LanguageCode = "en-US" + contentDir = "content" + [languages.en.params] + madeWith = "Made with [Bear Cub](https://github.com/clente/hugo-bearcub)" + [languages.pt] + title = "Bear Cub" + languageName = "pt-BR 🇧🇷" + LanguageCode = "pt-BR" + contentDir = "content.pt" + [languages.pt.params] + madeWith = "Feito com [Bear Cub](https://github.com/clente/hugo-bearcub)" + +[params] + # The description of your website + description = "Bear Cub Demo" + + # The path to your favicon + favicon = "images/favicon.png" + + # These images will show up when services want to generate a preview of a link + # to your site. Ignored if `generateSocialCard = true`. For more information + # about previews, see https://gohugo.io/templates/internal#twitter-cards and + # https://gohugo.io/templates/internal#open-graph + images = ["images/share.webp"] + + # This title is used as the site_name on the Hugo's internal opengraph + # structured data template + title = "Bear Cub" + + # Dates are displayed following the format below. For more information about + # formatting, see https://gohugo.io/functions/format/ + dateFormat = "2006-01-02" + + # If your blog is multilingual but you haven't translated a page, this theme + # will create a disabled link. By setting `hideUntranslated` to true, you can + # have the theme simply not show any link + hideUntranslated = false + + # (EXPERIMENTAL) This theme has two options for its CSS styles: "original" and + # "herman". The former is what you see on Bear Cub's demo (an optimized + # version of Hugo Bear Blog), while the latter has a more modern look based on + # Herman Martinus's version of the Blogster Minimal theme for Astro. + themeStyle = "original" + + # (EXPERIMENTAL) This theme is capable of dynamically generating social cards + # for posts that don't have `images` defined in their front matter; By setting + # `generateSocialCard` to false, you can prevent this behavior. For more + # information see layouts/partials/social_card.html + generateSocialCard = true + + # Social media. Delete any item you aren't using to make sure it won't show up + # in your website's metadata. + [params.social] + twitter = "example" # Twitter handle (without '@') + facebook_admin = "0000000000" # Facebook Page Admin ID + + # Author metadata. This is mostly used for the RSS feed of your site, but the + # email is also added to the footer of each post. You can hide the "reply to" + # link by using a `hideReply` param in front matter. + [params.author] + name = "John Doe" # Your name as shown in the RSS feed metadata + email = "me@example.com" # Added to the footer so readers can reply to posts diff --git a/themes/hugo-bearcub/exampleSite/static/images/favicon.png b/themes/hugo-bearcub/exampleSite/static/images/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..c3ab3b9bd6b37551170e7a7f4401b87cf0173176 GIT binary patch literal 126 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzS5FtmkO=p;7dG-TDDW^lroS~g z5@C#|c!Iw!Z+XYQ&rM=m~v1_mY$Wa2=6Bm2GcJ_V7gN{v7R O89ZJ6T-G@yGywo7^CUk2 literal 0 HcmV?d00001 diff --git a/themes/hugo-bearcub/exampleSite/static/images/share.webp b/themes/hugo-bearcub/exampleSite/static/images/share.webp new file mode 100644 index 0000000000000000000000000000000000000000..e1902392f94adcf0462249145837046059dcab46 GIT binary patch literal 7490 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 literal 0 HcmV?d00001 diff --git a/themes/hugo-bearcub/i18n/de.toml b/themes/hugo-bearcub/i18n/de.toml new file mode 100644 index 0000000..c8216d1 --- /dev/null +++ b/themes/hugo-bearcub/i18n/de.toml @@ -0,0 +1,14 @@ +[filtering-for] + other = "Filtern nach" + +[no-posts] + other = "Noch keine Beträge" + +[email-subject] + other = "Antwort auf " + +[email-reply] + other = "Auf diesen Beitrag per Email antworten " + +[skip-link] + other = "Zum Hauptinhalt" diff --git a/themes/hugo-bearcub/i18n/en.toml b/themes/hugo-bearcub/i18n/en.toml new file mode 100644 index 0000000..15a8569 --- /dev/null +++ b/themes/hugo-bearcub/i18n/en.toml @@ -0,0 +1,14 @@ +[filtering-for] + other = "Filtering for" + +[no-posts] + other = "No posts yet" + +[email-subject] + other = "Reply to " + +[email-reply] + other = "Reply to this post by email" + +[skip-link] + other = "Skip to main content" \ No newline at end of file diff --git a/themes/hugo-bearcub/i18n/ko.toml b/themes/hugo-bearcub/i18n/ko.toml new file mode 100644 index 0000000..35ac56e --- /dev/null +++ b/themes/hugo-bearcub/i18n/ko.toml @@ -0,0 +1,14 @@ +[filtering-for] + other = "태그 검색:" + +[no-posts] + other = "아직 작성된 게시물이 없습니다!" + +[email-subject] + other = "댓글: " + +[email-reply] + other = "이메일로 댓글 달기" + +[skip-link] + other = "본문으로 바로 가기" diff --git a/themes/hugo-bearcub/i18n/pt.toml b/themes/hugo-bearcub/i18n/pt.toml new file mode 100644 index 0000000..ad228ab --- /dev/null +++ b/themes/hugo-bearcub/i18n/pt.toml @@ -0,0 +1,14 @@ +[filtering-for] + other = "Filtrando para" + +[no-posts] + other = "Nenhum post ainda" + +[email-subject] + other = "Resposta a " + +[email-reply] + other = "Responda a este post por email" + +[skip-link] + other = "Pular para conteúdo principal" \ No newline at end of file diff --git a/themes/hugo-bearcub/i18n/tr.toml b/themes/hugo-bearcub/i18n/tr.toml new file mode 100644 index 0000000..a761585 --- /dev/null +++ b/themes/hugo-bearcub/i18n/tr.toml @@ -0,0 +1,14 @@ +[filtering-for] + other = "Filtrelenilen etiket" + +[no-posts] + other = "Henüz gönderi yok" + +[email-subject] + other = "Şu gönderiye yanıt: " + +[email-reply] + other = "Bu gönderiye eposta ile yanıt ver" + +[skip-link] + other = "Ana içeriğe geç" diff --git a/themes/hugo-bearcub/layouts/404.html b/themes/hugo-bearcub/layouts/404.html new file mode 100644 index 0000000..c6b3dfd --- /dev/null +++ b/themes/hugo-bearcub/layouts/404.html @@ -0,0 +1,6 @@ +{{ define "title" }}404{{ end }} + +{{ define "main" }} +

404

+

ʕノ•ᴥ•ʔノ ︵ ┻━┻

+{{ end }} diff --git a/themes/hugo-bearcub/layouts/_default/_markup/render-codeblock.html b/themes/hugo-bearcub/layouts/_default/_markup/render-codeblock.html new file mode 100644 index 0000000..6e1a075 --- /dev/null +++ b/themes/hugo-bearcub/layouts/_default/_markup/render-codeblock.html @@ -0,0 +1,6 @@ + +{{ .Page.Store.Set "hasCodeBlock" true }} + + +{{ $result := transform.HighlightCodeBlock . }} +{{ $result.Wrapped }} \ No newline at end of file diff --git a/themes/hugo-bearcub/layouts/_default/baseof.html b/themes/hugo-bearcub/layouts/_default/baseof.html new file mode 100644 index 0000000..294749a --- /dev/null +++ b/themes/hugo-bearcub/layouts/_default/baseof.html @@ -0,0 +1,54 @@ + + + + + + + + {{- partial "favicon.html" . -}} + {{- block "title" . }}{{ with .Title }}{{ . }} | {{ end }}{{ .Site.Title }}{{- end }} + + {{- partial "seo_tags.html" . -}} + + + {{ $style := print (default "original" .Site.Params.themeStyle) ".css" | resources.Get | minify }} + + + {{ if (.Page.Store.Get "hasCodeBlock") }} + {{ $syntax := resources.Get "syntax.css" | minify }} + + {{ end }} + + {{ with .Params.style }} + {{ $extra := resources.Get . | minify }} + + {{ end }} + + {{ with .OutputFormats.Get "rss" -}} + {{ printf `` .Rel .MediaType.Type .Permalink $.Site.Title | safeHTML }} + {{ end -}} + + + {{- partial "custom_head.html" . -}} + + + +
+ {{- partial "header.html" . -}} +
+
+ {{- block "main" . }}{{- end }} +
+
+ {{- partial "footer.html" . -}} +
+ + + {{- partial "custom_body.html" . -}} + + + diff --git a/themes/hugo-bearcub/layouts/_default/list.html b/themes/hugo-bearcub/layouts/_default/list.html new file mode 100644 index 0000000..e6cc177 --- /dev/null +++ b/themes/hugo-bearcub/layouts/_default/list.html @@ -0,0 +1,36 @@ +{{ define "main" }} + + {{ if .Data.Singular }} +

{{ i18n "filtering-for" }} "{{ .Title }}"

+ {{ end }} +
    + {{ range .Pages }} +
  • + + + + + + {{ if .Params.link }} + {{ .Title }} ↪ + {{ else }} + {{ .Title }} + {{ end }} +
  • + {{ else }} +
  • + {{ i18n "no-posts" }} +
  • + {{ end }} +
+ {{ if not .Data.Singular }} +
+ {{ range .Site.Taxonomies.tags }} + #{{ lower .Page.Title }} + {{ end }} +
+ {{ end }} +
+{{ end }} diff --git a/themes/hugo-bearcub/layouts/_default/rss.xml b/themes/hugo-bearcub/layouts/_default/rss.xml new file mode 100644 index 0000000..70d1193 --- /dev/null +++ b/themes/hugo-bearcub/layouts/_default/rss.xml @@ -0,0 +1,72 @@ +{{- /* Deprecate site.Author.email in favor of site.Params.author.email */}} +{{- $authorEmail := "" }} +{{- with site.Params.author }} + {{- if reflect.IsMap . }} + {{- with .email }} + {{- $authorEmail = . }} + {{- end }} + {{- end }} +{{- else }} + {{- with site.Author.email }} + {{- $authorEmail = . }} + {{- warnf "The author key in site configuration is deprecated. Use params.author.email instead." }} + {{- end }} +{{- end }} + +{{- /* Deprecate site.Author.name in favor of site.Params.author.name */}} +{{- $authorName := "" }} +{{- with site.Params.author }} + {{- if reflect.IsMap . }} + {{- with .name }} + {{- $authorName = . }} + {{- end }} + {{- else }} + {{- $authorName = . }} + {{- end }} +{{- else }} + {{- with site.Author.name }} + {{- $authorName = . }} + {{- warnf "The author key in site configuration is deprecated. Use params.author.name instead." }} + {{- end }} +{{- end }} + +{{- $pctx := . }} +{{- if .IsHome }}{{ $pctx = .Site }}{{ end }} +{{- $pages := slice }} +{{- if or $.IsHome $.IsSection }} +{{- $pages = $pctx.RegularPages }} +{{- else }} +{{- $pages = $pctx.Pages }} +{{- end }} +{{- $limit := .Site.Config.Services.RSS.Limit }} +{{- if ge $limit 1 }} +{{- $pages = $pages | first $limit }} +{{- end }} +{{- printf "" | safeHTML }} + + + {{ if .IsHome }}{{ .Site.Title }}{{ else }}{{ with .Title }}{{ . }} on {{ end }}{{ .Site.Title }}{{ end }} + {{ .Permalink }} + Recent content {{ if not .IsHome }}{{ with .Title }}in {{ . }} {{ end }}{{ end }}on {{ .Site.Title }} + Hugo -- gohugo.io + {{ site.Language.LanguageCode }}{{ with $authorEmail }} + {{.}}{{ with $authorName }} ({{ . }}){{ end }}{{ end }}{{ with $authorEmail }} + {{ . }}{{ with $authorName }} ({{ . }}){{ end }}{{ end }}{{ with .Site.Copyright }} + {{ . }}{{ end }}{{ if not .Date.IsZero }} + {{ .Date.Format "Mon, 02 Jan 2006 15:04:05 -0700" | safeHTML }}{{ end }} + {{- with .OutputFormats.Get "RSS" }} + {{ printf "" .Permalink .MediaType | safeHTML }} + {{- end }} + {{- range $pages }} + + {{ .Title }} + {{ .Permalink }} + {{ .Date.Format "Mon, 02 Jan 2006 15:04:05 -0700" | safeHTML }} + {{- with $authorEmail }}{{ . }}{{ with $authorName }} ({{ . }}){{ end }}{{ end }} + {{ .Permalink }} + {{ .Summary | transform.XMLEscape | safeHTML }} + {{ `` | safeHTML }} + + {{- end }} + + diff --git a/themes/hugo-bearcub/layouts/_default/single.html b/themes/hugo-bearcub/layouts/_default/single.html new file mode 100644 index 0000000..2baecc4 --- /dev/null +++ b/themes/hugo-bearcub/layouts/_default/single.html @@ -0,0 +1,28 @@ +{{ define "main" }} +{{ if not .Params.menu }} +

{{ .Title }}

+ +{{ end }} + + {{ .Content }} + +

+ {{ range (.GetTerms "tags") }} + #{{ lower .LinkTitle }} + {{ end }} +

+{{ if not .Params.hideReply }} +{{ with .Site.Params.author.email }} +

+ + {{ i18n "email-reply" }} ↪ + +

+{{ end }} +{{ end }} +{{ end }} diff --git a/themes/hugo-bearcub/layouts/index.html b/themes/hugo-bearcub/layouts/index.html new file mode 100644 index 0000000..9983b08 --- /dev/null +++ b/themes/hugo-bearcub/layouts/index.html @@ -0,0 +1,3 @@ +{{ define "main" }} +{{ .Content }} +{{ end }} diff --git a/themes/hugo-bearcub/layouts/partials/custom_body.html b/themes/hugo-bearcub/layouts/partials/custom_body.html new file mode 100644 index 0000000..951fb15 --- /dev/null +++ b/themes/hugo-bearcub/layouts/partials/custom_body.html @@ -0,0 +1,3 @@ + diff --git a/themes/hugo-bearcub/layouts/partials/custom_head.html b/themes/hugo-bearcub/layouts/partials/custom_head.html new file mode 100644 index 0000000..4c53c40 --- /dev/null +++ b/themes/hugo-bearcub/layouts/partials/custom_head.html @@ -0,0 +1,3 @@ + diff --git a/themes/hugo-bearcub/layouts/partials/favicon.html b/themes/hugo-bearcub/layouts/partials/favicon.html new file mode 100644 index 0000000..d391a86 --- /dev/null +++ b/themes/hugo-bearcub/layouts/partials/favicon.html @@ -0,0 +1,2 @@ +{{ with .Site.Params.favicon }} +{{ end }} diff --git a/themes/hugo-bearcub/layouts/partials/footer.html b/themes/hugo-bearcub/layouts/partials/footer.html new file mode 100644 index 0000000..9290715 --- /dev/null +++ b/themes/hugo-bearcub/layouts/partials/footer.html @@ -0,0 +1,3 @@ + + {{ .Site.Copyright }} | {{ markdownify .Site.Params.madeWith }} + \ No newline at end of file diff --git a/themes/hugo-bearcub/layouts/partials/header.html b/themes/hugo-bearcub/layouts/partials/header.html new file mode 100644 index 0000000..42b5c10 --- /dev/null +++ b/themes/hugo-bearcub/layouts/partials/header.html @@ -0,0 +1,4 @@ + + +

{{ .Site.Title }}

+ diff --git a/themes/hugo-bearcub/layouts/partials/nav.html b/themes/hugo-bearcub/layouts/partials/nav.html new file mode 100644 index 0000000..b9400df --- /dev/null +++ b/themes/hugo-bearcub/layouts/partials/nav.html @@ -0,0 +1,22 @@ +{{ range .Site.Menus.main.ByWeight }} + {{ .Name }} +{{ end }} +rss + + +{{ $translations := dict }} +{{ range .Translations }} + {{ $translations = merge $translations (dict .Language.Lang .) }} +{{ end }} + + +{{ range where .Site.Languages "Lang" "!=" .Page.Lang }} + {{ with (index $translations .Lang) }} + {{ .Language.LanguageName }} + {{ else }} + + {{ if not .Params.hideUntranslated }} + {{ .LanguageName }} + {{ end }} + {{ end }} +{{ end }} diff --git a/themes/hugo-bearcub/layouts/partials/seo_tags.html b/themes/hugo-bearcub/layouts/partials/seo_tags.html new file mode 100644 index 0000000..6ab1422 --- /dev/null +++ b/themes/hugo-bearcub/layouts/partials/seo_tags.html @@ -0,0 +1,22 @@ + + + + + + + + + + +{{ if and (and (default false .Site.Params.generateSocialCard) (not (isset .Params "images"))) (eq .Kind "page") }} + {{ partial "social_card.html" . }} +{{ else }} + + {{ template "_internal/opengraph.html" . }} + + + {{ template "_internal/twitter_cards.html" . }} + + + {{ template "_internal/schema.html" . }} +{{ end }} diff --git a/themes/hugo-bearcub/layouts/partials/social_card.html b/themes/hugo-bearcub/layouts/partials/social_card.html new file mode 100644 index 0000000..4f89b4f --- /dev/null +++ b/themes/hugo-bearcub/layouts/partials/social_card.html @@ -0,0 +1,124 @@ + +{{ $font := resources.GetRemote "https://github.com/google/fonts/raw/main/ofl/firamono/FiraMono-Bold.ttf" }} +{{ $fg := resources.Get "images/social_card_fg.png"}} +{{ $bg := resources.Get "images/social_card_bg.png"}} + +{{ if gt (len .Title) 45 }} + {{ $fg = $fg.Filter (images.Text .Title (dict + "font" $font + "color" "#fafafa" + "size" 95 + "linespacing" 16 + "x" 0 + "y" 0 + )) }} +{{ else }} + {{ $fg = $fg.Filter (images.Text .Title (dict + "font" $font + "color" "#fafafa" + "size" 130 + "linespacing" 20 + "x" 0 + "y" 0 + )) }} +{{ end }} + +{{ $date := .Date.Format (default "2006-01-02" .Site.Params.dateFormat) }} +{{ $author := (default $.Site.Params.author.name ($.Param "author") ) }} +{{ $byline := (printf "%s | %s" $author $date) }} + +{{ $fg = $fg.Filter (images.Text $byline (dict + "font" $font + "color" "#898a8d" + "size" 60 + "linespacing" 30 + "x" 0 + "y" 425 +)) }} + +{{ $card := $bg.Filter (images.Overlay $fg 112 140 ) }} +{{ $card := $card.Resize "900x webp q100" }} + + + + + + + + + + +{{- if .IsPage }} +{{- $iso8601 := "2006-01-02T15:04:05-07:00" -}} + +{{ with .PublishDate }}{{ end }} +{{ with .Lastmod }}{{ end }} +{{- end -}} + +{{- with .Params.audio }}{{ end }} +{{- with .Params.locale }}{{ end }} +{{- with .Site.Params.title }}{{ end }} +{{- with .Params.videos }}{{- range . }} + +{{ end }}{{ end }} + +{{- /* If it is part of a series, link to related articles */}} +{{- $permalink := .Permalink }} +{{- $siteSeries := .Site.Taxonomies.series }} +{{- if $siteSeries }} +{{ with .Params.series }}{{- range $name := . }} + {{- $series := index $siteSeries ($name | urlize) }} + {{- range $page := first 6 $series.Pages }} + {{- if ne $page.Permalink $permalink }}{{ end }} + {{- end }} +{{ end }}{{ end }} +{{- end }} + +{{- $facebookAdmin := "" }} +{{- with site.Params.social }} + {{- if reflect.IsMap . }} + {{- $facebookAdmin = .facebook_admin }} + {{- end }} +{{- end }} + +{{- /* Facebook Page Admin ID for Domain Insights */}} +{{ with $facebookAdmin }}{{ end }} + + + + + + + + +{{- $twitterSite := "" }} +{{- with site.Params.social }} + {{- if reflect.IsMap . }} + {{- $twitterSite = .twitter }} + {{- end }} +{{- end }} + +{{- with $twitterSite }} + {{- $content := . }} + {{- if not (strings.HasPrefix . "@") }} + {{- $content = printf "@%v" $twitterSite }} + {{- end }} + +{{- end }} + + + + + + +{{- if .IsPage -}} +{{- $iso8601 := "2006-01-02T15:04:05-07:00" -}} +{{ with .PublishDate }}{{ end}} +{{ with .Lastmod }}{{ end}} + + + + + + +{{- end -}} diff --git a/themes/hugo-bearcub/layouts/robots.txt b/themes/hugo-bearcub/layouts/robots.txt new file mode 100644 index 0000000..4f4ca44 --- /dev/null +++ b/themes/hugo-bearcub/layouts/robots.txt @@ -0,0 +1,3 @@ +User-agent: * +Allow: / +Sitemap: {{ "sitemap.xml" | absURL }} diff --git a/themes/hugo-bearcub/layouts/shortcodes/absfigure.html b/themes/hugo-bearcub/layouts/shortcodes/absfigure.html new file mode 100644 index 0000000..ad60c6c --- /dev/null +++ b/themes/hugo-bearcub/layouts/shortcodes/absfigure.html @@ -0,0 +1,29 @@ + + {{- if .Get "link" -}} + + {{- end -}} + {{ with .Get + {{- if .Get "link" }}{{ end -}} + {{- if or (or (.Get "title") (.Get "caption")) (.Get "attr") -}} +
+ {{ with (.Get "title") -}} +

{{ . }}

+ {{- end -}} + {{- if or (.Get "caption") (.Get "attr") -}}

+ {{- .Get "caption" | markdownify -}} + {{- with .Get "attrlink" }} + + {{- end -}} + {{- .Get "attr" | markdownify -}} + {{- if .Get "attrlink" }}{{ end }}

+ {{- end }} +
+ {{- end }} + \ No newline at end of file diff --git a/themes/hugo-bearcub/layouts/shortcodes/highlight.html b/themes/hugo-bearcub/layouts/shortcodes/highlight.html new file mode 100644 index 0000000..6c86ca8 --- /dev/null +++ b/themes/hugo-bearcub/layouts/shortcodes/highlight.html @@ -0,0 +1,5 @@ + +{{ .Page.Store.Set "hasCodeBlock" true }} + + +{{ if len .Params | eq 2 }}{{ highlight (trim .InnerDeindent "\n\r") (.Get 0) (.Get 1) }}{{ else }}{{ highlight (trim .InnerDeindent "\n\r") (.Get 0) "" }}{{ end }} \ No newline at end of file diff --git a/themes/hugo-bearcub/layouts/shortcodes/rawhtml.html b/themes/hugo-bearcub/layouts/shortcodes/rawhtml.html new file mode 100644 index 0000000..520ec17 --- /dev/null +++ b/themes/hugo-bearcub/layouts/shortcodes/rawhtml.html @@ -0,0 +1,2 @@ + +{{.Inner}} \ No newline at end of file diff --git a/themes/hugo-bearcub/theme.toml b/themes/hugo-bearcub/theme.toml new file mode 100644 index 0000000..602a351 --- /dev/null +++ b/themes/hugo-bearcub/theme.toml @@ -0,0 +1,29 @@ +name = "Bear Cub" +license = "MIT" +licenselink = "https://github.com/clente/hugo-bearcub/blob/master/LICENSE" +description = "A lightweight Hugo theme based on Bear Blog and Hugo Bear Blog. It is free, multilingual, optimized for search engines, no-nonsense, responsive, light, and fast. Really fast." + +# The home page of the theme, where the source can be found. +homepage = "https://github.com/clente/hugo-bearcub" + +# If you have a running demo of the theme. +demosite = "https://clente.github.io/hugo-bearcub" + +tags = ["blog", "responsive", "minimal", "personal", "dark", "multilingual"] +features = ["favicon", "seo", "no javascript", "rss", "social cards"] + +# If the theme has a single author +[author] + name = "Caio Lente" + homepage = "https://lente.dev" + +# If porting an existing theme +[original] + author = "Jan Raasch" + homepage = "https://www.janraasch.com" + repo = "https://github.com/janraasch/hugo-bearblog" + +# Hugo versions the theme supports +[module] + [module.hugoVersion] + min = "0.90"

_+NpUi)qEv>#^XZs_DXEfbS6`l3A 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 e#Zm>Vg{}uB>)o0 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 W79vwr2kXnF3z3~zq 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