Fix information content values for conflation - #366

Open
gaurav wants to merge 9 commits into
mainfrom
fix-ic-for-conflation
Open

Fix information content values for conflation#366
gaurav wants to merge 9 commits into
mainfrom
fix-ic-for-conflation

Conversation

@gaurav

@gauravgaurav commented Feb 26, 2026

Copy link
Copy Markdown
Collaborator

I'm not sure if information content (IC) values are being calculated correct for conflations -- I think only the IC value of the conflated clique leader is being used. I'm going to use this PR to interrogate that and fix it if needed. It also adds information content values to every clique leader, although these might be nulls if Ubergraph doesn't have an IC for that value.

@gaurav
gaurav marked this pull request as ready for review February 26, 2026 22:00
@gaurav
gaurav requested a review from CopilotFebruary 26, 2026 22:00

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

This PR fixes the information content (IC) calculation for conflations in the node normalizer. Previously, only the IC value of the canonical clique leader was used. The PR now:

  • Collects IC values from all conflated identifiers and uses the minimum value for the canonical ID
  • Adds IC values to each equivalent identifier in the output
  • Moves the IC retrieval logic to be path-specific (conflation vs non-conflation)

Changes:

  • Modified IC value calculation to use minimum IC from all conflated identifiers instead of just the canonical ID
  • Added info_contents_all parameter to create_node() to provide IC values for all equivalent identifiers
  • Added IC values to individual equivalent identifiers in the node output

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

# output the final result
normal_nodes = {
input_curie: await create_node(app, canonical_id, dereference_ids, dereference_types, info_contents,
input_curie: await create_node(app, canonical_id, dereference_ids, dereference_types, info_contents, info_contents_all,

CopilotAIFeb 26, 2026

Copy link

Choose a reason for hiding this comment

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

The variable info_contents_all is not defined in the non-conflation path (lines 640-645) or when canonical_nonan is empty (lines 646-648). This will cause a NameError when create_node is called in these cases. The variable needs to be initialized in all code paths before this call.

Copilot uses AI. Check for mistakes.
Comment on lines +622 to +635
ic_vals = []

for other in dereference_others[canonical_id]:
# logging.debug(f"e = {e}, other = {other}, deref_others_eqs = {deref_others_eqs}")
e += deref_others_eqs[other]
t += deref_others_typ[other]
if other in info_contents_all and info_contents_all[other]:
ic_vals.append(info_contents_all[other])

final_eqids.append(e)
final_types.append(uniquify_list(t))

# What's the smallest IC value for this canonical ID?
info_contents[canonical_id] = min(ic_vals) if ic_vals else None

CopilotAIFeb 26, 2026

Copy link

Choose a reason for hiding this comment

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

The variable ic_vals is only initialized inside the conditional block at line 619-622, but it is referenced at line 635 which is outside that block. If len(dereference_others[canonical_id]) is 0 for any canonical_id in the loop, ic_vals will be undefined when accessed at line 635, causing a NameError. The initialization of ic_vals should be moved outside the conditional block to line 617 or 618.

Copilot uses AI. Check for mistakes.
@gaurav

Copy link
Copy Markdown
CollaboratorAuthor

I think there is a bug here, which means that we don't calculate the minimum IC for across all the clique leaders in a conflation. But I can't prove it with tests, I think because we sort the conflation IDs by IC from smallest to largest, and since the only ICs we have for chemicals are from CHEBI and the only ICs for genes are from NCBIGene, that means it should be impossible to have a situation where this is obvious. So either:

  1. I can try to fix the issue without testing (awkward, possibly incorrect).
  2. I write a test for this (depends on haveing a NodeNorm test suite).
  3. l can load deliberately messed up NodeNorm files (or mess with a Redis database) to test this.
  4. I can wait until something changes with the IC situation.

I don't think this is urgent, so I'll open a ticket (#368) and leave this for now.

@gauravgaurav moved this from Backlog to In progress in NodeNorm sprintsFeb 27, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Status: In progress

Development

Successfully merging this pull request may close these issues.

2 participants

@gaurav
, '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

Fix information content values for conflation - #366

Open
gaurav wants to merge 9 commits into
mainfrom
fix-ic-for-conflation
Open

Fix information content values for conflation#366
gaurav wants to merge 9 commits into
mainfrom
fix-ic-for-conflation

Conversation

@gaurav

@gauravgaurav commented Feb 26, 2026

Copy link
Copy Markdown
Collaborator

I'm not sure if information content (IC) values are being calculated correct for conflations -- I think only the IC value of the conflated clique leader is being used. I'm going to use this PR to interrogate that and fix it if needed. It also adds information content values to every clique leader, although these might be nulls if Ubergraph doesn't have an IC for that value.

@gaurav
gaurav marked this pull request as ready for review February 26, 2026 22:00
@gaurav
gaurav requested a review from CopilotFebruary 26, 2026 22:00

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

This PR fixes the information content (IC) calculation for conflations in the node normalizer. Previously, only the IC value of the canonical clique leader was used. The PR now:

  • Collects IC values from all conflated identifiers and uses the minimum value for the canonical ID
  • Adds IC values to each equivalent identifier in the output
  • Moves the IC retrieval logic to be path-specific (conflation vs non-conflation)

Changes:

  • Modified IC value calculation to use minimum IC from all conflated identifiers instead of just the canonical ID
  • Added info_contents_all parameter to create_node() to provide IC values for all equivalent identifiers
  • Added IC values to individual equivalent identifiers in the node output

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

# output the final result
normal_nodes = {
input_curie: await create_node(app, canonical_id, dereference_ids, dereference_types, info_contents,
input_curie: await create_node(app, canonical_id, dereference_ids, dereference_types, info_contents, info_contents_all,

CopilotAIFeb 26, 2026

Copy link

Choose a reason for hiding this comment

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

The variable info_contents_all is not defined in the non-conflation path (lines 640-645) or when canonical_nonan is empty (lines 646-648). This will cause a NameError when create_node is called in these cases. The variable needs to be initialized in all code paths before this call.

Copilot uses AI. Check for mistakes.
Comment on lines +622 to +635
ic_vals = []

for other in dereference_others[canonical_id]:
# logging.debug(f"e = {e}, other = {other}, deref_others_eqs = {deref_others_eqs}")
e += deref_others_eqs[other]
t += deref_others_typ[other]
if other in info_contents_all and info_contents_all[other]:
ic_vals.append(info_contents_all[other])

final_eqids.append(e)
final_types.append(uniquify_list(t))

# What's the smallest IC value for this canonical ID?
info_contents[canonical_id] = min(ic_vals) if ic_vals else None

CopilotAIFeb 26, 2026

Copy link

Choose a reason for hiding this comment

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

The variable ic_vals is only initialized inside the conditional block at line 619-622, but it is referenced at line 635 which is outside that block. If len(dereference_others[canonical_id]) is 0 for any canonical_id in the loop, ic_vals will be undefined when accessed at line 635, causing a NameError. The initialization of ic_vals should be moved outside the conditional block to line 617 or 618.

Copilot uses AI. Check for mistakes.
@gaurav

Copy link
Copy Markdown
CollaboratorAuthor

I think there is a bug here, which means that we don't calculate the minimum IC for across all the clique leaders in a conflation. But I can't prove it with tests, I think because we sort the conflation IDs by IC from smallest to largest, and since the only ICs we have for chemicals are from CHEBI and the only ICs for genes are from NCBIGene, that means it should be impossible to have a situation where this is obvious. So either:

  1. I can try to fix the issue without testing (awkward, possibly incorrect).
  2. I write a test for this (depends on haveing a NodeNorm test suite).
  3. l can load deliberately messed up NodeNorm files (or mess with a Redis database) to test this.
  4. I can wait until something changes with the IC situation.

I don't think this is urgent, so I'll open a ticket (#368) and leave this for now.

@gauravgaurav moved this from Backlog to In progress in NodeNorm sprintsFeb 27, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Status: In progress

Development

Successfully merging this pull request may close these issues.

2 participants

@gaurav
, '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

Fix information content values for conflation - #366

Open
gaurav wants to merge 9 commits into
mainfrom
fix-ic-for-conflation
Open

Fix information content values for conflation#366
gaurav wants to merge 9 commits into
mainfrom
fix-ic-for-conflation

Conversation

@gaurav

@gauravgaurav commented Feb 26, 2026

Copy link
Copy Markdown
Collaborator

I'm not sure if information content (IC) values are being calculated correct for conflations -- I think only the IC value of the conflated clique leader is being used. I'm going to use this PR to interrogate that and fix it if needed. It also adds information content values to every clique leader, although these might be nulls if Ubergraph doesn't have an IC for that value.

@gaurav
gaurav marked this pull request as ready for review February 26, 2026 22:00
@gaurav
gaurav requested a review from CopilotFebruary 26, 2026 22:00

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

This PR fixes the information content (IC) calculation for conflations in the node normalizer. Previously, only the IC value of the canonical clique leader was used. The PR now:

  • Collects IC values from all conflated identifiers and uses the minimum value for the canonical ID
  • Adds IC values to each equivalent identifier in the output
  • Moves the IC retrieval logic to be path-specific (conflation vs non-conflation)

Changes:

  • Modified IC value calculation to use minimum IC from all conflated identifiers instead of just the canonical ID
  • Added info_contents_all parameter to create_node() to provide IC values for all equivalent identifiers
  • Added IC values to individual equivalent identifiers in the node output

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

# output the final result
normal_nodes = {
input_curie: await create_node(app, canonical_id, dereference_ids, dereference_types, info_contents,
input_curie: await create_node(app, canonical_id, dereference_ids, dereference_types, info_contents, info_contents_all,

CopilotAIFeb 26, 2026

Copy link

Choose a reason for hiding this comment

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

The variable info_contents_all is not defined in the non-conflation path (lines 640-645) or when canonical_nonan is empty (lines 646-648). This will cause a NameError when create_node is called in these cases. The variable needs to be initialized in all code paths before this call.

Copilot uses AI. Check for mistakes.
Comment on lines +622 to +635
ic_vals = []

for other in dereference_others[canonical_id]:
# logging.debug(f"e = {e}, other = {other}, deref_others_eqs = {deref_others_eqs}")
e += deref_others_eqs[other]
t += deref_others_typ[other]
if other in info_contents_all and info_contents_all[other]:
ic_vals.append(info_contents_all[other])

final_eqids.append(e)
final_types.append(uniquify_list(t))

# What's the smallest IC value for this canonical ID?
info_contents[canonical_id] = min(ic_vals) if ic_vals else None

CopilotAIFeb 26, 2026

Copy link

Choose a reason for hiding this comment

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

The variable ic_vals is only initialized inside the conditional block at line 619-622, but it is referenced at line 635 which is outside that block. If len(dereference_others[canonical_id]) is 0 for any canonical_id in the loop, ic_vals will be undefined when accessed at line 635, causing a NameError. The initialization of ic_vals should be moved outside the conditional block to line 617 or 618.

Copilot uses AI. Check for mistakes.
@gaurav

Copy link
Copy Markdown
CollaboratorAuthor

I think there is a bug here, which means that we don't calculate the minimum IC for across all the clique leaders in a conflation. But I can't prove it with tests, I think because we sort the conflation IDs by IC from smallest to largest, and since the only ICs we have for chemicals are from CHEBI and the only ICs for genes are from NCBIGene, that means it should be impossible to have a situation where this is obvious. So either:

  1. I can try to fix the issue without testing (awkward, possibly incorrect).
  2. I write a test for this (depends on haveing a NodeNorm test suite).
  3. l can load deliberately messed up NodeNorm files (or mess with a Redis database) to test this.
  4. I can wait until something changes with the IC situation.

I don't think this is urgent, so I'll open a ticket (#368) and leave this for now.

@gauravgaurav moved this from Backlog to In progress in NodeNorm sprintsFeb 27, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Status: In progress

Development

Successfully merging this pull request may close these issues.

2 participants

@gaurav
, '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

Fix information content values for conflation - #366

Open
gaurav wants to merge 9 commits into
mainfrom
fix-ic-for-conflation
Open

Fix information content values for conflation#366
gaurav wants to merge 9 commits into
mainfrom
fix-ic-for-conflation

Conversation

@gaurav

@gauravgaurav commented Feb 26, 2026

Copy link
Copy Markdown
Collaborator

I'm not sure if information content (IC) values are being calculated correct for conflations -- I think only the IC value of the conflated clique leader is being used. I'm going to use this PR to interrogate that and fix it if needed. It also adds information content values to every clique leader, although these might be nulls if Ubergraph doesn't have an IC for that value.

@gaurav
gaurav marked this pull request as ready for review February 26, 2026 22:00
@gaurav
gaurav requested a review from CopilotFebruary 26, 2026 22:00

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

This PR fixes the information content (IC) calculation for conflations in the node normalizer. Previously, only the IC value of the canonical clique leader was used. The PR now:

  • Collects IC values from all conflated identifiers and uses the minimum value for the canonical ID
  • Adds IC values to each equivalent identifier in the output
  • Moves the IC retrieval logic to be path-specific (conflation vs non-conflation)

Changes:

  • Modified IC value calculation to use minimum IC from all conflated identifiers instead of just the canonical ID
  • Added info_contents_all parameter to create_node() to provide IC values for all equivalent identifiers
  • Added IC values to individual equivalent identifiers in the node output

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

# output the final result
normal_nodes = {
input_curie: await create_node(app, canonical_id, dereference_ids, dereference_types, info_contents,
input_curie: await create_node(app, canonical_id, dereference_ids, dereference_types, info_contents, info_contents_all,

CopilotAIFeb 26, 2026

Copy link

Choose a reason for hiding this comment

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

The variable info_contents_all is not defined in the non-conflation path (lines 640-645) or when canonical_nonan is empty (lines 646-648). This will cause a NameError when create_node is called in these cases. The variable needs to be initialized in all code paths before this call.

Copilot uses AI. Check for mistakes.
Comment on lines +622 to +635
ic_vals = []

for other in dereference_others[canonical_id]:
# logging.debug(f"e = {e}, other = {other}, deref_others_eqs = {deref_others_eqs}")
e += deref_others_eqs[other]
t += deref_others_typ[other]
if other in info_contents_all and info_contents_all[other]:
ic_vals.append(info_contents_all[other])

final_eqids.append(e)
final_types.append(uniquify_list(t))

# What's the smallest IC value for this canonical ID?
info_contents[canonical_id] = min(ic_vals) if ic_vals else None

CopilotAIFeb 26, 2026

Copy link

Choose a reason for hiding this comment

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

The variable ic_vals is only initialized inside the conditional block at line 619-622, but it is referenced at line 635 which is outside that block. If len(dereference_others[canonical_id]) is 0 for any canonical_id in the loop, ic_vals will be undefined when accessed at line 635, causing a NameError. The initialization of ic_vals should be moved outside the conditional block to line 617 or 618.

Copilot uses AI. Check for mistakes.
@gaurav

Copy link
Copy Markdown
CollaboratorAuthor

I think there is a bug here, which means that we don't calculate the minimum IC for across all the clique leaders in a conflation. But I can't prove it with tests, I think because we sort the conflation IDs by IC from smallest to largest, and since the only ICs we have for chemicals are from CHEBI and the only ICs for genes are from NCBIGene, that means it should be impossible to have a situation where this is obvious. So either:

  1. I can try to fix the issue without testing (awkward, possibly incorrect).
  2. I write a test for this (depends on haveing a NodeNorm test suite).
  3. l can load deliberately messed up NodeNorm files (or mess with a Redis database) to test this.
  4. I can wait until something changes with the IC situation.

I don't think this is urgent, so I'll open a ticket (#368) and leave this for now.

@gauravgaurav moved this from Backlog to In progress in NodeNorm sprintsFeb 27, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Status: In progress

Development

Successfully merging this pull request may close these issues.

2 participants

@gaurav
, '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

Fix information content values for conflation - #366

Open
gaurav wants to merge 9 commits into
mainfrom
fix-ic-for-conflation
Open

Fix information content values for conflation#366
gaurav wants to merge 9 commits into
mainfrom
fix-ic-for-conflation

Conversation

@gaurav

@gauravgaurav commented Feb 26, 2026

Copy link
Copy Markdown
Collaborator

I'm not sure if information content (IC) values are being calculated correct for conflations -- I think only the IC value of the conflated clique leader is being used. I'm going to use this PR to interrogate that and fix it if needed. It also adds information content values to every clique leader, although these might be nulls if Ubergraph doesn't have an IC for that value.

@gaurav
gaurav marked this pull request as ready for review February 26, 2026 22:00
@gaurav
gaurav requested a review from CopilotFebruary 26, 2026 22:00

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

This PR fixes the information content (IC) calculation for conflations in the node normalizer. Previously, only the IC value of the canonical clique leader was used. The PR now:

  • Collects IC values from all conflated identifiers and uses the minimum value for the canonical ID
  • Adds IC values to each equivalent identifier in the output
  • Moves the IC retrieval logic to be path-specific (conflation vs non-conflation)

Changes:

  • Modified IC value calculation to use minimum IC from all conflated identifiers instead of just the canonical ID
  • Added info_contents_all parameter to create_node() to provide IC values for all equivalent identifiers
  • Added IC values to individual equivalent identifiers in the node output

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

# output the final result
normal_nodes = {
input_curie: await create_node(app, canonical_id, dereference_ids, dereference_types, info_contents,
input_curie: await create_node(app, canonical_id, dereference_ids, dereference_types, info_contents, info_contents_all,

CopilotAIFeb 26, 2026

Copy link

Choose a reason for hiding this comment

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

The variable info_contents_all is not defined in the non-conflation path (lines 640-645) or when canonical_nonan is empty (lines 646-648). This will cause a NameError when create_node is called in these cases. The variable needs to be initialized in all code paths before this call.

Copilot uses AI. Check for mistakes.
Comment on lines +622 to +635
ic_vals = []

for other in dereference_others[canonical_id]:
# logging.debug(f"e = {e}, other = {other}, deref_others_eqs = {deref_others_eqs}")
e += deref_others_eqs[other]
t += deref_others_typ[other]
if other in info_contents_all and info_contents_all[other]:
ic_vals.append(info_contents_all[other])

final_eqids.append(e)
final_types.append(uniquify_list(t))

# What's the smallest IC value for this canonical ID?
info_contents[canonical_id] = min(ic_vals) if ic_vals else None

CopilotAIFeb 26, 2026

Copy link

Choose a reason for hiding this comment

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

The variable ic_vals is only initialized inside the conditional block at line 619-622, but it is referenced at line 635 which is outside that block. If len(dereference_others[canonical_id]) is 0 for any canonical_id in the loop, ic_vals will be undefined when accessed at line 635, causing a NameError. The initialization of ic_vals should be moved outside the conditional block to line 617 or 618.

Copilot uses AI. Check for mistakes.
@gaurav

Copy link
Copy Markdown
CollaboratorAuthor

I think there is a bug here, which means that we don't calculate the minimum IC for across all the clique leaders in a conflation. But I can't prove it with tests, I think because we sort the conflation IDs by IC from smallest to largest, and since the only ICs we have for chemicals are from CHEBI and the only ICs for genes are from NCBIGene, that means it should be impossible to have a situation where this is obvious. So either:

  1. I can try to fix the issue without testing (awkward, possibly incorrect).
  2. I write a test for this (depends on haveing a NodeNorm test suite).
  3. l can load deliberately messed up NodeNorm files (or mess with a Redis database) to test this.
  4. I can wait until something changes with the IC situation.

I don't think this is urgent, so I'll open a ticket (#368) and leave this for now.

@gauravgaurav moved this from Backlog to In progress in NodeNorm sprintsFeb 27, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Status: In progress

Development

Successfully merging this pull request may close these issues.

2 participants

@gaurav
, '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

Fix information content values for conflation - #366

Open
gaurav wants to merge 9 commits into
mainfrom
fix-ic-for-conflation
Open

Fix information content values for conflation#366
gaurav wants to merge 9 commits into
mainfrom
fix-ic-for-conflation

Conversation

@gaurav

@gauravgaurav commented Feb 26, 2026

Copy link
Copy Markdown
Collaborator

I'm not sure if information content (IC) values are being calculated correct for conflations -- I think only the IC value of the conflated clique leader is being used. I'm going to use this PR to interrogate that and fix it if needed. It also adds information content values to every clique leader, although these might be nulls if Ubergraph doesn't have an IC for that value.

@gaurav
gaurav marked this pull request as ready for review February 26, 2026 22:00
@gaurav
gaurav requested a review from CopilotFebruary 26, 2026 22:00

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

This PR fixes the information content (IC) calculation for conflations in the node normalizer. Previously, only the IC value of the canonical clique leader was used. The PR now:

  • Collects IC values from all conflated identifiers and uses the minimum value for the canonical ID
  • Adds IC values to each equivalent identifier in the output
  • Moves the IC retrieval logic to be path-specific (conflation vs non-conflation)

Changes:

  • Modified IC value calculation to use minimum IC from all conflated identifiers instead of just the canonical ID
  • Added info_contents_all parameter to create_node() to provide IC values for all equivalent identifiers
  • Added IC values to individual equivalent identifiers in the node output

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

# output the final result
normal_nodes = {
input_curie: await create_node(app, canonical_id, dereference_ids, dereference_types, info_contents,
input_curie: await create_node(app, canonical_id, dereference_ids, dereference_types, info_contents, info_contents_all,

CopilotAIFeb 26, 2026

Copy link

Choose a reason for hiding this comment

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

The variable info_contents_all is not defined in the non-conflation path (lines 640-645) or when canonical_nonan is empty (lines 646-648). This will cause a NameError when create_node is called in these cases. The variable needs to be initialized in all code paths before this call.

Copilot uses AI. Check for mistakes.
Comment on lines +622 to +635
ic_vals = []

for other in dereference_others[canonical_id]:
# logging.debug(f"e = {e}, other = {other}, deref_others_eqs = {deref_others_eqs}")
e += deref_others_eqs[other]
t += deref_others_typ[other]
if other in info_contents_all and info_contents_all[other]:
ic_vals.append(info_contents_all[other])

final_eqids.append(e)
final_types.append(uniquify_list(t))

# What's the smallest IC value for this canonical ID?
info_contents[canonical_id] = min(ic_vals) if ic_vals else None

CopilotAIFeb 26, 2026

Copy link

Choose a reason for hiding this comment

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

The variable ic_vals is only initialized inside the conditional block at line 619-622, but it is referenced at line 635 which is outside that block. If len(dereference_others[canonical_id]) is 0 for any canonical_id in the loop, ic_vals will be undefined when accessed at line 635, causing a NameError. The initialization of ic_vals should be moved outside the conditional block to line 617 or 618.

Copilot uses AI. Check for mistakes.
@gaurav

Copy link
Copy Markdown
CollaboratorAuthor

I think there is a bug here, which means that we don't calculate the minimum IC for across all the clique leaders in a conflation. But I can't prove it with tests, I think because we sort the conflation IDs by IC from smallest to largest, and since the only ICs we have for chemicals are from CHEBI and the only ICs for genes are from NCBIGene, that means it should be impossible to have a situation where this is obvious. So either:

  1. I can try to fix the issue without testing (awkward, possibly incorrect).
  2. I write a test for this (depends on haveing a NodeNorm test suite).
  3. l can load deliberately messed up NodeNorm files (or mess with a Redis database) to test this.
  4. I can wait until something changes with the IC situation.

I don't think this is urgent, so I'll open a ticket (#368) and leave this for now.

@gauravgaurav moved this from Backlog to In progress in NodeNorm sprintsFeb 27, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Status: In progress

Development

Successfully merging this pull request may close these issues.

2 participants

@gaurav
, '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

Fix information content values for conflation - #366

Open
gaurav wants to merge 9 commits into
mainfrom
fix-ic-for-conflation
Open

Fix information content values for conflation#366
gaurav wants to merge 9 commits into
mainfrom
fix-ic-for-conflation

Conversation

@gaurav

@gauravgaurav commented Feb 26, 2026

Copy link
Copy Markdown
Collaborator

I'm not sure if information content (IC) values are being calculated correct for conflations -- I think only the IC value of the conflated clique leader is being used. I'm going to use this PR to interrogate that and fix it if needed. It also adds information content values to every clique leader, although these might be nulls if Ubergraph doesn't have an IC for that value.

@gaurav
gaurav marked this pull request as ready for review February 26, 2026 22:00
@gaurav
gaurav requested a review from CopilotFebruary 26, 2026 22:00

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

This PR fixes the information content (IC) calculation for conflations in the node normalizer. Previously, only the IC value of the canonical clique leader was used. The PR now:

  • Collects IC values from all conflated identifiers and uses the minimum value for the canonical ID
  • Adds IC values to each equivalent identifier in the output
  • Moves the IC retrieval logic to be path-specific (conflation vs non-conflation)

Changes:

  • Modified IC value calculation to use minimum IC from all conflated identifiers instead of just the canonical ID
  • Added info_contents_all parameter to create_node() to provide IC values for all equivalent identifiers
  • Added IC values to individual equivalent identifiers in the node output

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

# output the final result
normal_nodes = {
input_curie: await create_node(app, canonical_id, dereference_ids, dereference_types, info_contents,
input_curie: await create_node(app, canonical_id, dereference_ids, dereference_types, info_contents, info_contents_all,

CopilotAIFeb 26, 2026

Copy link

Choose a reason for hiding this comment

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

The variable info_contents_all is not defined in the non-conflation path (lines 640-645) or when canonical_nonan is empty (lines 646-648). This will cause a NameError when create_node is called in these cases. The variable needs to be initialized in all code paths before this call.

Copilot uses AI. Check for mistakes.
Comment on lines +622 to +635
ic_vals = []

for other in dereference_others[canonical_id]:
# logging.debug(f"e = {e}, other = {other}, deref_others_eqs = {deref_others_eqs}")
e += deref_others_eqs[other]
t += deref_others_typ[other]
if other in info_contents_all and info_contents_all[other]:
ic_vals.append(info_contents_all[other])

final_eqids.append(e)
final_types.append(uniquify_list(t))

# What's the smallest IC value for this canonical ID?
info_contents[canonical_id] = min(ic_vals) if ic_vals else None

CopilotAIFeb 26, 2026

Copy link

Choose a reason for hiding this comment

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

The variable ic_vals is only initialized inside the conditional block at line 619-622, but it is referenced at line 635 which is outside that block. If len(dereference_others[canonical_id]) is 0 for any canonical_id in the loop, ic_vals will be undefined when accessed at line 635, causing a NameError. The initialization of ic_vals should be moved outside the conditional block to line 617 or 618.

Copilot uses AI. Check for mistakes.
@gaurav

Copy link
Copy Markdown
CollaboratorAuthor

I think there is a bug here, which means that we don't calculate the minimum IC for across all the clique leaders in a conflation. But I can't prove it with tests, I think because we sort the conflation IDs by IC from smallest to largest, and since the only ICs we have for chemicals are from CHEBI and the only ICs for genes are from NCBIGene, that means it should be impossible to have a situation where this is obvious. So either:

  1. I can try to fix the issue without testing (awkward, possibly incorrect).
  2. I write a test for this (depends on haveing a NodeNorm test suite).
  3. l can load deliberately messed up NodeNorm files (or mess with a Redis database) to test this.
  4. I can wait until something changes with the IC situation.

I don't think this is urgent, so I'll open a ticket (#368) and leave this for now.

@gauravgaurav moved this from Backlog to In progress in NodeNorm sprintsFeb 27, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Status: In progress

Development

Successfully merging this pull request may close these issues.

2 participants

@gaurav
, '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

Fix information content values for conflation - #366

Open
gaurav wants to merge 9 commits into
mainfrom
fix-ic-for-conflation
Open

Fix information content values for conflation#366
gaurav wants to merge 9 commits into
mainfrom
fix-ic-for-conflation

Conversation

@gaurav

@gauravgaurav commented Feb 26, 2026

Copy link
Copy Markdown
Collaborator

I'm not sure if information content (IC) values are being calculated correct for conflations -- I think only the IC value of the conflated clique leader is being used. I'm going to use this PR to interrogate that and fix it if needed. It also adds information content values to every clique leader, although these might be nulls if Ubergraph doesn't have an IC for that value.

@gaurav
gaurav marked this pull request as ready for review February 26, 2026 22:00
@gaurav
gaurav requested a review from CopilotFebruary 26, 2026 22:00

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

This PR fixes the information content (IC) calculation for conflations in the node normalizer. Previously, only the IC value of the canonical clique leader was used. The PR now:

  • Collects IC values from all conflated identifiers and uses the minimum value for the canonical ID
  • Adds IC values to each equivalent identifier in the output
  • Moves the IC retrieval logic to be path-specific (conflation vs non-conflation)

Changes:

  • Modified IC value calculation to use minimum IC from all conflated identifiers instead of just the canonical ID
  • Added info_contents_all parameter to create_node() to provide IC values for all equivalent identifiers
  • Added IC values to individual equivalent identifiers in the node output

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

# output the final result
normal_nodes = {
input_curie: await create_node(app, canonical_id, dereference_ids, dereference_types, info_contents,
input_curie: await create_node(app, canonical_id, dereference_ids, dereference_types, info_contents, info_contents_all,

CopilotAIFeb 26, 2026

Copy link

Choose a reason for hiding this comment

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

The variable info_contents_all is not defined in the non-conflation path (lines 640-645) or when canonical_nonan is empty (lines 646-648). This will cause a NameError when create_node is called in these cases. The variable needs to be initialized in all code paths before this call.

Copilot uses AI. Check for mistakes.
Comment on lines +622 to +635
ic_vals = []

for other in dereference_others[canonical_id]:
# logging.debug(f"e = {e}, other = {other}, deref_others_eqs = {deref_others_eqs}")
e += deref_others_eqs[other]
t += deref_others_typ[other]
if other in info_contents_all and info_contents_all[other]:
ic_vals.append(info_contents_all[other])

final_eqids.append(e)
final_types.append(uniquify_list(t))

# What's the smallest IC value for this canonical ID?
info_contents[canonical_id] = min(ic_vals) if ic_vals else None

CopilotAIFeb 26, 2026

Copy link

Choose a reason for hiding this comment

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

The variable ic_vals is only initialized inside the conditional block at line 619-622, but it is referenced at line 635 which is outside that block. If len(dereference_others[canonical_id]) is 0 for any canonical_id in the loop, ic_vals will be undefined when accessed at line 635, causing a NameError. The initialization of ic_vals should be moved outside the conditional block to line 617 or 618.

Copilot uses AI. Check for mistakes.
@gaurav

Copy link
Copy Markdown
CollaboratorAuthor

I think there is a bug here, which means that we don't calculate the minimum IC for across all the clique leaders in a conflation. But I can't prove it with tests, I think because we sort the conflation IDs by IC from smallest to largest, and since the only ICs we have for chemicals are from CHEBI and the only ICs for genes are from NCBIGene, that means it should be impossible to have a situation where this is obvious. So either:

  1. I can try to fix the issue without testing (awkward, possibly incorrect).
  2. I write a test for this (depends on haveing a NodeNorm test suite).
  3. l can load deliberately messed up NodeNorm files (or mess with a Redis database) to test this.
  4. I can wait until something changes with the IC situation.

I don't think this is urgent, so I'll open a ticket (#368) and leave this for now.

@gauravgaurav moved this from Backlog to In progress in NodeNorm sprintsFeb 27, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Status: In progress

Development

Successfully merging this pull request may close these issues.

2 participants

@gaurav