[Docker][Pylint] Use regexes for good names - #11712

Closed
AndrewZhaoLuo wants to merge 1 commit into
apache:mainfrom
AndrewZhaoLuo:aluo/relax-regex-rules
Closed

[Docker][Pylint] Use regexes for good names#11712
AndrewZhaoLuo wants to merge 1 commit into
apache:mainfrom
AndrewZhaoLuo:aluo/relax-regex-rules

Conversation

@AndrewZhaoLuo

@AndrewZhaoLuoAndrewZhaoLuo commented Jun 14, 2022

Copy link
Copy Markdown
Contributor

Now that we are cleaning up the test directory (see #11414), I thought this might be a good time to update pylint.

Depends on #11733

Furthermore we partially relax rules for variable names to allow most 1-2 lower case character names and 1 character upper case names (which are used a lot in the tests).

Motivation:

A lot of tests are like:

def test_multi_kernel():
# graph
n = tvm.runtime.convert(1024)
A = te.placeholder((n,), name="A")
B = te.placeholder((n,), name="B")
C = te.compute(A.shape, lambda *i: A(*i) + B(*i), name="C")
D = te.compute(A.shape, lambda *i: A(*i) + C(*i), name="D")
s = te.create_schedule(D.op)
# create iter var and assign them tags.
px, x = s[C].split(C.op.axis[0], nparts=1)
s[C].bind(px, te.thread_axis("pipeline"))
px, x = s[D].split(D.op.axis[0], nparts=1)
s[D].bind(px, te.thread_axis("pipeline"))
# one line to build the function.
def check_device(device, host="llvm"):
if not tvm.testing.device_enabled(device):
return
dev = tvm.device(device, 0)
fadd = tvm.build(s, [A, B, C, D], device, host, name="myadd")
dev = tvm.device(device, 0)
# launch the kernel.
n = 1024
a = tvm.nd.array(np.random.uniform(size=n).astype(A.dtype), dev)
b = tvm.nd.array(np.random.uniform(size=n).astype(B.dtype), dev)
c = tvm.nd.array(np.random.uniform(size=n).astype(C.dtype), dev)
d = tvm.nd.array(np.random.uniform(size=n).astype(D.dtype), dev)
fadd(a, b, c, d)
tvm.testing.assert_allclose(d.numpy(), a.numpy() * 2 + b.numpy(), rtol=1e-5)

Where capital letters represent TE placeholder tensors which seems reasonable to me.

@AndrewZhaoLuo

Copy link
Copy Markdown
ContributorAuthor

Will need to upgrade the CI images before merging this BTW.

@MousiusMousius left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Furthermore we partially relax rules for variable names to allow most 1-2 lower case character names and 1 character upper case names (which are used a lot in the tests).

Can we separate this out from this PR? The current tests are often hard to read because of this poor variable naming and that we should have a separate discussion as to whether we want to do this.

@AndrewZhaoLuo

Copy link
Copy Markdown
ContributorAuthor

Certainly: #11734.

Now re: discussion on changing variable names. Right now we allow the following whitelist of 'bad' variable names:

i,j,_,a,b,op,x,y,wd,lr,kv,k,v,s,p,h,c,m,n,X,t,g,f

I think the new regexes are simply an extension of the status quo (as if we allow 'a' and 'b' as variable names we should also allow 'd') but in a more readable format.

@AndrewZhaoLuoAndrewZhaoLuo changed the title [Docker][Pylint] Upgrade pylint, use regexes for good names[Docker][Pylint] Use regexes for good namesJun 15, 2022
@Mousius

Copy link
Copy Markdown
Member

@AndrewZhaoLuo I suggest we head in the direction of descriptive variable names and limit the single letter variables as much as we can, if we look at the C++ style guide it has a section detailing best practices for naming:
https://google.github.io/styleguide/cppguide.html#General_Naming_Rules

For tests this is extra important, as the single letter variables make it harder to follow the logic of the test. For example, why is A the placeholder for a rather than defining placeholder_a and array_a to clarify that relationship?

@AndrewZhaoLuo

Copy link
Copy Markdown
ContributorAuthor

@AndrewZhaoLuo I suggest we head in the direction of descriptive variable names and limit the single letter variables as much as we can, if we look at the C++ style guide it has a section detailing best practices for naming: https://google.github.io/styleguide/cppguide.html#General_Naming_Rules

For tests this is extra important, as the single letter variables make it harder to follow the logic of the test. For example, why is A the placeholder for a rather than defining placeholder_a and array_a to clarify that relationship?

I agree with you in principle, however as it stands we do allow 'bad' variable names, however they are limited to a very small list which is fairly arbitrary. It seems to me it was basically made in order for the linter to pass.

We can always restrict things later, but as it stands right now it provides an inconsistent policy which makes #11414 a bit harder to do.

@quic-sanirudh

quic-sanirudh commented Jul 20, 2022

Copy link
Copy Markdown
Contributor

Is there any ideas to either merge this patch, or modify this to remove all the single variable names altogether. When modifying the pytests to be linter compliant, I normally just run the linter and fix the errors it reports (I guess others do it in a similar fashion).

As it stands now, the linter errors for variable z but not for x and y, so we might end up missing a few bad variable names. Right now, I can manually change the linter regex in my local machine to avoid missing out on the bad variable names, but it might be good if we decided to go one way or another.

@AndrewZhaoLuo

Copy link
Copy Markdown
ContributorAuthor

@quic-sanirudh I haven't found time to get to this. I think your plan of closing the loophole is a good one. However, it is another major refactor

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

@AndrewZhaoLuo@Mousius@quic-sanirudh
, '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

[Docker][Pylint] Use regexes for good names - #11712

Closed
AndrewZhaoLuo wants to merge 1 commit into
apache:mainfrom
AndrewZhaoLuo:aluo/relax-regex-rules
Closed

[Docker][Pylint] Use regexes for good names#11712
AndrewZhaoLuo wants to merge 1 commit into
apache:mainfrom
AndrewZhaoLuo:aluo/relax-regex-rules

Conversation

@AndrewZhaoLuo

@AndrewZhaoLuoAndrewZhaoLuo commented Jun 14, 2022

Copy link
Copy Markdown
Contributor

Now that we are cleaning up the test directory (see #11414), I thought this might be a good time to update pylint.

Depends on #11733

Furthermore we partially relax rules for variable names to allow most 1-2 lower case character names and 1 character upper case names (which are used a lot in the tests).

Motivation:

A lot of tests are like:

def test_multi_kernel():
# graph
n = tvm.runtime.convert(1024)
A = te.placeholder((n,), name="A")
B = te.placeholder((n,), name="B")
C = te.compute(A.shape, lambda *i: A(*i) + B(*i), name="C")
D = te.compute(A.shape, lambda *i: A(*i) + C(*i), name="D")
s = te.create_schedule(D.op)
# create iter var and assign them tags.
px, x = s[C].split(C.op.axis[0], nparts=1)
s[C].bind(px, te.thread_axis("pipeline"))
px, x = s[D].split(D.op.axis[0], nparts=1)
s[D].bind(px, te.thread_axis("pipeline"))
# one line to build the function.
def check_device(device, host="llvm"):
if not tvm.testing.device_enabled(device):
return
dev = tvm.device(device, 0)
fadd = tvm.build(s, [A, B, C, D], device, host, name="myadd")
dev = tvm.device(device, 0)
# launch the kernel.
n = 1024
a = tvm.nd.array(np.random.uniform(size=n).astype(A.dtype), dev)
b = tvm.nd.array(np.random.uniform(size=n).astype(B.dtype), dev)
c = tvm.nd.array(np.random.uniform(size=n).astype(C.dtype), dev)
d = tvm.nd.array(np.random.uniform(size=n).astype(D.dtype), dev)
fadd(a, b, c, d)
tvm.testing.assert_allclose(d.numpy(), a.numpy() * 2 + b.numpy(), rtol=1e-5)

Where capital letters represent TE placeholder tensors which seems reasonable to me.

@AndrewZhaoLuo

Copy link
Copy Markdown
ContributorAuthor

Will need to upgrade the CI images before merging this BTW.

@MousiusMousius left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Furthermore we partially relax rules for variable names to allow most 1-2 lower case character names and 1 character upper case names (which are used a lot in the tests).

Can we separate this out from this PR? The current tests are often hard to read because of this poor variable naming and that we should have a separate discussion as to whether we want to do this.

@AndrewZhaoLuo

Copy link
Copy Markdown
ContributorAuthor

Certainly: #11734.

Now re: discussion on changing variable names. Right now we allow the following whitelist of 'bad' variable names:

i,j,_,a,b,op,x,y,wd,lr,kv,k,v,s,p,h,c,m,n,X,t,g,f

I think the new regexes are simply an extension of the status quo (as if we allow 'a' and 'b' as variable names we should also allow 'd') but in a more readable format.

@AndrewZhaoLuoAndrewZhaoLuo changed the title [Docker][Pylint] Upgrade pylint, use regexes for good names[Docker][Pylint] Use regexes for good namesJun 15, 2022
@Mousius

Copy link
Copy Markdown
Member

@AndrewZhaoLuo I suggest we head in the direction of descriptive variable names and limit the single letter variables as much as we can, if we look at the C++ style guide it has a section detailing best practices for naming:
https://google.github.io/styleguide/cppguide.html#General_Naming_Rules

For tests this is extra important, as the single letter variables make it harder to follow the logic of the test. For example, why is A the placeholder for a rather than defining placeholder_a and array_a to clarify that relationship?

@AndrewZhaoLuo

Copy link
Copy Markdown
ContributorAuthor

@AndrewZhaoLuo I suggest we head in the direction of descriptive variable names and limit the single letter variables as much as we can, if we look at the C++ style guide it has a section detailing best practices for naming: https://google.github.io/styleguide/cppguide.html#General_Naming_Rules

For tests this is extra important, as the single letter variables make it harder to follow the logic of the test. For example, why is A the placeholder for a rather than defining placeholder_a and array_a to clarify that relationship?

I agree with you in principle, however as it stands we do allow 'bad' variable names, however they are limited to a very small list which is fairly arbitrary. It seems to me it was basically made in order for the linter to pass.

We can always restrict things later, but as it stands right now it provides an inconsistent policy which makes #11414 a bit harder to do.

@quic-sanirudh

quic-sanirudh commented Jul 20, 2022

Copy link
Copy Markdown
Contributor

Is there any ideas to either merge this patch, or modify this to remove all the single variable names altogether. When modifying the pytests to be linter compliant, I normally just run the linter and fix the errors it reports (I guess others do it in a similar fashion).

As it stands now, the linter errors for variable z but not for x and y, so we might end up missing a few bad variable names. Right now, I can manually change the linter regex in my local machine to avoid missing out on the bad variable names, but it might be good if we decided to go one way or another.

@AndrewZhaoLuo

Copy link
Copy Markdown
ContributorAuthor

@quic-sanirudh I haven't found time to get to this. I think your plan of closing the loophole is a good one. However, it is another major refactor

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

@AndrewZhaoLuo@Mousius@quic-sanirudh
, '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

[Docker][Pylint] Use regexes for good names - #11712

Closed
AndrewZhaoLuo wants to merge 1 commit into
apache:mainfrom
AndrewZhaoLuo:aluo/relax-regex-rules
Closed

[Docker][Pylint] Use regexes for good names#11712
AndrewZhaoLuo wants to merge 1 commit into
apache:mainfrom
AndrewZhaoLuo:aluo/relax-regex-rules

Conversation

@AndrewZhaoLuo

@AndrewZhaoLuoAndrewZhaoLuo commented Jun 14, 2022

Copy link
Copy Markdown
Contributor

Now that we are cleaning up the test directory (see #11414), I thought this might be a good time to update pylint.

Depends on #11733

Furthermore we partially relax rules for variable names to allow most 1-2 lower case character names and 1 character upper case names (which are used a lot in the tests).

Motivation:

A lot of tests are like:

def test_multi_kernel():
# graph
n = tvm.runtime.convert(1024)
A = te.placeholder((n,), name="A")
B = te.placeholder((n,), name="B")
C = te.compute(A.shape, lambda *i: A(*i) + B(*i), name="C")
D = te.compute(A.shape, lambda *i: A(*i) + C(*i), name="D")
s = te.create_schedule(D.op)
# create iter var and assign them tags.
px, x = s[C].split(C.op.axis[0], nparts=1)
s[C].bind(px, te.thread_axis("pipeline"))
px, x = s[D].split(D.op.axis[0], nparts=1)
s[D].bind(px, te.thread_axis("pipeline"))
# one line to build the function.
def check_device(device, host="llvm"):
if not tvm.testing.device_enabled(device):
return
dev = tvm.device(device, 0)
fadd = tvm.build(s, [A, B, C, D], device, host, name="myadd")
dev = tvm.device(device, 0)
# launch the kernel.
n = 1024
a = tvm.nd.array(np.random.uniform(size=n).astype(A.dtype), dev)
b = tvm.nd.array(np.random.uniform(size=n).astype(B.dtype), dev)
c = tvm.nd.array(np.random.uniform(size=n).astype(C.dtype), dev)
d = tvm.nd.array(np.random.uniform(size=n).astype(D.dtype), dev)
fadd(a, b, c, d)
tvm.testing.assert_allclose(d.numpy(), a.numpy() * 2 + b.numpy(), rtol=1e-5)

Where capital letters represent TE placeholder tensors which seems reasonable to me.

@AndrewZhaoLuo

Copy link
Copy Markdown
ContributorAuthor

Will need to upgrade the CI images before merging this BTW.

@MousiusMousius left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Furthermore we partially relax rules for variable names to allow most 1-2 lower case character names and 1 character upper case names (which are used a lot in the tests).

Can we separate this out from this PR? The current tests are often hard to read because of this poor variable naming and that we should have a separate discussion as to whether we want to do this.

@AndrewZhaoLuo

Copy link
Copy Markdown
ContributorAuthor

Certainly: #11734.

Now re: discussion on changing variable names. Right now we allow the following whitelist of 'bad' variable names:

i,j,_,a,b,op,x,y,wd,lr,kv,k,v,s,p,h,c,m,n,X,t,g,f

I think the new regexes are simply an extension of the status quo (as if we allow 'a' and 'b' as variable names we should also allow 'd') but in a more readable format.

@AndrewZhaoLuoAndrewZhaoLuo changed the title [Docker][Pylint] Upgrade pylint, use regexes for good names[Docker][Pylint] Use regexes for good namesJun 15, 2022
@Mousius

Copy link
Copy Markdown
Member

@AndrewZhaoLuo I suggest we head in the direction of descriptive variable names and limit the single letter variables as much as we can, if we look at the C++ style guide it has a section detailing best practices for naming:
https://google.github.io/styleguide/cppguide.html#General_Naming_Rules

For tests this is extra important, as the single letter variables make it harder to follow the logic of the test. For example, why is A the placeholder for a rather than defining placeholder_a and array_a to clarify that relationship?

@AndrewZhaoLuo

Copy link
Copy Markdown
ContributorAuthor

@AndrewZhaoLuo I suggest we head in the direction of descriptive variable names and limit the single letter variables as much as we can, if we look at the C++ style guide it has a section detailing best practices for naming: https://google.github.io/styleguide/cppguide.html#General_Naming_Rules

For tests this is extra important, as the single letter variables make it harder to follow the logic of the test. For example, why is A the placeholder for a rather than defining placeholder_a and array_a to clarify that relationship?

I agree with you in principle, however as it stands we do allow 'bad' variable names, however they are limited to a very small list which is fairly arbitrary. It seems to me it was basically made in order for the linter to pass.

We can always restrict things later, but as it stands right now it provides an inconsistent policy which makes #11414 a bit harder to do.

@quic-sanirudh

quic-sanirudh commented Jul 20, 2022

Copy link
Copy Markdown
Contributor

Is there any ideas to either merge this patch, or modify this to remove all the single variable names altogether. When modifying the pytests to be linter compliant, I normally just run the linter and fix the errors it reports (I guess others do it in a similar fashion).

As it stands now, the linter errors for variable z but not for x and y, so we might end up missing a few bad variable names. Right now, I can manually change the linter regex in my local machine to avoid missing out on the bad variable names, but it might be good if we decided to go one way or another.

@AndrewZhaoLuo

Copy link
Copy Markdown
ContributorAuthor

@quic-sanirudh I haven't found time to get to this. I think your plan of closing the loophole is a good one. However, it is another major refactor

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

@AndrewZhaoLuo@Mousius@quic-sanirudh
, '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

[Docker][Pylint] Use regexes for good names - #11712

Closed
AndrewZhaoLuo wants to merge 1 commit into
apache:mainfrom
AndrewZhaoLuo:aluo/relax-regex-rules
Closed

[Docker][Pylint] Use regexes for good names#11712
AndrewZhaoLuo wants to merge 1 commit into
apache:mainfrom
AndrewZhaoLuo:aluo/relax-regex-rules

Conversation

@AndrewZhaoLuo

@AndrewZhaoLuoAndrewZhaoLuo commented Jun 14, 2022

Copy link
Copy Markdown
Contributor

Now that we are cleaning up the test directory (see #11414), I thought this might be a good time to update pylint.

Depends on #11733

Furthermore we partially relax rules for variable names to allow most 1-2 lower case character names and 1 character upper case names (which are used a lot in the tests).

Motivation:

A lot of tests are like:

def test_multi_kernel():
# graph
n = tvm.runtime.convert(1024)
A = te.placeholder((n,), name="A")
B = te.placeholder((n,), name="B")
C = te.compute(A.shape, lambda *i: A(*i) + B(*i), name="C")
D = te.compute(A.shape, lambda *i: A(*i) + C(*i), name="D")
s = te.create_schedule(D.op)
# create iter var and assign them tags.
px, x = s[C].split(C.op.axis[0], nparts=1)
s[C].bind(px, te.thread_axis("pipeline"))
px, x = s[D].split(D.op.axis[0], nparts=1)
s[D].bind(px, te.thread_axis("pipeline"))
# one line to build the function.
def check_device(device, host="llvm"):
if not tvm.testing.device_enabled(device):
return
dev = tvm.device(device, 0)
fadd = tvm.build(s, [A, B, C, D], device, host, name="myadd")
dev = tvm.device(device, 0)
# launch the kernel.
n = 1024
a = tvm.nd.array(np.random.uniform(size=n).astype(A.dtype), dev)
b = tvm.nd.array(np.random.uniform(size=n).astype(B.dtype), dev)
c = tvm.nd.array(np.random.uniform(size=n).astype(C.dtype), dev)
d = tvm.nd.array(np.random.uniform(size=n).astype(D.dtype), dev)
fadd(a, b, c, d)
tvm.testing.assert_allclose(d.numpy(), a.numpy() * 2 + b.numpy(), rtol=1e-5)

Where capital letters represent TE placeholder tensors which seems reasonable to me.

@AndrewZhaoLuo

Copy link
Copy Markdown
ContributorAuthor

Will need to upgrade the CI images before merging this BTW.

@MousiusMousius left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Furthermore we partially relax rules for variable names to allow most 1-2 lower case character names and 1 character upper case names (which are used a lot in the tests).

Can we separate this out from this PR? The current tests are often hard to read because of this poor variable naming and that we should have a separate discussion as to whether we want to do this.

@AndrewZhaoLuo

Copy link
Copy Markdown
ContributorAuthor

Certainly: #11734.

Now re: discussion on changing variable names. Right now we allow the following whitelist of 'bad' variable names:

i,j,_,a,b,op,x,y,wd,lr,kv,k,v,s,p,h,c,m,n,X,t,g,f

I think the new regexes are simply an extension of the status quo (as if we allow 'a' and 'b' as variable names we should also allow 'd') but in a more readable format.

@AndrewZhaoLuoAndrewZhaoLuo changed the title [Docker][Pylint] Upgrade pylint, use regexes for good names[Docker][Pylint] Use regexes for good namesJun 15, 2022
@Mousius

Copy link
Copy Markdown
Member

@AndrewZhaoLuo I suggest we head in the direction of descriptive variable names and limit the single letter variables as much as we can, if we look at the C++ style guide it has a section detailing best practices for naming:
https://google.github.io/styleguide/cppguide.html#General_Naming_Rules

For tests this is extra important, as the single letter variables make it harder to follow the logic of the test. For example, why is A the placeholder for a rather than defining placeholder_a and array_a to clarify that relationship?

@AndrewZhaoLuo

Copy link
Copy Markdown
ContributorAuthor

@AndrewZhaoLuo I suggest we head in the direction of descriptive variable names and limit the single letter variables as much as we can, if we look at the C++ style guide it has a section detailing best practices for naming: https://google.github.io/styleguide/cppguide.html#General_Naming_Rules

For tests this is extra important, as the single letter variables make it harder to follow the logic of the test. For example, why is A the placeholder for a rather than defining placeholder_a and array_a to clarify that relationship?

I agree with you in principle, however as it stands we do allow 'bad' variable names, however they are limited to a very small list which is fairly arbitrary. It seems to me it was basically made in order for the linter to pass.

We can always restrict things later, but as it stands right now it provides an inconsistent policy which makes #11414 a bit harder to do.

@quic-sanirudh

quic-sanirudh commented Jul 20, 2022

Copy link
Copy Markdown
Contributor

Is there any ideas to either merge this patch, or modify this to remove all the single variable names altogether. When modifying the pytests to be linter compliant, I normally just run the linter and fix the errors it reports (I guess others do it in a similar fashion).

As it stands now, the linter errors for variable z but not for x and y, so we might end up missing a few bad variable names. Right now, I can manually change the linter regex in my local machine to avoid missing out on the bad variable names, but it might be good if we decided to go one way or another.

@AndrewZhaoLuo

Copy link
Copy Markdown
ContributorAuthor

@quic-sanirudh I haven't found time to get to this. I think your plan of closing the loophole is a good one. However, it is another major refactor

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

@AndrewZhaoLuo@Mousius@quic-sanirudh
, '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

[Docker][Pylint] Use regexes for good names - #11712

Closed
AndrewZhaoLuo wants to merge 1 commit into
apache:mainfrom
AndrewZhaoLuo:aluo/relax-regex-rules
Closed

[Docker][Pylint] Use regexes for good names#11712
AndrewZhaoLuo wants to merge 1 commit into
apache:mainfrom
AndrewZhaoLuo:aluo/relax-regex-rules

Conversation

@AndrewZhaoLuo

@AndrewZhaoLuoAndrewZhaoLuo commented Jun 14, 2022

Copy link
Copy Markdown
Contributor

Now that we are cleaning up the test directory (see #11414), I thought this might be a good time to update pylint.

Depends on #11733

Furthermore we partially relax rules for variable names to allow most 1-2 lower case character names and 1 character upper case names (which are used a lot in the tests).

Motivation:

A lot of tests are like:

def test_multi_kernel():
# graph
n = tvm.runtime.convert(1024)
A = te.placeholder((n,), name="A")
B = te.placeholder((n,), name="B")
C = te.compute(A.shape, lambda *i: A(*i) + B(*i), name="C")
D = te.compute(A.shape, lambda *i: A(*i) + C(*i), name="D")
s = te.create_schedule(D.op)
# create iter var and assign them tags.
px, x = s[C].split(C.op.axis[0], nparts=1)
s[C].bind(px, te.thread_axis("pipeline"))
px, x = s[D].split(D.op.axis[0], nparts=1)
s[D].bind(px, te.thread_axis("pipeline"))
# one line to build the function.
def check_device(device, host="llvm"):
if not tvm.testing.device_enabled(device):
return
dev = tvm.device(device, 0)
fadd = tvm.build(s, [A, B, C, D], device, host, name="myadd")
dev = tvm.device(device, 0)
# launch the kernel.
n = 1024
a = tvm.nd.array(np.random.uniform(size=n).astype(A.dtype), dev)
b = tvm.nd.array(np.random.uniform(size=n).astype(B.dtype), dev)
c = tvm.nd.array(np.random.uniform(size=n).astype(C.dtype), dev)
d = tvm.nd.array(np.random.uniform(size=n).astype(D.dtype), dev)
fadd(a, b, c, d)
tvm.testing.assert_allclose(d.numpy(), a.numpy() * 2 + b.numpy(), rtol=1e-5)

Where capital letters represent TE placeholder tensors which seems reasonable to me.

@AndrewZhaoLuo

Copy link
Copy Markdown
ContributorAuthor

Will need to upgrade the CI images before merging this BTW.

@MousiusMousius left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Furthermore we partially relax rules for variable names to allow most 1-2 lower case character names and 1 character upper case names (which are used a lot in the tests).

Can we separate this out from this PR? The current tests are often hard to read because of this poor variable naming and that we should have a separate discussion as to whether we want to do this.

@AndrewZhaoLuo

Copy link
Copy Markdown
ContributorAuthor

Certainly: #11734.

Now re: discussion on changing variable names. Right now we allow the following whitelist of 'bad' variable names:

i,j,_,a,b,op,x,y,wd,lr,kv,k,v,s,p,h,c,m,n,X,t,g,f

I think the new regexes are simply an extension of the status quo (as if we allow 'a' and 'b' as variable names we should also allow 'd') but in a more readable format.

@AndrewZhaoLuoAndrewZhaoLuo changed the title [Docker][Pylint] Upgrade pylint, use regexes for good names[Docker][Pylint] Use regexes for good namesJun 15, 2022
@Mousius

Copy link
Copy Markdown
Member

@AndrewZhaoLuo I suggest we head in the direction of descriptive variable names and limit the single letter variables as much as we can, if we look at the C++ style guide it has a section detailing best practices for naming:
https://google.github.io/styleguide/cppguide.html#General_Naming_Rules

For tests this is extra important, as the single letter variables make it harder to follow the logic of the test. For example, why is A the placeholder for a rather than defining placeholder_a and array_a to clarify that relationship?

@AndrewZhaoLuo

Copy link
Copy Markdown
ContributorAuthor

@AndrewZhaoLuo I suggest we head in the direction of descriptive variable names and limit the single letter variables as much as we can, if we look at the C++ style guide it has a section detailing best practices for naming: https://google.github.io/styleguide/cppguide.html#General_Naming_Rules

For tests this is extra important, as the single letter variables make it harder to follow the logic of the test. For example, why is A the placeholder for a rather than defining placeholder_a and array_a to clarify that relationship?

I agree with you in principle, however as it stands we do allow 'bad' variable names, however they are limited to a very small list which is fairly arbitrary. It seems to me it was basically made in order for the linter to pass.

We can always restrict things later, but as it stands right now it provides an inconsistent policy which makes #11414 a bit harder to do.

@quic-sanirudh

quic-sanirudh commented Jul 20, 2022

Copy link
Copy Markdown
Contributor

Is there any ideas to either merge this patch, or modify this to remove all the single variable names altogether. When modifying the pytests to be linter compliant, I normally just run the linter and fix the errors it reports (I guess others do it in a similar fashion).

As it stands now, the linter errors for variable z but not for x and y, so we might end up missing a few bad variable names. Right now, I can manually change the linter regex in my local machine to avoid missing out on the bad variable names, but it might be good if we decided to go one way or another.

@AndrewZhaoLuo

Copy link
Copy Markdown
ContributorAuthor

@quic-sanirudh I haven't found time to get to this. I think your plan of closing the loophole is a good one. However, it is another major refactor

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

@AndrewZhaoLuo@Mousius@quic-sanirudh
, '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

[Docker][Pylint] Use regexes for good names - #11712

Closed
AndrewZhaoLuo wants to merge 1 commit into
apache:mainfrom
AndrewZhaoLuo:aluo/relax-regex-rules
Closed

[Docker][Pylint] Use regexes for good names#11712
AndrewZhaoLuo wants to merge 1 commit into
apache:mainfrom
AndrewZhaoLuo:aluo/relax-regex-rules

Conversation

@AndrewZhaoLuo

@AndrewZhaoLuoAndrewZhaoLuo commented Jun 14, 2022

Copy link
Copy Markdown
Contributor

Now that we are cleaning up the test directory (see #11414), I thought this might be a good time to update pylint.

Depends on #11733

Furthermore we partially relax rules for variable names to allow most 1-2 lower case character names and 1 character upper case names (which are used a lot in the tests).

Motivation:

A lot of tests are like:

def test_multi_kernel():
# graph
n = tvm.runtime.convert(1024)
A = te.placeholder((n,), name="A")
B = te.placeholder((n,), name="B")
C = te.compute(A.shape, lambda *i: A(*i) + B(*i), name="C")
D = te.compute(A.shape, lambda *i: A(*i) + C(*i), name="D")
s = te.create_schedule(D.op)
# create iter var and assign them tags.
px, x = s[C].split(C.op.axis[0], nparts=1)
s[C].bind(px, te.thread_axis("pipeline"))
px, x = s[D].split(D.op.axis[0], nparts=1)
s[D].bind(px, te.thread_axis("pipeline"))
# one line to build the function.
def check_device(device, host="llvm"):
if not tvm.testing.device_enabled(device):
return
dev = tvm.device(device, 0)
fadd = tvm.build(s, [A, B, C, D], device, host, name="myadd")
dev = tvm.device(device, 0)
# launch the kernel.
n = 1024
a = tvm.nd.array(np.random.uniform(size=n).astype(A.dtype), dev)
b = tvm.nd.array(np.random.uniform(size=n).astype(B.dtype), dev)
c = tvm.nd.array(np.random.uniform(size=n).astype(C.dtype), dev)
d = tvm.nd.array(np.random.uniform(size=n).astype(D.dtype), dev)
fadd(a, b, c, d)
tvm.testing.assert_allclose(d.numpy(), a.numpy() * 2 + b.numpy(), rtol=1e-5)

Where capital letters represent TE placeholder tensors which seems reasonable to me.

@AndrewZhaoLuo

Copy link
Copy Markdown
ContributorAuthor

Will need to upgrade the CI images before merging this BTW.

@MousiusMousius left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Furthermore we partially relax rules for variable names to allow most 1-2 lower case character names and 1 character upper case names (which are used a lot in the tests).

Can we separate this out from this PR? The current tests are often hard to read because of this poor variable naming and that we should have a separate discussion as to whether we want to do this.

@AndrewZhaoLuo

Copy link
Copy Markdown
ContributorAuthor

Certainly: #11734.

Now re: discussion on changing variable names. Right now we allow the following whitelist of 'bad' variable names:

i,j,_,a,b,op,x,y,wd,lr,kv,k,v,s,p,h,c,m,n,X,t,g,f

I think the new regexes are simply an extension of the status quo (as if we allow 'a' and 'b' as variable names we should also allow 'd') but in a more readable format.

@AndrewZhaoLuoAndrewZhaoLuo changed the title [Docker][Pylint] Upgrade pylint, use regexes for good names[Docker][Pylint] Use regexes for good namesJun 15, 2022
@Mousius

Copy link
Copy Markdown
Member

@AndrewZhaoLuo I suggest we head in the direction of descriptive variable names and limit the single letter variables as much as we can, if we look at the C++ style guide it has a section detailing best practices for naming:
https://google.github.io/styleguide/cppguide.html#General_Naming_Rules

For tests this is extra important, as the single letter variables make it harder to follow the logic of the test. For example, why is A the placeholder for a rather than defining placeholder_a and array_a to clarify that relationship?

@AndrewZhaoLuo

Copy link
Copy Markdown
ContributorAuthor

@AndrewZhaoLuo I suggest we head in the direction of descriptive variable names and limit the single letter variables as much as we can, if we look at the C++ style guide it has a section detailing best practices for naming: https://google.github.io/styleguide/cppguide.html#General_Naming_Rules

For tests this is extra important, as the single letter variables make it harder to follow the logic of the test. For example, why is A the placeholder for a rather than defining placeholder_a and array_a to clarify that relationship?

I agree with you in principle, however as it stands we do allow 'bad' variable names, however they are limited to a very small list which is fairly arbitrary. It seems to me it was basically made in order for the linter to pass.

We can always restrict things later, but as it stands right now it provides an inconsistent policy which makes #11414 a bit harder to do.

@quic-sanirudh

quic-sanirudh commented Jul 20, 2022

Copy link
Copy Markdown
Contributor

Is there any ideas to either merge this patch, or modify this to remove all the single variable names altogether. When modifying the pytests to be linter compliant, I normally just run the linter and fix the errors it reports (I guess others do it in a similar fashion).

As it stands now, the linter errors for variable z but not for x and y, so we might end up missing a few bad variable names. Right now, I can manually change the linter regex in my local machine to avoid missing out on the bad variable names, but it might be good if we decided to go one way or another.

@AndrewZhaoLuo

Copy link
Copy Markdown
ContributorAuthor

@quic-sanirudh I haven't found time to get to this. I think your plan of closing the loophole is a good one. However, it is another major refactor

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

@AndrewZhaoLuo@Mousius@quic-sanirudh
, '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

[Docker][Pylint] Use regexes for good names - #11712

Closed
AndrewZhaoLuo wants to merge 1 commit into
apache:mainfrom
AndrewZhaoLuo:aluo/relax-regex-rules
Closed

[Docker][Pylint] Use regexes for good names#11712
AndrewZhaoLuo wants to merge 1 commit into
apache:mainfrom
AndrewZhaoLuo:aluo/relax-regex-rules

Conversation

@AndrewZhaoLuo

@AndrewZhaoLuoAndrewZhaoLuo commented Jun 14, 2022

Copy link
Copy Markdown
Contributor

Now that we are cleaning up the test directory (see #11414), I thought this might be a good time to update pylint.

Depends on #11733

Furthermore we partially relax rules for variable names to allow most 1-2 lower case character names and 1 character upper case names (which are used a lot in the tests).

Motivation:

A lot of tests are like:

def test_multi_kernel():
# graph
n = tvm.runtime.convert(1024)
A = te.placeholder((n,), name="A")
B = te.placeholder((n,), name="B")
C = te.compute(A.shape, lambda *i: A(*i) + B(*i), name="C")
D = te.compute(A.shape, lambda *i: A(*i) + C(*i), name="D")
s = te.create_schedule(D.op)
# create iter var and assign them tags.
px, x = s[C].split(C.op.axis[0], nparts=1)
s[C].bind(px, te.thread_axis("pipeline"))
px, x = s[D].split(D.op.axis[0], nparts=1)
s[D].bind(px, te.thread_axis("pipeline"))
# one line to build the function.
def check_device(device, host="llvm"):
if not tvm.testing.device_enabled(device):
return
dev = tvm.device(device, 0)
fadd = tvm.build(s, [A, B, C, D], device, host, name="myadd")
dev = tvm.device(device, 0)
# launch the kernel.
n = 1024
a = tvm.nd.array(np.random.uniform(size=n).astype(A.dtype), dev)
b = tvm.nd.array(np.random.uniform(size=n).astype(B.dtype), dev)
c = tvm.nd.array(np.random.uniform(size=n).astype(C.dtype), dev)
d = tvm.nd.array(np.random.uniform(size=n).astype(D.dtype), dev)
fadd(a, b, c, d)
tvm.testing.assert_allclose(d.numpy(), a.numpy() * 2 + b.numpy(), rtol=1e-5)

Where capital letters represent TE placeholder tensors which seems reasonable to me.

@AndrewZhaoLuo

Copy link
Copy Markdown
ContributorAuthor

Will need to upgrade the CI images before merging this BTW.

@MousiusMousius left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Furthermore we partially relax rules for variable names to allow most 1-2 lower case character names and 1 character upper case names (which are used a lot in the tests).

Can we separate this out from this PR? The current tests are often hard to read because of this poor variable naming and that we should have a separate discussion as to whether we want to do this.

@AndrewZhaoLuo

Copy link
Copy Markdown
ContributorAuthor

Certainly: #11734.

Now re: discussion on changing variable names. Right now we allow the following whitelist of 'bad' variable names:

i,j,_,a,b,op,x,y,wd,lr,kv,k,v,s,p,h,c,m,n,X,t,g,f

I think the new regexes are simply an extension of the status quo (as if we allow 'a' and 'b' as variable names we should also allow 'd') but in a more readable format.

@AndrewZhaoLuoAndrewZhaoLuo changed the title [Docker][Pylint] Upgrade pylint, use regexes for good names[Docker][Pylint] Use regexes for good namesJun 15, 2022
@Mousius

Copy link
Copy Markdown
Member

@AndrewZhaoLuo I suggest we head in the direction of descriptive variable names and limit the single letter variables as much as we can, if we look at the C++ style guide it has a section detailing best practices for naming:
https://google.github.io/styleguide/cppguide.html#General_Naming_Rules

For tests this is extra important, as the single letter variables make it harder to follow the logic of the test. For example, why is A the placeholder for a rather than defining placeholder_a and array_a to clarify that relationship?

@AndrewZhaoLuo

Copy link
Copy Markdown
ContributorAuthor

@AndrewZhaoLuo I suggest we head in the direction of descriptive variable names and limit the single letter variables as much as we can, if we look at the C++ style guide it has a section detailing best practices for naming: https://google.github.io/styleguide/cppguide.html#General_Naming_Rules

For tests this is extra important, as the single letter variables make it harder to follow the logic of the test. For example, why is A the placeholder for a rather than defining placeholder_a and array_a to clarify that relationship?

I agree with you in principle, however as it stands we do allow 'bad' variable names, however they are limited to a very small list which is fairly arbitrary. It seems to me it was basically made in order for the linter to pass.

We can always restrict things later, but as it stands right now it provides an inconsistent policy which makes #11414 a bit harder to do.

@quic-sanirudh

quic-sanirudh commented Jul 20, 2022

Copy link
Copy Markdown
Contributor

Is there any ideas to either merge this patch, or modify this to remove all the single variable names altogether. When modifying the pytests to be linter compliant, I normally just run the linter and fix the errors it reports (I guess others do it in a similar fashion).

As it stands now, the linter errors for variable z but not for x and y, so we might end up missing a few bad variable names. Right now, I can manually change the linter regex in my local machine to avoid missing out on the bad variable names, but it might be good if we decided to go one way or another.

@AndrewZhaoLuo

Copy link
Copy Markdown
ContributorAuthor

@quic-sanirudh I haven't found time to get to this. I think your plan of closing the loophole is a good one. However, it is another major refactor

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

@AndrewZhaoLuo@Mousius@quic-sanirudh
, '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

[Docker][Pylint] Use regexes for good names - #11712

Closed
AndrewZhaoLuo wants to merge 1 commit into
apache:mainfrom
AndrewZhaoLuo:aluo/relax-regex-rules
Closed

[Docker][Pylint] Use regexes for good names#11712
AndrewZhaoLuo wants to merge 1 commit into
apache:mainfrom
AndrewZhaoLuo:aluo/relax-regex-rules

Conversation

@AndrewZhaoLuo

@AndrewZhaoLuoAndrewZhaoLuo commented Jun 14, 2022

Copy link
Copy Markdown
Contributor

Now that we are cleaning up the test directory (see #11414), I thought this might be a good time to update pylint.

Depends on #11733

Furthermore we partially relax rules for variable names to allow most 1-2 lower case character names and 1 character upper case names (which are used a lot in the tests).

Motivation:

A lot of tests are like:

def test_multi_kernel():
# graph
n = tvm.runtime.convert(1024)
A = te.placeholder((n,), name="A")
B = te.placeholder((n,), name="B")
C = te.compute(A.shape, lambda *i: A(*i) + B(*i), name="C")
D = te.compute(A.shape, lambda *i: A(*i) + C(*i), name="D")
s = te.create_schedule(D.op)
# create iter var and assign them tags.
px, x = s[C].split(C.op.axis[0], nparts=1)
s[C].bind(px, te.thread_axis("pipeline"))
px, x = s[D].split(D.op.axis[0], nparts=1)
s[D].bind(px, te.thread_axis("pipeline"))
# one line to build the function.
def check_device(device, host="llvm"):
if not tvm.testing.device_enabled(device):
return
dev = tvm.device(device, 0)
fadd = tvm.build(s, [A, B, C, D], device, host, name="myadd")
dev = tvm.device(device, 0)
# launch the kernel.
n = 1024
a = tvm.nd.array(np.random.uniform(size=n).astype(A.dtype), dev)
b = tvm.nd.array(np.random.uniform(size=n).astype(B.dtype), dev)
c = tvm.nd.array(np.random.uniform(size=n).astype(C.dtype), dev)
d = tvm.nd.array(np.random.uniform(size=n).astype(D.dtype), dev)
fadd(a, b, c, d)
tvm.testing.assert_allclose(d.numpy(), a.numpy() * 2 + b.numpy(), rtol=1e-5)

Where capital letters represent TE placeholder tensors which seems reasonable to me.

@AndrewZhaoLuo

Copy link
Copy Markdown
ContributorAuthor

Will need to upgrade the CI images before merging this BTW.

@MousiusMousius left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Furthermore we partially relax rules for variable names to allow most 1-2 lower case character names and 1 character upper case names (which are used a lot in the tests).

Can we separate this out from this PR? The current tests are often hard to read because of this poor variable naming and that we should have a separate discussion as to whether we want to do this.

@AndrewZhaoLuo

Copy link
Copy Markdown
ContributorAuthor

Certainly: #11734.

Now re: discussion on changing variable names. Right now we allow the following whitelist of 'bad' variable names:

i,j,_,a,b,op,x,y,wd,lr,kv,k,v,s,p,h,c,m,n,X,t,g,f

I think the new regexes are simply an extension of the status quo (as if we allow 'a' and 'b' as variable names we should also allow 'd') but in a more readable format.

@AndrewZhaoLuoAndrewZhaoLuo changed the title [Docker][Pylint] Upgrade pylint, use regexes for good names[Docker][Pylint] Use regexes for good namesJun 15, 2022
@Mousius

Copy link
Copy Markdown
Member

@AndrewZhaoLuo I suggest we head in the direction of descriptive variable names and limit the single letter variables as much as we can, if we look at the C++ style guide it has a section detailing best practices for naming:
https://google.github.io/styleguide/cppguide.html#General_Naming_Rules

For tests this is extra important, as the single letter variables make it harder to follow the logic of the test. For example, why is A the placeholder for a rather than defining placeholder_a and array_a to clarify that relationship?

@AndrewZhaoLuo

Copy link
Copy Markdown
ContributorAuthor

@AndrewZhaoLuo I suggest we head in the direction of descriptive variable names and limit the single letter variables as much as we can, if we look at the C++ style guide it has a section detailing best practices for naming: https://google.github.io/styleguide/cppguide.html#General_Naming_Rules

For tests this is extra important, as the single letter variables make it harder to follow the logic of the test. For example, why is A the placeholder for a rather than defining placeholder_a and array_a to clarify that relationship?

I agree with you in principle, however as it stands we do allow 'bad' variable names, however they are limited to a very small list which is fairly arbitrary. It seems to me it was basically made in order for the linter to pass.

We can always restrict things later, but as it stands right now it provides an inconsistent policy which makes #11414 a bit harder to do.

@quic-sanirudh

quic-sanirudh commented Jul 20, 2022

Copy link
Copy Markdown
Contributor

Is there any ideas to either merge this patch, or modify this to remove all the single variable names altogether. When modifying the pytests to be linter compliant, I normally just run the linter and fix the errors it reports (I guess others do it in a similar fashion).

As it stands now, the linter errors for variable z but not for x and y, so we might end up missing a few bad variable names. Right now, I can manually change the linter regex in my local machine to avoid missing out on the bad variable names, but it might be good if we decided to go one way or another.

@AndrewZhaoLuo

Copy link
Copy Markdown
ContributorAuthor

@quic-sanirudh I haven't found time to get to this. I think your plan of closing the loophole is a good one. However, it is another major refactor

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

@AndrewZhaoLuo@Mousius@quic-sanirudh