Variable edge buf size. int64 coordinates. - #22

Open
ausrasul wants to merge 5 commits into
Image-Py:masterfrom
ausrasul:master
Open

Variable edge buf size. int64 coordinates.#22
ausrasul wants to merge 5 commits into
Image-Py:masterfrom
ausrasul:master

Conversation

@ausrasul

Copy link
Copy Markdown

The edge buffer size is too small when dealing with large images.
So I added the option to make it user defined.

Also when converting large images where the x,y coordinates are larger than the max value of int16, the coordinates become invalid/capped to the max value of int16.
It is changed to int64.

Allows large images to be marked with higher values.
That fixes the bugs when "trace" can't find the end node due to integer limit of the x,y address.
@jmon12

Copy link
Copy Markdown

@ausrasul Thank you for your quick fix, I was about to do something similar.

About the int16 issue, I didn't dive into the code yet, but why are you using int types instead of uint types? I suppose the index values must be positive. In that case, a uint32 would cover the same positive value range of int64 for two times less memory.

Is the concern about memory consumption a valid one? In the PR #19 tackling the same issue @yxdragon seems to acknowledge that.

I'll be testing your fork and give a feedback.

@jmon12

Copy link
Copy Markdown

I've been testing your implementation @ausrasul with my data and encountered an other overflow, of uint16 this time. I opened a PR on your fork.

jmon12and others added 2 commits April 9, 2025 10:22
An overflow was happening for reasonably big images (a dimension greater
than 2^16). It is now `uint32`.
Note that `mark_node` hasn't been touched because it's not involved in
the graph generation.
@ausrasul

ausrasul commented Apr 9, 2025

Copy link
Copy Markdown
Author

Hi, I've added your PR and also moved buf_size to the end of the args list to prevent breaking old code that uses positional args.

Regarding why int64 instead of uint64, at line sknw.py line 46 it tries to add an int from neighbors with a uint64 which result in float64 that cannot be used as an index.
One could cast back into uint but it requires deeper understanding of the code and performance implications.

Your concern about memory is valid, but the problem not int or uint, but rather it being 64 instead of 16.
an image with coordinates reaches the range of uint32 would require 16exabytes (rough estimate).
So that is more appropriate alternative to uint16 which is too small.
uint64 as I see it now is unnecessary memory hog.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@ausrasul@jmon12
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Variable edge buf size. int64 coordinates. - #22

Open
ausrasul wants to merge 5 commits into
Image-Py:masterfrom
ausrasul:master
Open

Variable edge buf size. int64 coordinates.#22
ausrasul wants to merge 5 commits into
Image-Py:masterfrom
ausrasul:master

Conversation

@ausrasul

Copy link
Copy Markdown

The edge buffer size is too small when dealing with large images.
So I added the option to make it user defined.

Also when converting large images where the x,y coordinates are larger than the max value of int16, the coordinates become invalid/capped to the max value of int16.
It is changed to int64.

Allows large images to be marked with higher values.
That fixes the bugs when "trace" can't find the end node due to integer limit of the x,y address.
@jmon12

Copy link
Copy Markdown

@ausrasul Thank you for your quick fix, I was about to do something similar.

About the int16 issue, I didn't dive into the code yet, but why are you using int types instead of uint types? I suppose the index values must be positive. In that case, a uint32 would cover the same positive value range of int64 for two times less memory.

Is the concern about memory consumption a valid one? In the PR #19 tackling the same issue @yxdragon seems to acknowledge that.

I'll be testing your fork and give a feedback.

@jmon12

Copy link
Copy Markdown

I've been testing your implementation @ausrasul with my data and encountered an other overflow, of uint16 this time. I opened a PR on your fork.

jmon12and others added 2 commits April 9, 2025 10:22
An overflow was happening for reasonably big images (a dimension greater
than 2^16). It is now `uint32`.
Note that `mark_node` hasn't been touched because it's not involved in
the graph generation.
@ausrasul

ausrasul commented Apr 9, 2025

Copy link
Copy Markdown
Author

Hi, I've added your PR and also moved buf_size to the end of the args list to prevent breaking old code that uses positional args.

Regarding why int64 instead of uint64, at line sknw.py line 46 it tries to add an int from neighbors with a uint64 which result in float64 that cannot be used as an index.
One could cast back into uint but it requires deeper understanding of the code and performance implications.

Your concern about memory is valid, but the problem not int or uint, but rather it being 64 instead of 16.
an image with coordinates reaches the range of uint32 would require 16exabytes (rough estimate).
So that is more appropriate alternative to uint16 which is too small.
uint64 as I see it now is unnecessary memory hog.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@ausrasul@jmon12
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Variable edge buf size. int64 coordinates. - #22

Open
ausrasul wants to merge 5 commits into
Image-Py:masterfrom
ausrasul:master
Open

Variable edge buf size. int64 coordinates.#22
ausrasul wants to merge 5 commits into
Image-Py:masterfrom
ausrasul:master

Conversation

@ausrasul

Copy link
Copy Markdown

The edge buffer size is too small when dealing with large images.
So I added the option to make it user defined.

Also when converting large images where the x,y coordinates are larger than the max value of int16, the coordinates become invalid/capped to the max value of int16.
It is changed to int64.

Allows large images to be marked with higher values.
That fixes the bugs when "trace" can't find the end node due to integer limit of the x,y address.
@jmon12

Copy link
Copy Markdown

@ausrasul Thank you for your quick fix, I was about to do something similar.

About the int16 issue, I didn't dive into the code yet, but why are you using int types instead of uint types? I suppose the index values must be positive. In that case, a uint32 would cover the same positive value range of int64 for two times less memory.

Is the concern about memory consumption a valid one? In the PR #19 tackling the same issue @yxdragon seems to acknowledge that.

I'll be testing your fork and give a feedback.

@jmon12

Copy link
Copy Markdown

I've been testing your implementation @ausrasul with my data and encountered an other overflow, of uint16 this time. I opened a PR on your fork.

jmon12and others added 2 commits April 9, 2025 10:22
An overflow was happening for reasonably big images (a dimension greater
than 2^16). It is now `uint32`.
Note that `mark_node` hasn't been touched because it's not involved in
the graph generation.
@ausrasul

ausrasul commented Apr 9, 2025

Copy link
Copy Markdown
Author

Hi, I've added your PR and also moved buf_size to the end of the args list to prevent breaking old code that uses positional args.

Regarding why int64 instead of uint64, at line sknw.py line 46 it tries to add an int from neighbors with a uint64 which result in float64 that cannot be used as an index.
One could cast back into uint but it requires deeper understanding of the code and performance implications.

Your concern about memory is valid, but the problem not int or uint, but rather it being 64 instead of 16.
an image with coordinates reaches the range of uint32 would require 16exabytes (rough estimate).
So that is more appropriate alternative to uint16 which is too small.
uint64 as I see it now is unnecessary memory hog.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@ausrasul@jmon12
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Variable edge buf size. int64 coordinates. - #22

Open
ausrasul wants to merge 5 commits into
Image-Py:masterfrom
ausrasul:master
Open

Variable edge buf size. int64 coordinates.#22
ausrasul wants to merge 5 commits into
Image-Py:masterfrom
ausrasul:master

Conversation

@ausrasul

Copy link
Copy Markdown

The edge buffer size is too small when dealing with large images.
So I added the option to make it user defined.

Also when converting large images where the x,y coordinates are larger than the max value of int16, the coordinates become invalid/capped to the max value of int16.
It is changed to int64.

Allows large images to be marked with higher values.
That fixes the bugs when "trace" can't find the end node due to integer limit of the x,y address.
@jmon12

Copy link
Copy Markdown

@ausrasul Thank you for your quick fix, I was about to do something similar.

About the int16 issue, I didn't dive into the code yet, but why are you using int types instead of uint types? I suppose the index values must be positive. In that case, a uint32 would cover the same positive value range of int64 for two times less memory.

Is the concern about memory consumption a valid one? In the PR #19 tackling the same issue @yxdragon seems to acknowledge that.

I'll be testing your fork and give a feedback.

@jmon12

Copy link
Copy Markdown

I've been testing your implementation @ausrasul with my data and encountered an other overflow, of uint16 this time. I opened a PR on your fork.

jmon12and others added 2 commits April 9, 2025 10:22
An overflow was happening for reasonably big images (a dimension greater
than 2^16). It is now `uint32`.
Note that `mark_node` hasn't been touched because it's not involved in
the graph generation.
@ausrasul

ausrasul commented Apr 9, 2025

Copy link
Copy Markdown
Author

Hi, I've added your PR and also moved buf_size to the end of the args list to prevent breaking old code that uses positional args.

Regarding why int64 instead of uint64, at line sknw.py line 46 it tries to add an int from neighbors with a uint64 which result in float64 that cannot be used as an index.
One could cast back into uint but it requires deeper understanding of the code and performance implications.

Your concern about memory is valid, but the problem not int or uint, but rather it being 64 instead of 16.
an image with coordinates reaches the range of uint32 would require 16exabytes (rough estimate).
So that is more appropriate alternative to uint16 which is too small.
uint64 as I see it now is unnecessary memory hog.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@ausrasul@jmon12
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Variable edge buf size. int64 coordinates. - #22

Open
ausrasul wants to merge 5 commits into
Image-Py:masterfrom
ausrasul:master
Open

Variable edge buf size. int64 coordinates.#22
ausrasul wants to merge 5 commits into
Image-Py:masterfrom
ausrasul:master

Conversation

@ausrasul

Copy link
Copy Markdown

The edge buffer size is too small when dealing with large images.
So I added the option to make it user defined.

Also when converting large images where the x,y coordinates are larger than the max value of int16, the coordinates become invalid/capped to the max value of int16.
It is changed to int64.

Allows large images to be marked with higher values.
That fixes the bugs when "trace" can't find the end node due to integer limit of the x,y address.
@jmon12

Copy link
Copy Markdown

@ausrasul Thank you for your quick fix, I was about to do something similar.

About the int16 issue, I didn't dive into the code yet, but why are you using int types instead of uint types? I suppose the index values must be positive. In that case, a uint32 would cover the same positive value range of int64 for two times less memory.

Is the concern about memory consumption a valid one? In the PR #19 tackling the same issue @yxdragon seems to acknowledge that.

I'll be testing your fork and give a feedback.

@jmon12

Copy link
Copy Markdown

I've been testing your implementation @ausrasul with my data and encountered an other overflow, of uint16 this time. I opened a PR on your fork.

jmon12and others added 2 commits April 9, 2025 10:22
An overflow was happening for reasonably big images (a dimension greater
than 2^16). It is now `uint32`.
Note that `mark_node` hasn't been touched because it's not involved in
the graph generation.
@ausrasul

ausrasul commented Apr 9, 2025

Copy link
Copy Markdown
Author

Hi, I've added your PR and also moved buf_size to the end of the args list to prevent breaking old code that uses positional args.

Regarding why int64 instead of uint64, at line sknw.py line 46 it tries to add an int from neighbors with a uint64 which result in float64 that cannot be used as an index.
One could cast back into uint but it requires deeper understanding of the code and performance implications.

Your concern about memory is valid, but the problem not int or uint, but rather it being 64 instead of 16.
an image with coordinates reaches the range of uint32 would require 16exabytes (rough estimate).
So that is more appropriate alternative to uint16 which is too small.
uint64 as I see it now is unnecessary memory hog.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@ausrasul@jmon12
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Variable edge buf size. int64 coordinates. - #22

Open
ausrasul wants to merge 5 commits into
Image-Py:masterfrom
ausrasul:master
Open

Variable edge buf size. int64 coordinates.#22
ausrasul wants to merge 5 commits into
Image-Py:masterfrom
ausrasul:master

Conversation

@ausrasul

Copy link
Copy Markdown

The edge buffer size is too small when dealing with large images.
So I added the option to make it user defined.

Also when converting large images where the x,y coordinates are larger than the max value of int16, the coordinates become invalid/capped to the max value of int16.
It is changed to int64.

Allows large images to be marked with higher values.
That fixes the bugs when "trace" can't find the end node due to integer limit of the x,y address.
@jmon12

Copy link
Copy Markdown

@ausrasul Thank you for your quick fix, I was about to do something similar.

About the int16 issue, I didn't dive into the code yet, but why are you using int types instead of uint types? I suppose the index values must be positive. In that case, a uint32 would cover the same positive value range of int64 for two times less memory.

Is the concern about memory consumption a valid one? In the PR #19 tackling the same issue @yxdragon seems to acknowledge that.

I'll be testing your fork and give a feedback.

@jmon12

Copy link
Copy Markdown

I've been testing your implementation @ausrasul with my data and encountered an other overflow, of uint16 this time. I opened a PR on your fork.

jmon12and others added 2 commits April 9, 2025 10:22
An overflow was happening for reasonably big images (a dimension greater
than 2^16). It is now `uint32`.
Note that `mark_node` hasn't been touched because it's not involved in
the graph generation.
@ausrasul

ausrasul commented Apr 9, 2025

Copy link
Copy Markdown
Author

Hi, I've added your PR and also moved buf_size to the end of the args list to prevent breaking old code that uses positional args.

Regarding why int64 instead of uint64, at line sknw.py line 46 it tries to add an int from neighbors with a uint64 which result in float64 that cannot be used as an index.
One could cast back into uint but it requires deeper understanding of the code and performance implications.

Your concern about memory is valid, but the problem not int or uint, but rather it being 64 instead of 16.
an image with coordinates reaches the range of uint32 would require 16exabytes (rough estimate).
So that is more appropriate alternative to uint16 which is too small.
uint64 as I see it now is unnecessary memory hog.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@ausrasul@jmon12
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Variable edge buf size. int64 coordinates. - #22

Open
ausrasul wants to merge 5 commits into
Image-Py:masterfrom
ausrasul:master
Open

Variable edge buf size. int64 coordinates.#22
ausrasul wants to merge 5 commits into
Image-Py:masterfrom
ausrasul:master

Conversation

@ausrasul

Copy link
Copy Markdown

The edge buffer size is too small when dealing with large images.
So I added the option to make it user defined.

Also when converting large images where the x,y coordinates are larger than the max value of int16, the coordinates become invalid/capped to the max value of int16.
It is changed to int64.

Allows large images to be marked with higher values.
That fixes the bugs when "trace" can't find the end node due to integer limit of the x,y address.
@jmon12

Copy link
Copy Markdown

@ausrasul Thank you for your quick fix, I was about to do something similar.

About the int16 issue, I didn't dive into the code yet, but why are you using int types instead of uint types? I suppose the index values must be positive. In that case, a uint32 would cover the same positive value range of int64 for two times less memory.

Is the concern about memory consumption a valid one? In the PR #19 tackling the same issue @yxdragon seems to acknowledge that.

I'll be testing your fork and give a feedback.

@jmon12

Copy link
Copy Markdown

I've been testing your implementation @ausrasul with my data and encountered an other overflow, of uint16 this time. I opened a PR on your fork.

jmon12and others added 2 commits April 9, 2025 10:22
An overflow was happening for reasonably big images (a dimension greater
than 2^16). It is now `uint32`.
Note that `mark_node` hasn't been touched because it's not involved in
the graph generation.
@ausrasul

ausrasul commented Apr 9, 2025

Copy link
Copy Markdown
Author

Hi, I've added your PR and also moved buf_size to the end of the args list to prevent breaking old code that uses positional args.

Regarding why int64 instead of uint64, at line sknw.py line 46 it tries to add an int from neighbors with a uint64 which result in float64 that cannot be used as an index.
One could cast back into uint but it requires deeper understanding of the code and performance implications.

Your concern about memory is valid, but the problem not int or uint, but rather it being 64 instead of 16.
an image with coordinates reaches the range of uint32 would require 16exabytes (rough estimate).
So that is more appropriate alternative to uint16 which is too small.
uint64 as I see it now is unnecessary memory hog.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@ausrasul@jmon12
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Variable edge buf size. int64 coordinates. - #22

Open
ausrasul wants to merge 5 commits into
Image-Py:masterfrom
ausrasul:master
Open

Variable edge buf size. int64 coordinates.#22
ausrasul wants to merge 5 commits into
Image-Py:masterfrom
ausrasul:master

Conversation

@ausrasul

Copy link
Copy Markdown

The edge buffer size is too small when dealing with large images.
So I added the option to make it user defined.

Also when converting large images where the x,y coordinates are larger than the max value of int16, the coordinates become invalid/capped to the max value of int16.
It is changed to int64.

Allows large images to be marked with higher values.
That fixes the bugs when "trace" can't find the end node due to integer limit of the x,y address.
@jmon12

Copy link
Copy Markdown

@ausrasul Thank you for your quick fix, I was about to do something similar.

About the int16 issue, I didn't dive into the code yet, but why are you using int types instead of uint types? I suppose the index values must be positive. In that case, a uint32 would cover the same positive value range of int64 for two times less memory.

Is the concern about memory consumption a valid one? In the PR #19 tackling the same issue @yxdragon seems to acknowledge that.

I'll be testing your fork and give a feedback.

@jmon12

Copy link
Copy Markdown

I've been testing your implementation @ausrasul with my data and encountered an other overflow, of uint16 this time. I opened a PR on your fork.

jmon12and others added 2 commits April 9, 2025 10:22
An overflow was happening for reasonably big images (a dimension greater
than 2^16). It is now `uint32`.
Note that `mark_node` hasn't been touched because it's not involved in
the graph generation.
@ausrasul

ausrasul commented Apr 9, 2025

Copy link
Copy Markdown
Author

Hi, I've added your PR and also moved buf_size to the end of the args list to prevent breaking old code that uses positional args.

Regarding why int64 instead of uint64, at line sknw.py line 46 it tries to add an int from neighbors with a uint64 which result in float64 that cannot be used as an index.
One could cast back into uint but it requires deeper understanding of the code and performance implications.

Your concern about memory is valid, but the problem not int or uint, but rather it being 64 instead of 16.
an image with coordinates reaches the range of uint32 would require 16exabytes (rough estimate).
So that is more appropriate alternative to uint16 which is too small.
uint64 as I see it now is unnecessary memory hog.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@ausrasul@jmon12