Skip to content

Commit 04e20be

Browse files
committed
work in progress, sort of working
1 parent dd064b9 commit 04e20be

File tree

1 file changed

+67
-51
lines changed

1 file changed

+67
-51
lines changed

contour.js

+67-51
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
"use strict"
22

33
//DEBUG
4-
//var beautify = require("js-beautify")
4+
var beautify = require("js-beautify")
55

66
var pool = require("typedarray-pool")
77
var gray = require("gray-code")
8+
var invert = require("invert-permutation")
89

910
module.exports = createSurfaceExtractor
1011

@@ -76,10 +77,25 @@ function fixPerm(face, dimension, k) {
7677
return x
7778
}
7879

80+
function permBitmask(dimension, mask, order) {
81+
var r = 0
82+
for(var i=0; i<dimension; ++i) {
83+
if(mask & (1<<i)) {
84+
r |= (1<<order[i])
85+
}
86+
}
87+
return r
88+
}
89+
7990
//Generates the surface procedure
8091
function compileSurfaceProcedure(vertexFunc, faceFunc, phaseFunc, scalarArgs, order, typesig) {
8192
var arrayArgs = typesig.length
8293
var dimension = order.length
94+
var invOrder = invert(order)
95+
96+
if(dimension < 2) {
97+
throw new Error("ndarray-extract-contour: Dimension must be at least 2")
98+
}
8399

84100
var funcName = "extractContour" + order.join("_")
85101
var code = []
@@ -126,7 +142,7 @@ function compileSurfaceProcedure(vertexFunc, faceFunc, phaseFunc, scalarArgs, or
126142
for(var j=0; j<dimension; ++j) {
127143
var stepVal = [ stride(i,order[j]) ]
128144
for(var k=j-1; k>=0; --k) {
129-
stepVal.push(stride(i, order[k]) + "*" + shape(order[k]))
145+
stepVal.push(stride(i, order[k]) + "*" + shape(order[k]) )
130146
}
131147
vars.push(step(i,order[j]) + "=(" + stepVal.join("-") + ")|0")
132148
}
@@ -152,37 +168,24 @@ function compileSurfaceProcedure(vertexFunc, faceFunc, phaseFunc, scalarArgs, or
152168
for(var j=1; j<(1<<dimension); ++j) {
153169
var cubeDelta = []
154170
var cubeStep = [ ]
155-
for(var k=dimension-1; k>=0; --k) {
171+
for(var k=0; k<dimension; ++k) {
156172
if(j & (1<<k)) {
157173
if(cubeStep.length === 0) {
158174
cubeDelta.push("1")
159175
} else {
160-
cubeDelta.push(cubeStep.join("*"))
176+
cubeDelta.unshift(cubeStep.join("*"))
161177
}
162178
}
163179
cubeStep.push(shape(order[k]))
164180
}
165-
vars.push(pdelta(j) + "=(-" + cubeDelta.join("-") + ")|0",
166-
pcube(j) + "=0")
167-
}
168-
for(var j=1; j<(1<<dimension); ++j) {
169-
var cubeDelta = []
170-
var cubeStep = [ ]
171-
for(var k=dimension-1; k>=0; --k) {
172-
if(j & (1<<k)) {
173-
if(cubeStep.length === 0) {
174-
cubeDelta.push("1")
175-
} else {
176-
if(k === 0) {
177-
cubeDelta.push("-" + cubeStep.join("*"))
178-
} else {
179-
cubeDelta.push(cubeStep.join("*"))
180-
}
181-
}
182-
}
183-
cubeStep.push(shape(order[k]))
181+
var signFlag = ""
182+
if(cubeDelta[0].indexOf(shape(order[dimension-2])) < 0) {
183+
signFlag = "-"
184184
}
185-
vars.push(qcube(j) + "=-(" + cubeDelta.join("+") + ")|0")
185+
var jperm = permBitmask(dimension, j, order)
186+
vars.push(pdelta(jperm) + "=(-" + cubeDelta.join("-") + ")|0",
187+
qcube(jperm) + "=(" + signFlag + cubeDelta.join("-") + ")|0",
188+
pcube(jperm) + "=0")
186189
}
187190
vars.push(vert(0) + "=0", TEMPORARY)
188191

@@ -211,9 +214,11 @@ function compileSurfaceProcedure(vertexFunc, faceFunc, phaseFunc, scalarArgs, or
211214
phaseFuncArgs.push(data(i) + "[" + pointer(i) + "]")
212215
}
213216
}
214-
for(var i=0; j<scalarArgs; ++i) {
217+
for(var i=0; i<scalarArgs; ++i) {
215218
phaseFuncArgs.push(scalar(i))
216219
}
220+
//code.push("console.log('o',p0,X,e1,e2,e3);")
221+
217222
code.push(PHASES, "[", POINTER, "++]=phase(", phaseFuncArgs.join(), ");")
218223
for(var i=0; i<k; ++i) {
219224
forLoopEnd(i)
@@ -238,9 +243,11 @@ function compileSurfaceProcedure(vertexFunc, faceFunc, phaseFunc, scalarArgs, or
238243
for(var i=0; i<arrayArgs; ++i) {
239244
phaseFuncArgs.push(cube(i,0))
240245
}
241-
for(var i=0; j<scalarArgs; ++i) {
246+
for(var i=0; i<scalarArgs; ++i) {
242247
phaseFuncArgs.push(scalar(i))
243248
}
249+
//code.push("console.log(p0,X,e1,e2,e3);")
250+
244251
code.push(pcube(0), "=", PHASES, "[", POINTER, "]=phase(", phaseFuncArgs.join(), ");")
245252

246253
//Read in other cube data
@@ -271,47 +278,54 @@ function compileSurfaceProcedure(vertexFunc, faceFunc, phaseFunc, scalarArgs, or
271278
vertexArgs.push(cube(i,j))
272279
}
273280
}
274-
for(var i=0; i<scalarArgs; ++i) {
275-
vertexArgs.push(scalar(i))
276-
}
277281
for(var i=0; i<(1<<dimension); ++i) {
278282
vertexArgs.push(pcube(i))
279283
}
284+
for(var i=0; i<scalarArgs; ++i) {
285+
vertexArgs.push(scalar(i))
286+
}
280287

281288
//Generate vertex
289+
code.push("console.log('callv:',i0,i1,N,X,p0,e1,e2,e3,d0_1,d0_2,d0_3);")
282290
code.push("vertex(", vertexArgs.join(), ");",
283291
vert(0), "=", VERTEX_IDS, "[", POINTER, "]=", VERTEX_COUNT, "++;")
284292

285293
//Check for face crossings
286-
if(mask < (1<<dimension)-1) {
287-
var corner = pcube((1<<dimension)-1)
288-
for(var j=0; j<dimension; ++j) {
289-
if(!(mask & (1<<j))) {
290-
//Check face
291-
var subset = ((1<<dimension)-1)^(1<<j)
292-
var edge = pcube(subset)
293-
var faceArgs = [ ]
294-
for(var k=subset; k>0; k=(k-1)&subset) {
295-
faceArgs.push(VERTEX_IDS + "[" + POINTER + "+" + pdelta(k) + "]")
296-
}
297-
faceArgs.push(vert(0))
298-
faceArgs = fixPerm(faceArgs, dimension, j)
299-
faceArgs.push(corner, edge)
300-
code.push("if(", corner, "!==", edge, "){",
301-
"face(", faceArgs.join(), ")}")
294+
var base = (1<<dimension)-1
295+
var corner = pcube(base)
296+
for(var j=0; j<dimension; ++j) {
297+
if((mask & ~(1<<j))===0) {
298+
//Check face
299+
var subset = base^(1<<j)
300+
var edge = pcube(subset)
301+
var faceArgs = [ ]
302+
for(var k=subset; k>0; k=(k-1)&subset) {
303+
faceArgs.push(VERTEX_IDS + "[" + POINTER + "+" + pdelta(k) + "]")
304+
}
305+
faceArgs.push(vert(0))
306+
faceArgs = fixPerm(faceArgs, dimension, j)
307+
for(var k=0; k<arrayArgs; ++k) {
308+
faceArgs.push(cube(k,base), cube(k,subset))
309+
}
310+
faceArgs.push(corner, edge)
311+
for(var k=0; k<scalarArgs; ++k) {
312+
faceArgs.push(scalar(k))
302313
}
314+
code.push("if(", corner, "!==", edge, "){",
315+
"console.log('face', i0,i1, ",j,",",mask,");",
316+
"face(", faceArgs.join(), ")}")
303317
}
304318
}
305-
319+
306320
//Increment pointer, close off if statement
307321
code.push("}",
308322
POINTER, "+=1;")
309323
}
310324

311325
function flip() {
312326
for(var j=1; j<(1<<dimension); ++j) {
313-
code.push(TEMPORARY, "=", pcube(j), ";",
314-
pcube(j), "=", qcube(j), ";",
327+
code.push(TEMPORARY, "=", pdelta(j), ";",
328+
pdelta(j), "=", qcube(j), ";",
315329
qcube(j), "=", TEMPORARY, ";")
316330
}
317331
}
@@ -322,10 +336,12 @@ function compileSurfaceProcedure(vertexFunc, faceFunc, phaseFunc, scalarArgs, or
322336
return
323337
}
324338
fillEmptySlice(i)
325-
code.push("if(", shape(order[i]), ">0){")
326-
createLoop(i-1, mask|(1<<i))
339+
code.push("if(", shape(order[i]), ">0){",
340+
index(order[i]), "=1;")
341+
createLoop(i-1, mask|(1<<order[i]))
342+
327343
for(var j=0; j<arrayArgs; ++j) {
328-
code.push(pointer(j), "+=", step(j,i), ";")
344+
code.push(pointer(j), "+=", step(j,order[i]), ";")
329345
}
330346
if(i === dimension-1) {
331347
code.push(POINTER, "=0;")

0 commit comments

Comments
 (0)