penrose / penrose

Create beautiful diagrams just by typing notation in plain text.

Home Page:https://penrose.cs.cmu.edu

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

CompileError: WebAssembly.compile(): Compiling function #71 failed: local count too large @+22906

Johnicholas opened this issue · comments

While working on graph drawing in https://penrose.cs.cmu.edu/try/, today, I pressed compile and nothing changed. Looking at the JS console, I see "Uncaught (in promise) CompileError: WebAssembly.compile(): Compiling function #71 failed: local count too large @+22906" in red.

Domain:

type Node
type Edge

constructor MakeEdge(Node a, Node b) -> Edge

Substance:

Node b010
Node b032
Node b131
Node b031
Node b130
Node b012
Node b111
Node b133
Node a120
Node b011
Node b033
Node b110
Node b132
Node a121
Node b030
Node b113
Node a122
Node a100
Node b013
Node b112
Node a123
Node a101
Node a102
Node a103
Node b021
Node b120
Node b020
Node a130
Node b023
Node b122
Node a131
Node b001
Node b100
Node b022
Node b121
Node a110
Node a132
Node b000
Node a111
Node a133
Node b003
Node b102
Node b123
Node a112
Node b002
Node b101
Node a113
Node b103
Edge e0 := MakeEdge(b010, b000)
Edge e1 := MakeEdge(b032, b022)
Edge e2 := MakeEdge(b131, b121)
Edge e3 := MakeEdge(b031, b021)
Edge e4 := MakeEdge(b130, b120)
Edge e5 := MakeEdge(b012, b002)
Edge e6 := MakeEdge(b111, b101)
Edge e7 := MakeEdge(b133, b123)
Edge e8 := MakeEdge(a120, a110)
Edge e9 := MakeEdge(b011, b001)
Edge e10 := MakeEdge(b033, b023)
Edge e11 := MakeEdge(b110, b100)
Edge e12 := MakeEdge(b132, b122)
Edge e13 := MakeEdge(a121, a111)
Edge e14 := MakeEdge(b030, b020)
Edge e15 := MakeEdge(b113, b103)
Edge e16 := MakeEdge(a122, a112)
Edge e17 := MakeEdge(b013, b003)
Edge e18 := MakeEdge(b112, b102)
Edge e19 := MakeEdge(a123, a113)
Edge e20 := MakeEdge(b021, b011)
Edge e21 := MakeEdge(b120, b110)
Edge e22 := MakeEdge(b020, b010)
Edge e23 := MakeEdge(a130, a120)
Edge e24 := MakeEdge(b023, b013)
Edge e25 := MakeEdge(b122, b112)
Edge e26 := MakeEdge(a131, a121)
Edge e27 := MakeEdge(b001, b131)
Edge e28 := MakeEdge(b100, a130)
Edge e29 := MakeEdge(b022, b012)
Edge e30 := MakeEdge(b121, b111)
Edge e31 := MakeEdge(a110, a100)
Edge e32 := MakeEdge(a132, a122)
Edge e33 := MakeEdge(b000, b130)
Edge e34 := MakeEdge(a111, a101)
Edge e35 := MakeEdge(a133, a123)
Edge e36 := MakeEdge(b003, b133)
Edge e37 := MakeEdge(b102, a132)
Edge e38 := MakeEdge(b123, b113)
Edge e39 := MakeEdge(a112, a102)
Edge e40 := MakeEdge(b002, b132)
Edge e41 := MakeEdge(b101, a131)
Edge e42 := MakeEdge(a113, a103)
Edge e43 := MakeEdge(b103, a133)
Edge e44 := MakeEdge(b131, b130)
Edge e46 := MakeEdge(b032, b031)
Edge e47 := MakeEdge(b130, b033)
Edge e48 := MakeEdge(b031, b030)
Edge e49 := MakeEdge(b111, b110)
Edge e50 := MakeEdge(b133, b132)
Edge e51 := MakeEdge(a120, b123)
Edge e52 := MakeEdge(b012, b011)
Edge e53 := MakeEdge(a121, a120)
Edge e54 := MakeEdge(b132, b131)
Edge e55 := MakeEdge(b110, b013)
Edge e56 := MakeEdge(b011, b010)
Edge e57 := MakeEdge(b033, b032)
Edge e59 := MakeEdge(a122, a121)
Edge e60 := MakeEdge(b113, b112)
Edge e61 := MakeEdge(a100, b103)
Edge e62 := MakeEdge(a101, a100)
Edge e63 := MakeEdge(a123, a122)
Edge e64 := MakeEdge(b112, b111)
Edge e65 := MakeEdge(b013, b012)
Edge e66 := MakeEdge(a102, a101)
Edge e67 := MakeEdge(a103, a102)
Edge e68 := MakeEdge(b120, b023)
Edge e69 := MakeEdge(b021, b020)
Edge e70 := MakeEdge(a130, b133)
Edge e72 := MakeEdge(a131, a130)
Edge e73 := MakeEdge(b122, b121)
Edge e74 := MakeEdge(b100, b003)
Edge e75 := MakeEdge(b001, b000)
Edge e76 := MakeEdge(b023, b022)
Edge e77 := MakeEdge(a132, a131)
Edge e78 := MakeEdge(b121, b120)
Edge e79 := MakeEdge(a110, b113)
Edge e81 := MakeEdge(b022, b021)
Edge e82 := MakeEdge(a111, a110)
Edge e83 := MakeEdge(a133, a132)
Edge e84 := MakeEdge(b102, b101)
Edge e85 := MakeEdge(b003, b002)
Edge e86 := MakeEdge(a112, a111)
Edge e87 := MakeEdge(b101, b100)
Edge e88 := MakeEdge(b123, b122)
Edge e89 := MakeEdge(b002, b001)
Edge e90 := MakeEdge(a113, a112)
Edge e91 := MakeEdge(b103, b102)

Style:

canvas {
width = 400
height = 400
}

layout = [earlier, middle, later]

global {
dist = 50
}

forall Node n {
n.center = (? in earlier, ? in earlier, ? in earlier)
n.normsq = normsq(n.center)
n.projectedCenter = (? in [middle, later], ? in [middle, later])
encourage vdist(n.projectedCenter, (n.center[0], n.center[1])) == 0 in [middle, later]
n.icon = Circle {
center: n.projectedCenter
r: 6
strokeWidth: 3
}
}

forall Edge e; Node a; Node b
where e := MakeEdge(a, b) {
e.distsq = vdistsq(a.center, b.center)
e.dist = vdist(a.center, b.center)
e.energy = sqr(e.dist - global.dist)
e.icon = Line {
start: a.icon.center
end: b.icon.center
}
}

forall Node n; Edge e {
e.icon below n.icon
}

forall Node n1; Node n2 {
-- encourage notTooClose(n1.icon, n2.icon) in later
-- ensure disjoint(n1.icon, n2.icon) in later
}

collect Node n into nodes {
normsqs = listof normsq from nodes
centers = listof center from nodes
scalar scale = (canvas.width / 5) * (canvas.height / 5)
ensure sum(normsqs) / count(normsqs) == scale in earlier
ensure norm(sumVectors(centers)) == 0 in earlier

projectedCenters = listof projectedCenter from nodes
encourage tsneEnergy(centers, projectedCenters) == 0 in later

}

collect Edge e into edges
where e := MakeEdge(a, b)
foreach Node a; Node b {
distsqs = listof distsq from edges
encourage sum(distsqs) == 0 in earlier
-- energies = listof energy from edges
-- encourage sum(energies) == 0 in later
}

I believe Penrose is compiling to something (an intermediate representation), and then using something else (WebAssembly.compile?) to compile that to a runnable form. I think the error is coming from the second compile. I expect the first stage compile to either anticipate these sort of problems, and generate its own (visible) errors, or at least pass the second stage compile's error messages back to be visible somewhere.

  • OS: Windows10
  • Browser: Chrome 115.0.5790.171 (Official Build) (64-bit) (cohort: Stable)

Ah OK, this is an error I've seen before. The ultimate solution to this will be Rose, but in the shorter term, we should catch errors like this to surface to the user in a more comprehensible way than the browser console.

Anyways: unfortunately at the moment the only way to resolve this is to make your Penrose program smaller / less complex :/

Update on this: integration with Rose (#1636) is underway. It would be good to know the limits of the compilation target so we can potentially catch errors a little earlier in the Style compiler.