@@ -40,11 +40,6 @@ iterator neighbours*[T](grid: RbfGrid[T], k: int, searchLevels: int = 1): int =
4040 break loopBody
4141 elif (k div step) mod grid.gridSize == grid.gridSize - level and x >= level:
4242 break loopBody
43- #[ if ((k div step) mod grid.gridSize == 0 and x == -1) or ((k div step) mod grid.gridSize == 1 and x == -2):
44- break loopBody
45- elif (k div step) mod grid.gridSize == grid.gridSize - 1 and x == 1:
46- break loopBody
47- else: ]#
4843 kNeigh += x * step
4944 if kNeigh >= 0 and kNeigh < grid.gridSize ^ grid.gridDim:
5045 yield kNeigh
@@ -149,11 +144,17 @@ proc scalePoint*(x: Tensor[float], limits: tuple[upper: Tensor[float], lower: Te
149144 (x -. lower) /. (upper - lower)
150145
151146proc newRbf * [T](points: Tensor [float ], values: Tensor [T], gridSize: int = 0 , rbfFunc: RbfFunc = compactRbfFunc, epsilon: float = 1 ): RbfType [T] =
147+ # # Construct a Radial basis function interpolator using Partition of Unity.
148+ # # points: The positions of the data points. Shape: (nPoints, nDims)
149+ # # values: The values at the points. Can be multivalued. Shape: (nPoints, nValues)
150+ # # gridSize: The number of cells along each dimension. Setting it to the default 0 will automatically choose a value based on the number of points.
151+ # # rbfFunc: The RBF function that accepts shape parameter. Default is a C^2 compactly supported function.
152+ # # epsilon: shape parameter. Default 1.
152153 assert points.shape[0 ] == values.shape[0 ]
153154 assert points.shape.len == 2 and values.shape.len == 2
154155 let upperLimit = max (points, 0 )
155156 let lowerLimit = min (points, 0 )
156- let limits = (upper: upperLimit, lower: lowerLimit) # move this buff to scalePoint
157+ let limits = (upper: upperLimit, lower: lowerLimit)
157158 let scaledPoints = points.scalePoint (limits)
158159 let dataGrid = newRbfGrid (scaledPoints, values, gridSize)
159160 let patchPoints = dataGrid.constructMeshedPatches ()
@@ -190,7 +191,7 @@ proc eval*[T](rbf: RbfType[T], x: Tensor[float]): Tensor[T] =
190191 result [row, _] = result [row, _] + ci * val
191192 result [row, _] = result [row, _] / c
192193 else :
193- result [row, _] = T (Nan ) # allow to pass default value to newRbfPU ?
194+ result [row, _] = T (Nan ) # allow to pass default value to newRbf ?
194195
195196proc evalAlt * [T](rbf: RbfType [T], x: Tensor [float ]): Tensor [T] =
196197 assert x.shape.len == 2
@@ -217,42 +218,3 @@ proc evalAlt*[T](rbf: RbfType[T], x: Tensor[float]): Tensor[T] =
217218
218219 result /.= c
219220 result [not isSet, _] = T (NaN )
220-
221- when isMainModule :
222- let x1 = @ [@ [0.01 , 0.01 , 0.01 ], @ [1.0 , 1.0 , 0.0 ], @ [1.0 , 2.0 , 4.0 ]].toTensor
223- let x2 = @ [@ [0.0 , 0.0 , 1.0 ], @ [1.0 , 1.0 , 2.0 ], @ [1.0 , 2.0 , 3.0 ]].toTensor
224- # echo distanceMatrix(x1, x1)
225- let values = @ [0.1 , 1.0 , 2.0 ].toTensor.unsqueeze (1 )
226- # echo newRbf(x1, values, epsilon=10)
227-
228- import benchy
229-
230- var pos = randomTensor (100000 , 3 , 1.0 )
231- pos[0 , _] = [[1.0 , 1.0 , 1.0 ]]
232- pos[1 , _] = [[0.0 , 0.0 , 0.0 ]]
233- let vals = randomTensor (100000 , 1 , 1.0 )
234- let evalPos = randomTensor (100000 , 3 , 0.9 )
235- # let rb = newRbf(pos, vals)
236- # let rbPU = newRbfPu(pos, vals)
237- # timeIt "RbfPU eval":
238- # keep rbPU.eval(evalPos)
239- # timeIt "Rbf eval":
240- # keep rb.eval(evalPos)
241-
242- # let rbfPu = newRbfPu(x1, values, 3)
243- # echo rbfPu.grid.values[1, 0]
244- # echo rbfPu.eval(x1[[2, 1, 0], _])
245-
246- # echo rbfPu.eval(sqrt x1)
247- echo " ----------------"
248- for y in countdown (4 , 0 ):
249- var row = " "
250- for x in 0 .. 4 :
251- row &= $ (x* 5 + y) & " \t "
252- echo row
253-
254- let xGrid = [[0.1 , 0.1 ], [0.2 , 0.3 ], [0.9 , 0.9 ], [0.4 , 0.4 ]].toTensor
255- let valuesGrid = @ [0 , 1 , 9 , 5 ].toTensor.reshape (4 , 1 )
256- let grid = newRbfGrid (xGrid, valuesGrid, 5 )
257- # echo grid
258- echo grid.neighbours (7 , 1 ).toSeq
0 commit comments