Factor shrink loggers - #172

Open
jmid wants to merge 6 commits into
c-cube:mainfrom
jmid:factor-shrink-loggers
Open

Factor shrink loggers#172
jmid wants to merge 6 commits into
c-cube:mainfrom
jmid:factor-shrink-loggers

Conversation

@jmid

@jmidjmid commented Sep 7, 2021

Copy link
Copy Markdown
Collaborator

This PR pulls out the shrink logging from the expect tests as it was cluttering the .expected output files needlessly and conflating

  • checking basic functionality and
  • highlighting the underlying shrinking algorithms (and their potential limitations).

There is now a separate directory shrink_algo_logs with a bunch of expect tests.
The idea is that these (in some cases terrifying) expect logs should gradually become nicer as each limitation is addressed 😀
One could say it turns a bunch of prior shrinking algorithm observations scattered around in comments into actual tests for everyone to see and improve on.

Highlights (many of which have been observed before):

  • char_char_never_abcdef* logs how QCheck.char doesn't shrink (issue QCheck.char doesn't shrink (but QCheck2.Gen.char does) #166)
  • fun_{first,last}_foldleftright_qcheck{,2}.expected shows how the QCheck function shrinker's "generate-function-last-for-best-result" comes at a price of many shrink steps (room for algorithmic improvement?) and that QCheck2's function shrinker also could use a helping hand (issue Sub-optimal QCheck2 function shrinkers #163)
  • the int_* tests show QCheck2 repeatedly tests for 0 (aggressive shrinking - see below)
  • list_shorter* shows how QCheck2 will try new random lists rather than cut down the first counterexample
    and 2 limitations of QCheck design (issue List shrinker performance #64):
    • (1) it wastes many needless shrink steps to restart and try smaller sizes repeatedly
    • (2) an aggressive int shrinker (trying 0 first like QCheck2) could cut down a number of steps (and restarts!)
  • string_empty* shows how QCheck doesn't shrink the string's characters (mentioned in issue Improve QCheck2 string shrinking #157)
  • string_never_has_000* shows how QCheck2's string shrinker tries random (unrelated) strings to cut down the size, while QCheck's shrink algorithm uses a simple iterative algorithm rather than bisection or something list-shrinking-inspired (both mentioned in Improve QCheck2 string shrinking #157).

Finally, it

  • renamed test.ml to a more descriptive name
  • simplified the dune logic
  • removed shrink logging from existing tests and expect-outputs

@jmid
jmid requested review from Gbury and c-cubeSeptember 7, 2021 17:53
@jmid

jmid commented Sep 7, 2021

Copy link
Copy Markdown
CollaboratorAuthor

(also paging @sir4ur0n which I couldn't add as a reviewer)

@sir4ur0n

Copy link
Copy Markdown
Contributor

I am in vacation but if you're in no hurry I can review when I'm back 😄

@jmidjmid mentioned this pull request Sep 8, 2021

@GburyGbury left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The split is nice ! The diff is quite long so I didn't read everything, but considering it's only some more tests, it can't be wrong, ^^

Comment threadtest/core/shrink_algo_logs/char_never_abcdef_qcheck.ml Outdated
Comment threadtest/core/shrink_algo_logs/char_never_abcdef_qcheck2.ml Outdated
holds 0
holds 1
holds 2
fails 4611686018427387903

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

it's a bit of a problem that this doesn't not shrink, or am I missing something ?

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I characterized it as "debatable" myself when I added the tests originally 😉
#153 (comment)
incl. what I saw as arguments for and against.

There's also a level-headed reply from @sir4ur0n here:
#153 (comment)

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.

3 participants

@jmid@sir4ur0n@Gbury
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all \u003cpre\u003e\u003ccode\u003e 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

Factor shrink loggers - #172

Open
jmid wants to merge 6 commits into
c-cube:mainfrom
jmid:factor-shrink-loggers
Open

Factor shrink loggers#172
jmid wants to merge 6 commits into
c-cube:mainfrom
jmid:factor-shrink-loggers

Conversation

@jmid

@jmidjmid commented Sep 7, 2021

Copy link
Copy Markdown
Collaborator

This PR pulls out the shrink logging from the expect tests as it was cluttering the .expected output files needlessly and conflating

  • checking basic functionality and
  • highlighting the underlying shrinking algorithms (and their potential limitations).

There is now a separate directory shrink_algo_logs with a bunch of expect tests.
The idea is that these (in some cases terrifying) expect logs should gradually become nicer as each limitation is addressed 😀
One could say it turns a bunch of prior shrinking algorithm observations scattered around in comments into actual tests for everyone to see and improve on.

Highlights (many of which have been observed before):

  • char_char_never_abcdef* logs how QCheck.char doesn't shrink (issue QCheck.char doesn't shrink (but QCheck2.Gen.char does) #166)
  • fun_{first,last}_foldleftright_qcheck{,2}.expected shows how the QCheck function shrinker's "generate-function-last-for-best-result" comes at a price of many shrink steps (room for algorithmic improvement?) and that QCheck2's function shrinker also could use a helping hand (issue Sub-optimal QCheck2 function shrinkers #163)
  • the int_* tests show QCheck2 repeatedly tests for 0 (aggressive shrinking - see below)
  • list_shorter* shows how QCheck2 will try new random lists rather than cut down the first counterexample
    and 2 limitations of QCheck design (issue List shrinker performance #64):
    • (1) it wastes many needless shrink steps to restart and try smaller sizes repeatedly
    • (2) an aggressive int shrinker (trying 0 first like QCheck2) could cut down a number of steps (and restarts!)
  • string_empty* shows how QCheck doesn't shrink the string's characters (mentioned in issue Improve QCheck2 string shrinking #157)
  • string_never_has_000* shows how QCheck2's string shrinker tries random (unrelated) strings to cut down the size, while QCheck's shrink algorithm uses a simple iterative algorithm rather than bisection or something list-shrinking-inspired (both mentioned in Improve QCheck2 string shrinking #157).

Finally, it

  • renamed test.ml to a more descriptive name
  • simplified the dune logic
  • removed shrink logging from existing tests and expect-outputs

@jmid
jmid requested review from Gbury and c-cubeSeptember 7, 2021 17:53
@jmid

jmid commented Sep 7, 2021

Copy link
Copy Markdown
CollaboratorAuthor

(also paging @sir4ur0n which I couldn't add as a reviewer)

@sir4ur0n

Copy link
Copy Markdown
Contributor

I am in vacation but if you're in no hurry I can review when I'm back 😄

@jmidjmid mentioned this pull request Sep 8, 2021

@GburyGbury left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The split is nice ! The diff is quite long so I didn't read everything, but considering it's only some more tests, it can't be wrong, ^^

Comment threadtest/core/shrink_algo_logs/char_never_abcdef_qcheck.ml Outdated
Comment threadtest/core/shrink_algo_logs/char_never_abcdef_qcheck2.ml Outdated
holds 0
holds 1
holds 2
fails 4611686018427387903

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

it's a bit of a problem that this doesn't not shrink, or am I missing something ?

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I characterized it as "debatable" myself when I added the tests originally 😉
#153 (comment)
incl. what I saw as arguments for and against.

There's also a level-headed reply from @sir4ur0n here:
#153 (comment)

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.

3 participants

@jmid@sir4ur0n@Gbury
, '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

Factor shrink loggers - #172

Open
jmid wants to merge 6 commits into
c-cube:mainfrom
jmid:factor-shrink-loggers
Open

Factor shrink loggers#172
jmid wants to merge 6 commits into
c-cube:mainfrom
jmid:factor-shrink-loggers

Conversation

@jmid

@jmidjmid commented Sep 7, 2021

Copy link
Copy Markdown
Collaborator

This PR pulls out the shrink logging from the expect tests as it was cluttering the .expected output files needlessly and conflating

  • checking basic functionality and
  • highlighting the underlying shrinking algorithms (and their potential limitations).

There is now a separate directory shrink_algo_logs with a bunch of expect tests.
The idea is that these (in some cases terrifying) expect logs should gradually become nicer as each limitation is addressed 😀
One could say it turns a bunch of prior shrinking algorithm observations scattered around in comments into actual tests for everyone to see and improve on.

Highlights (many of which have been observed before):

  • char_char_never_abcdef* logs how QCheck.char doesn't shrink (issue QCheck.char doesn't shrink (but QCheck2.Gen.char does) #166)
  • fun_{first,last}_foldleftright_qcheck{,2}.expected shows how the QCheck function shrinker's "generate-function-last-for-best-result" comes at a price of many shrink steps (room for algorithmic improvement?) and that QCheck2's function shrinker also could use a helping hand (issue Sub-optimal QCheck2 function shrinkers #163)
  • the int_* tests show QCheck2 repeatedly tests for 0 (aggressive shrinking - see below)
  • list_shorter* shows how QCheck2 will try new random lists rather than cut down the first counterexample
    and 2 limitations of QCheck design (issue List shrinker performance #64):
    • (1) it wastes many needless shrink steps to restart and try smaller sizes repeatedly
    • (2) an aggressive int shrinker (trying 0 first like QCheck2) could cut down a number of steps (and restarts!)
  • string_empty* shows how QCheck doesn't shrink the string's characters (mentioned in issue Improve QCheck2 string shrinking #157)
  • string_never_has_000* shows how QCheck2's string shrinker tries random (unrelated) strings to cut down the size, while QCheck's shrink algorithm uses a simple iterative algorithm rather than bisection or something list-shrinking-inspired (both mentioned in Improve QCheck2 string shrinking #157).

Finally, it

  • renamed test.ml to a more descriptive name
  • simplified the dune logic
  • removed shrink logging from existing tests and expect-outputs

@jmid
jmid requested review from Gbury and c-cubeSeptember 7, 2021 17:53
@jmid

jmid commented Sep 7, 2021

Copy link
Copy Markdown
CollaboratorAuthor

(also paging @sir4ur0n which I couldn't add as a reviewer)

@sir4ur0n

Copy link
Copy Markdown
Contributor

I am in vacation but if you're in no hurry I can review when I'm back 😄

@jmidjmid mentioned this pull request Sep 8, 2021

@GburyGbury left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The split is nice ! The diff is quite long so I didn't read everything, but considering it's only some more tests, it can't be wrong, ^^

Comment threadtest/core/shrink_algo_logs/char_never_abcdef_qcheck.ml Outdated
Comment threadtest/core/shrink_algo_logs/char_never_abcdef_qcheck2.ml Outdated
holds 0
holds 1
holds 2
fails 4611686018427387903

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

it's a bit of a problem that this doesn't not shrink, or am I missing something ?

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I characterized it as "debatable" myself when I added the tests originally 😉
#153 (comment)
incl. what I saw as arguments for and against.

There's also a level-headed reply from @sir4ur0n here:
#153 (comment)

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.

3 participants

@jmid@sir4ur0n@Gbury
, '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 \u003e 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

Factor shrink loggers - #172

Open
jmid wants to merge 6 commits into
c-cube:mainfrom
jmid:factor-shrink-loggers
Open

Factor shrink loggers#172
jmid wants to merge 6 commits into
c-cube:mainfrom
jmid:factor-shrink-loggers

Conversation

@jmid

@jmidjmid commented Sep 7, 2021

Copy link
Copy Markdown
Collaborator

This PR pulls out the shrink logging from the expect tests as it was cluttering the .expected output files needlessly and conflating

  • checking basic functionality and
  • highlighting the underlying shrinking algorithms (and their potential limitations).

There is now a separate directory shrink_algo_logs with a bunch of expect tests.
The idea is that these (in some cases terrifying) expect logs should gradually become nicer as each limitation is addressed 😀
One could say it turns a bunch of prior shrinking algorithm observations scattered around in comments into actual tests for everyone to see and improve on.

Highlights (many of which have been observed before):

  • char_char_never_abcdef* logs how QCheck.char doesn't shrink (issue QCheck.char doesn't shrink (but QCheck2.Gen.char does) #166)
  • fun_{first,last}_foldleftright_qcheck{,2}.expected shows how the QCheck function shrinker's "generate-function-last-for-best-result" comes at a price of many shrink steps (room for algorithmic improvement?) and that QCheck2's function shrinker also could use a helping hand (issue Sub-optimal QCheck2 function shrinkers #163)
  • the int_* tests show QCheck2 repeatedly tests for 0 (aggressive shrinking - see below)
  • list_shorter* shows how QCheck2 will try new random lists rather than cut down the first counterexample
    and 2 limitations of QCheck design (issue List shrinker performance #64):
    • (1) it wastes many needless shrink steps to restart and try smaller sizes repeatedly
    • (2) an aggressive int shrinker (trying 0 first like QCheck2) could cut down a number of steps (and restarts!)
  • string_empty* shows how QCheck doesn't shrink the string's characters (mentioned in issue Improve QCheck2 string shrinking #157)
  • string_never_has_000* shows how QCheck2's string shrinker tries random (unrelated) strings to cut down the size, while QCheck's shrink algorithm uses a simple iterative algorithm rather than bisection or something list-shrinking-inspired (both mentioned in Improve QCheck2 string shrinking #157).

Finally, it

  • renamed test.ml to a more descriptive name
  • simplified the dune logic
  • removed shrink logging from existing tests and expect-outputs

@jmid
jmid requested review from Gbury and c-cubeSeptember 7, 2021 17:53
@jmid

jmid commented Sep 7, 2021

Copy link
Copy Markdown
CollaboratorAuthor

(also paging @sir4ur0n which I couldn't add as a reviewer)

@sir4ur0n

Copy link
Copy Markdown
Contributor

I am in vacation but if you're in no hurry I can review when I'm back 😄

@jmidjmid mentioned this pull request Sep 8, 2021

@GburyGbury left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The split is nice ! The diff is quite long so I didn't read everything, but considering it's only some more tests, it can't be wrong, ^^

Comment threadtest/core/shrink_algo_logs/char_never_abcdef_qcheck.ml Outdated
Comment threadtest/core/shrink_algo_logs/char_never_abcdef_qcheck2.ml Outdated
holds 0
holds 1
holds 2
fails 4611686018427387903

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

it's a bit of a problem that this doesn't not shrink, or am I missing something ?

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I characterized it as "debatable" myself when I added the tests originally 😉
#153 (comment)
incl. what I saw as arguments for and against.

There's also a level-headed reply from @sir4ur0n here:
#153 (comment)

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.

3 participants

@jmid@sir4ur0n@Gbury
, '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

Factor shrink loggers - #172

Open
jmid wants to merge 6 commits into
c-cube:mainfrom
jmid:factor-shrink-loggers
Open

Factor shrink loggers#172
jmid wants to merge 6 commits into
c-cube:mainfrom
jmid:factor-shrink-loggers

Conversation

@jmid

@jmidjmid commented Sep 7, 2021

Copy link
Copy Markdown
Collaborator

This PR pulls out the shrink logging from the expect tests as it was cluttering the .expected output files needlessly and conflating

  • checking basic functionality and
  • highlighting the underlying shrinking algorithms (and their potential limitations).

There is now a separate directory shrink_algo_logs with a bunch of expect tests.
The idea is that these (in some cases terrifying) expect logs should gradually become nicer as each limitation is addressed 😀
One could say it turns a bunch of prior shrinking algorithm observations scattered around in comments into actual tests for everyone to see and improve on.

Highlights (many of which have been observed before):

  • char_char_never_abcdef* logs how QCheck.char doesn't shrink (issue QCheck.char doesn't shrink (but QCheck2.Gen.char does) #166)
  • fun_{first,last}_foldleftright_qcheck{,2}.expected shows how the QCheck function shrinker's "generate-function-last-for-best-result" comes at a price of many shrink steps (room for algorithmic improvement?) and that QCheck2's function shrinker also could use a helping hand (issue Sub-optimal QCheck2 function shrinkers #163)
  • the int_* tests show QCheck2 repeatedly tests for 0 (aggressive shrinking - see below)
  • list_shorter* shows how QCheck2 will try new random lists rather than cut down the first counterexample
    and 2 limitations of QCheck design (issue List shrinker performance #64):
    • (1) it wastes many needless shrink steps to restart and try smaller sizes repeatedly
    • (2) an aggressive int shrinker (trying 0 first like QCheck2) could cut down a number of steps (and restarts!)
  • string_empty* shows how QCheck doesn't shrink the string's characters (mentioned in issue Improve QCheck2 string shrinking #157)
  • string_never_has_000* shows how QCheck2's string shrinker tries random (unrelated) strings to cut down the size, while QCheck's shrink algorithm uses a simple iterative algorithm rather than bisection or something list-shrinking-inspired (both mentioned in Improve QCheck2 string shrinking #157).

Finally, it

  • renamed test.ml to a more descriptive name
  • simplified the dune logic
  • removed shrink logging from existing tests and expect-outputs

@jmid
jmid requested review from Gbury and c-cubeSeptember 7, 2021 17:53
@jmid

jmid commented Sep 7, 2021

Copy link
Copy Markdown
CollaboratorAuthor

(also paging @sir4ur0n which I couldn't add as a reviewer)

@sir4ur0n

Copy link
Copy Markdown
Contributor

I am in vacation but if you're in no hurry I can review when I'm back 😄

@jmidjmid mentioned this pull request Sep 8, 2021

@GburyGbury left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The split is nice ! The diff is quite long so I didn't read everything, but considering it's only some more tests, it can't be wrong, ^^

Comment threadtest/core/shrink_algo_logs/char_never_abcdef_qcheck.ml Outdated
Comment threadtest/core/shrink_algo_logs/char_never_abcdef_qcheck2.ml Outdated
holds 0
holds 1
holds 2
fails 4611686018427387903

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

it's a bit of a problem that this doesn't not shrink, or am I missing something ?

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I characterized it as "debatable" myself when I added the tests originally 😉
#153 (comment)
incl. what I saw as arguments for and against.

There's also a level-headed reply from @sir4ur0n here:
#153 (comment)

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.

3 participants

@jmid@sir4ur0n@Gbury
, '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

Factor shrink loggers - #172

Open
jmid wants to merge 6 commits into
c-cube:mainfrom
jmid:factor-shrink-loggers
Open

Factor shrink loggers#172
jmid wants to merge 6 commits into
c-cube:mainfrom
jmid:factor-shrink-loggers

Conversation

@jmid

@jmidjmid commented Sep 7, 2021

Copy link
Copy Markdown
Collaborator

This PR pulls out the shrink logging from the expect tests as it was cluttering the .expected output files needlessly and conflating

  • checking basic functionality and
  • highlighting the underlying shrinking algorithms (and their potential limitations).

There is now a separate directory shrink_algo_logs with a bunch of expect tests.
The idea is that these (in some cases terrifying) expect logs should gradually become nicer as each limitation is addressed 😀
One could say it turns a bunch of prior shrinking algorithm observations scattered around in comments into actual tests for everyone to see and improve on.

Highlights (many of which have been observed before):

  • char_char_never_abcdef* logs how QCheck.char doesn't shrink (issue QCheck.char doesn't shrink (but QCheck2.Gen.char does) #166)
  • fun_{first,last}_foldleftright_qcheck{,2}.expected shows how the QCheck function shrinker's "generate-function-last-for-best-result" comes at a price of many shrink steps (room for algorithmic improvement?) and that QCheck2's function shrinker also could use a helping hand (issue Sub-optimal QCheck2 function shrinkers #163)
  • the int_* tests show QCheck2 repeatedly tests for 0 (aggressive shrinking - see below)
  • list_shorter* shows how QCheck2 will try new random lists rather than cut down the first counterexample
    and 2 limitations of QCheck design (issue List shrinker performance #64):
    • (1) it wastes many needless shrink steps to restart and try smaller sizes repeatedly
    • (2) an aggressive int shrinker (trying 0 first like QCheck2) could cut down a number of steps (and restarts!)
  • string_empty* shows how QCheck doesn't shrink the string's characters (mentioned in issue Improve QCheck2 string shrinking #157)
  • string_never_has_000* shows how QCheck2's string shrinker tries random (unrelated) strings to cut down the size, while QCheck's shrink algorithm uses a simple iterative algorithm rather than bisection or something list-shrinking-inspired (both mentioned in Improve QCheck2 string shrinking #157).

Finally, it

  • renamed test.ml to a more descriptive name
  • simplified the dune logic
  • removed shrink logging from existing tests and expect-outputs

@jmid
jmid requested review from Gbury and c-cubeSeptember 7, 2021 17:53
@jmid

jmid commented Sep 7, 2021

Copy link
Copy Markdown
CollaboratorAuthor

(also paging @sir4ur0n which I couldn't add as a reviewer)

@sir4ur0n

Copy link
Copy Markdown
Contributor

I am in vacation but if you're in no hurry I can review when I'm back 😄

@jmidjmid mentioned this pull request Sep 8, 2021

@GburyGbury left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The split is nice ! The diff is quite long so I didn't read everything, but considering it's only some more tests, it can't be wrong, ^^

Comment threadtest/core/shrink_algo_logs/char_never_abcdef_qcheck.ml Outdated
Comment threadtest/core/shrink_algo_logs/char_never_abcdef_qcheck2.ml Outdated
holds 0
holds 1
holds 2
fails 4611686018427387903

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

it's a bit of a problem that this doesn't not shrink, or am I missing something ?

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I characterized it as "debatable" myself when I added the tests originally 😉
#153 (comment)
incl. what I saw as arguments for and against.

There's also a level-headed reply from @sir4ur0n here:
#153 (comment)

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.

3 participants

@jmid@sir4ur0n@Gbury
, '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

Factor shrink loggers - #172

Open
jmid wants to merge 6 commits into
c-cube:mainfrom
jmid:factor-shrink-loggers
Open

Factor shrink loggers#172
jmid wants to merge 6 commits into
c-cube:mainfrom
jmid:factor-shrink-loggers

Conversation

@jmid

@jmidjmid commented Sep 7, 2021

Copy link
Copy Markdown
Collaborator

This PR pulls out the shrink logging from the expect tests as it was cluttering the .expected output files needlessly and conflating

  • checking basic functionality and
  • highlighting the underlying shrinking algorithms (and their potential limitations).

There is now a separate directory shrink_algo_logs with a bunch of expect tests.
The idea is that these (in some cases terrifying) expect logs should gradually become nicer as each limitation is addressed 😀
One could say it turns a bunch of prior shrinking algorithm observations scattered around in comments into actual tests for everyone to see and improve on.

Highlights (many of which have been observed before):

  • char_char_never_abcdef* logs how QCheck.char doesn't shrink (issue QCheck.char doesn't shrink (but QCheck2.Gen.char does) #166)
  • fun_{first,last}_foldleftright_qcheck{,2}.expected shows how the QCheck function shrinker's "generate-function-last-for-best-result" comes at a price of many shrink steps (room for algorithmic improvement?) and that QCheck2's function shrinker also could use a helping hand (issue Sub-optimal QCheck2 function shrinkers #163)
  • the int_* tests show QCheck2 repeatedly tests for 0 (aggressive shrinking - see below)
  • list_shorter* shows how QCheck2 will try new random lists rather than cut down the first counterexample
    and 2 limitations of QCheck design (issue List shrinker performance #64):
    • (1) it wastes many needless shrink steps to restart and try smaller sizes repeatedly
    • (2) an aggressive int shrinker (trying 0 first like QCheck2) could cut down a number of steps (and restarts!)
  • string_empty* shows how QCheck doesn't shrink the string's characters (mentioned in issue Improve QCheck2 string shrinking #157)
  • string_never_has_000* shows how QCheck2's string shrinker tries random (unrelated) strings to cut down the size, while QCheck's shrink algorithm uses a simple iterative algorithm rather than bisection or something list-shrinking-inspired (both mentioned in Improve QCheck2 string shrinking #157).

Finally, it

  • renamed test.ml to a more descriptive name
  • simplified the dune logic
  • removed shrink logging from existing tests and expect-outputs

@jmid
jmid requested review from Gbury and c-cubeSeptember 7, 2021 17:53
@jmid

jmid commented Sep 7, 2021

Copy link
Copy Markdown
CollaboratorAuthor

(also paging @sir4ur0n which I couldn't add as a reviewer)

@sir4ur0n

Copy link
Copy Markdown
Contributor

I am in vacation but if you're in no hurry I can review when I'm back 😄

@jmidjmid mentioned this pull request Sep 8, 2021

@GburyGbury left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The split is nice ! The diff is quite long so I didn't read everything, but considering it's only some more tests, it can't be wrong, ^^

Comment threadtest/core/shrink_algo_logs/char_never_abcdef_qcheck.ml Outdated
Comment threadtest/core/shrink_algo_logs/char_never_abcdef_qcheck2.ml Outdated
holds 0
holds 1
holds 2
fails 4611686018427387903

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

it's a bit of a problem that this doesn't not shrink, or am I missing something ?

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I characterized it as "debatable" myself when I added the tests originally 😉
#153 (comment)
incl. what I saw as arguments for and against.

There's also a level-headed reply from @sir4ur0n here:
#153 (comment)

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.

3 participants

@jmid@sir4ur0n@Gbury
, '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

Factor shrink loggers - #172

Open
jmid wants to merge 6 commits into
c-cube:mainfrom
jmid:factor-shrink-loggers
Open

Factor shrink loggers#172
jmid wants to merge 6 commits into
c-cube:mainfrom
jmid:factor-shrink-loggers

Conversation

@jmid

@jmidjmid commented Sep 7, 2021

Copy link
Copy Markdown
Collaborator

This PR pulls out the shrink logging from the expect tests as it was cluttering the .expected output files needlessly and conflating

  • checking basic functionality and
  • highlighting the underlying shrinking algorithms (and their potential limitations).

There is now a separate directory shrink_algo_logs with a bunch of expect tests.
The idea is that these (in some cases terrifying) expect logs should gradually become nicer as each limitation is addressed 😀
One could say it turns a bunch of prior shrinking algorithm observations scattered around in comments into actual tests for everyone to see and improve on.

Highlights (many of which have been observed before):

  • char_char_never_abcdef* logs how QCheck.char doesn't shrink (issue QCheck.char doesn't shrink (but QCheck2.Gen.char does) #166)
  • fun_{first,last}_foldleftright_qcheck{,2}.expected shows how the QCheck function shrinker's "generate-function-last-for-best-result" comes at a price of many shrink steps (room for algorithmic improvement?) and that QCheck2's function shrinker also could use a helping hand (issue Sub-optimal QCheck2 function shrinkers #163)
  • the int_* tests show QCheck2 repeatedly tests for 0 (aggressive shrinking - see below)
  • list_shorter* shows how QCheck2 will try new random lists rather than cut down the first counterexample
    and 2 limitations of QCheck design (issue List shrinker performance #64):
    • (1) it wastes many needless shrink steps to restart and try smaller sizes repeatedly
    • (2) an aggressive int shrinker (trying 0 first like QCheck2) could cut down a number of steps (and restarts!)
  • string_empty* shows how QCheck doesn't shrink the string's characters (mentioned in issue Improve QCheck2 string shrinking #157)
  • string_never_has_000* shows how QCheck2's string shrinker tries random (unrelated) strings to cut down the size, while QCheck's shrink algorithm uses a simple iterative algorithm rather than bisection or something list-shrinking-inspired (both mentioned in Improve QCheck2 string shrinking #157).

Finally, it

  • renamed test.ml to a more descriptive name
  • simplified the dune logic
  • removed shrink logging from existing tests and expect-outputs

@jmid
jmid requested review from Gbury and c-cubeSeptember 7, 2021 17:53
@jmid

jmid commented Sep 7, 2021

Copy link
Copy Markdown
CollaboratorAuthor

(also paging @sir4ur0n which I couldn't add as a reviewer)

@sir4ur0n

Copy link
Copy Markdown
Contributor

I am in vacation but if you're in no hurry I can review when I'm back 😄

@jmidjmid mentioned this pull request Sep 8, 2021

@GburyGbury left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The split is nice ! The diff is quite long so I didn't read everything, but considering it's only some more tests, it can't be wrong, ^^

Comment threadtest/core/shrink_algo_logs/char_never_abcdef_qcheck.ml Outdated
Comment threadtest/core/shrink_algo_logs/char_never_abcdef_qcheck2.ml Outdated
holds 0
holds 1
holds 2
fails 4611686018427387903

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

it's a bit of a problem that this doesn't not shrink, or am I missing something ?

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I characterized it as "debatable" myself when I added the tests originally 😉
#153 (comment)
incl. what I saw as arguments for and against.

There's also a level-headed reply from @sir4ur0n here:
#153 (comment)

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.

3 participants

@jmid@sir4ur0n@Gbury