diff --git a/3nar.py b/3nar.py new file mode 100644 index 0000000..5693bb2 --- /dev/null +++ b/3nar.py @@ -0,0 +1,78 @@ +import matplotlib.pyplot as plt +import numpy as np +from function import * + +class Nnnar: + def __init__(self, nbDimensions, minCoord, maxCoord, nbSubdivisions): + self.nbDimensions = nbDimensions + self.minCoord = minCoord + self.maxCoord = maxCoord + self.nbSubdivisions = nbSubdivisions + self.delta = maxCoord - minCoord + self.unit = self.delta / nbSubdivisions + coord = np.zeros(nbDimensions,dtype=int) + self.nbSubdivisions + self.space = np.zeros(coord) + fillSpace = np.vectorize(lambda x: [], otypes=[object]) + self.space = fillSpace(self.space) + self.calculatedSpaceAroundIdx = [] + + def addPoint(self, coord, value): + if len(coord) != self.nbDimensions: + raise AttributeError("Error: wrong number of dimensions") + self.space[*self.getSpaceIdxFromCoord(coord)].append(Point(coord, value)) + + def getNNearest(self, coord, nbNearest): + idx = self.getSpaceIdxFromCoord(coord) + nbAround = 0 + selected = [] + while len(selected) < nbNearest: + selected = [] + subSpaceIdxList = getSpaceIdxAround(idx, nbAround, self) + for subSpaceIdx in subSpaceIdxList: + selected += selectPointsInRange(self.space[subSpaceIdx],coord,nbAround*self.unit) + nbAround += 1 + found = [] + dist = [] + i=0 + while len(found) < nbNearest: + found += selected[i] + i+=1 + maxDistIdx = foundMaxIndex(dist) + maxDist = max(dist) + for i in range(nbNearest, len(selected)): + if (selected[i].getDistFromCoord(coord) < maxDist): + found.pop(maxDistIdx) + dist.pop(maxDistIdx) + found.append(selected[i]) + dist.append(selected[i].getDistFromCoord(coord)) + maxDistIdx = foundMaxIndex(dist) + maxDist = max(dist) + return found + + def getSpaceIdxFromCoord(self,coord): + coord = coord - self.minCoord + coord = coord / self.unit + coord = np.floor(coord).astype(int) + return coord + +class Point: + def __init__(self, coord, value): + self.coord = coord + self.value = value + + def setvalue(self, value): + self.value = value + + def getDist(self, point): + return np.linalg.norm(self.coord - point.coord) + + def getDistFromCoord(self, coord): + return np.linalg.norm(self.coord - coord) + + + + +n = Nnnar(2, 0, 3, 2) + +n.addPoint(np.array([1, 0.8]), 1) +print(n.space[0][0][0].coord) \ No newline at end of file diff --git a/function.py b/function.py new file mode 100644 index 0000000..e2ab420 --- /dev/null +++ b/function.py @@ -0,0 +1,12 @@ + +def getSpaceIdxAround(center, nbAround, space): + if (nbAround < len(space.calculatedSpaceAroundIdx)): + return space.calculatedSpaceAroundIdx[nbAround] + # TODO: implement l'algo pour trouver les indices subSapce à nbAround autour du centre + +def selectPointsInRange(points, coord, distance): + found = [] + return found + +def foundMaxIndex(dist): + return dist.index(max(dist)) \ No newline at end of file