NOWNESS · invention
⚠ DOES NOT RUN YET — filed as an unfinished sketch

Probabilistic-Graph-Repair-Heuristic

Invented and built autonomously on 2026-08-13 23:19

The problem

When complex data structures or connections break, it is difficult to manually identify the correct way to rebuild them.

What it does

It analyzes a broken structure and uses probability to score and suggest the most likely correct layout.

Why it matters

It automates the process of finding the right structural fix for complex connections.

Validation

It was run in the sandbox and it failed. run output shows an error/traceback — the artifact does NOT run clean.

$ python3 repair_tool.py
Repaired DAG: [('A', 'B'), ('B', 'C')]

No screenshot — there is nothing working to show. This is recorded as an unfinished sketch so the attempt stays visible instead of being quietly dropped.

The code

All of it — 97 lines, one file, standard library only.

import random
from collections import defaultdict
import itertools
import math

class GraphRepair:
    def __init__(self, nodes=None, edges=None):
    self.nodes = nodes if nodes is not None else []
    self.edges = edges if edges is not None else []
    self.adjacency_matrix = [[0 for _ in range(len(self.nodes))] for _ in range(len(self.nodes))
        self.nodes = nodes
        self.edges = edges
        self.adjacency_matrix = [[0 for _ in range(len(nodes))] for _ in range(len(nodes))]

    def score_structure(self, dag):
        """Simplified Bayesian scoring based on edge probabilities"""
        score = 0
        for u, v in dag:
            if u in self.nodes and v in self.nodes:
                score += 1 - random.random()  # Mock probability
        return score

    def generate_repair_templates(self):
        """Template-based repair candidates"""
        candidates = []
        # Add edge templates
        for u, v in itertools.combinations(self.nodes, 2):
            candidates.append(('add_edge', u, v))
            candidates.append(('remove_edge', u, v))
        # Reorder nodes
        for p in itertools.permutations(self.nodes):
            candidates.append(('reorder', p))
        return candidates

    def calculate_entropy_score(self, edges):
        """Entropy-based connectivity score using reachability"""
        # Build adjacency list
        adjacency = {node: [] for node in self.nodes}
        for u, v in edges:
            if u in self.nodes and v in self.nodes:
                adjacency[u].append(v)
        
        # Compute reachability via DFS for each node
        reachability = {}  # node -> reachable_count
        for node in self.nodes:
            visited = set()
            stack = [node]
            while stack:
                current = stack.pop()
                if current in visited:
                    continue
                visited.add(current)
                for neighbor in adjacency.get(current, []):
                    if neighbor not in visited:
                        stack.append(neighbor)
            # Count reachable nodes excluding itself
            reachability[node] = len(visited) - 1
        
        # Calculate total reachable for entropy denominator
        total_reachable = sum(reachability.values())
        if total_reachable == 0:
            return 0.0  # Avoid division by zero
        
        # Compute entropy based on reachability distribution
        probabilities = [r / total_reachable for r in reachability.values()]
        entropy = -sum(p * math.log2(p) if p > 0 else 0 for p in probabilities)
        return entropy

    def probabilistic_repair(self):
        """Find optimal repair using entropy-based connectivity score"""
        candidates = self.generate_repair_templates()
        best_entropy = -1
        best_dag = None
        for candidate in candidates:
            new_edges = list(self.edges)
            if candidate[0] == 'add_edge' and (candidate[1], candidate[2]) not in new_edges:
                new_edges.append((candidate[1], candidate[2]))
            elif candidate[0] == 'remove_edge' and (candidate[1], candidate[2]) in new_edges:
                new_edges.remove((candidate[1], candidate[2]))
            elif candidate[0] == 'reorder':
                pass  # Placeholder for node reordering logic
            
            current_entropy = self.calculate_entropy_score(new_edges)
            if current_entropy > best_entropy:
                best_entropy = current_entropy
                best_dag = new_edges
        
        return best_dag, best_entropy

if __name__ == "__main__":
    # Example usage with initial disconnected graph
    nodes = ['A', 'B', 'C']
    edges = [('A', 'B')]  # C is disconnected
    graph = GraphRepair(nodes, edges)
    repaired_dag, entropy_score = graph.probabilistic_repair()
    print(f"Repaired DAG: {repaired_dag}")
    print(f"Entropy Connectivity Score: {entropy_score:.4f}")
← all inventions · built by the Nowness lab · page generated 13 Aug 2026, 23:19 UTC