1
1
"use strict"
2
2
3
3
//DEBUG
4
- // var beautify = require("js-beautify")
4
+ var beautify = require ( "js-beautify" )
5
5
6
6
var pool = require ( "typedarray-pool" )
7
7
var gray = require ( "gray-code" )
8
+ var invert = require ( "invert-permutation" )
8
9
9
10
module . exports = createSurfaceExtractor
10
11
@@ -76,10 +77,25 @@ function fixPerm(face, dimension, k) {
76
77
return x
77
78
}
78
79
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
+
79
90
//Generates the surface procedure
80
91
function compileSurfaceProcedure ( vertexFunc , faceFunc , phaseFunc , scalarArgs , order , typesig ) {
81
92
var arrayArgs = typesig . length
82
93
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
+ }
83
99
84
100
var funcName = "extractContour" + order . join ( "_" )
85
101
var code = [ ]
@@ -126,7 +142,7 @@ function compileSurfaceProcedure(vertexFunc, faceFunc, phaseFunc, scalarArgs, or
126
142
for ( var j = 0 ; j < dimension ; ++ j ) {
127
143
var stepVal = [ stride ( i , order [ j ] ) ]
128
144
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 ] ) )
130
146
}
131
147
vars . push ( step ( i , order [ j ] ) + "=(" + stepVal . join ( "-" ) + ")|0" )
132
148
}
@@ -152,37 +168,24 @@ function compileSurfaceProcedure(vertexFunc, faceFunc, phaseFunc, scalarArgs, or
152
168
for ( var j = 1 ; j < ( 1 << dimension ) ; ++ j ) {
153
169
var cubeDelta = [ ]
154
170
var cubeStep = [ ]
155
- for ( var k = dimension - 1 ; k >= 0 ; -- k ) {
171
+ for ( var k = 0 ; k < dimension ; ++ k ) {
156
172
if ( j & ( 1 << k ) ) {
157
173
if ( cubeStep . length === 0 ) {
158
174
cubeDelta . push ( "1" )
159
175
} else {
160
- cubeDelta . push ( cubeStep . join ( "*" ) )
176
+ cubeDelta . unshift ( cubeStep . join ( "*" ) )
161
177
}
162
178
}
163
179
cubeStep . push ( shape ( order [ k ] ) )
164
180
}
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 = "-"
184
184
}
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" )
186
189
}
187
190
vars . push ( vert ( 0 ) + "=0" , TEMPORARY )
188
191
@@ -211,9 +214,11 @@ function compileSurfaceProcedure(vertexFunc, faceFunc, phaseFunc, scalarArgs, or
211
214
phaseFuncArgs . push ( data ( i ) + "[" + pointer ( i ) + "]" )
212
215
}
213
216
}
214
- for ( var i = 0 ; j < scalarArgs ; ++ i ) {
217
+ for ( var i = 0 ; i < scalarArgs ; ++ i ) {
215
218
phaseFuncArgs . push ( scalar ( i ) )
216
219
}
220
+ //code.push("console.log('o',p0,X,e1,e2,e3);")
221
+
217
222
code . push ( PHASES , "[" , POINTER , "++]=phase(" , phaseFuncArgs . join ( ) , ");" )
218
223
for ( var i = 0 ; i < k ; ++ i ) {
219
224
forLoopEnd ( i )
@@ -238,9 +243,11 @@ function compileSurfaceProcedure(vertexFunc, faceFunc, phaseFunc, scalarArgs, or
238
243
for ( var i = 0 ; i < arrayArgs ; ++ i ) {
239
244
phaseFuncArgs . push ( cube ( i , 0 ) )
240
245
}
241
- for ( var i = 0 ; j < scalarArgs ; ++ i ) {
246
+ for ( var i = 0 ; i < scalarArgs ; ++ i ) {
242
247
phaseFuncArgs . push ( scalar ( i ) )
243
248
}
249
+ //code.push("console.log(p0,X,e1,e2,e3);")
250
+
244
251
code . push ( pcube ( 0 ) , "=" , PHASES , "[" , POINTER , "]=phase(" , phaseFuncArgs . join ( ) , ");" )
245
252
246
253
//Read in other cube data
@@ -271,47 +278,54 @@ function compileSurfaceProcedure(vertexFunc, faceFunc, phaseFunc, scalarArgs, or
271
278
vertexArgs . push ( cube ( i , j ) )
272
279
}
273
280
}
274
- for ( var i = 0 ; i < scalarArgs ; ++ i ) {
275
- vertexArgs . push ( scalar ( i ) )
276
- }
277
281
for ( var i = 0 ; i < ( 1 << dimension ) ; ++ i ) {
278
282
vertexArgs . push ( pcube ( i ) )
279
283
}
284
+ for ( var i = 0 ; i < scalarArgs ; ++ i ) {
285
+ vertexArgs . push ( scalar ( i ) )
286
+ }
280
287
281
288
//Generate vertex
289
+ code . push ( "console.log('callv:',i0,i1,N,X,p0,e1,e2,e3,d0_1,d0_2,d0_3);" )
282
290
code . push ( "vertex(" , vertexArgs . join ( ) , ");" ,
283
291
vert ( 0 ) , "=" , VERTEX_IDS , "[" , POINTER , "]=" , VERTEX_COUNT , "++;" )
284
292
285
293
//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 ) )
302
313
}
314
+ code . push ( "if(" , corner , "!==" , edge , "){" ,
315
+ "console.log('face', i0,i1, " , j , "," , mask , ");" ,
316
+ "face(" , faceArgs . join ( ) , ")}" )
303
317
}
304
318
}
305
-
319
+
306
320
//Increment pointer, close off if statement
307
321
code . push ( "}" ,
308
322
POINTER , "+=1;" )
309
323
}
310
324
311
325
function flip ( ) {
312
326
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 ) , ";" ,
315
329
qcube ( j ) , "=" , TEMPORARY , ";" )
316
330
}
317
331
}
@@ -322,10 +336,12 @@ function compileSurfaceProcedure(vertexFunc, faceFunc, phaseFunc, scalarArgs, or
322
336
return
323
337
}
324
338
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
+
327
343
for ( var j = 0 ; j < arrayArgs ; ++ j ) {
328
- code . push ( pointer ( j ) , "+=" , step ( j , i ) , ";" )
344
+ code . push ( pointer ( j ) , "+=" , step ( j , order [ i ] ) , ";" )
329
345
}
330
346
if ( i === dimension - 1 ) {
331
347
code . push ( POINTER , "=0;" )
0 commit comments