def unweightedCalc(self): """Performs unweighted k-function.""" #### Attribute Shortcuts #### ssdo = self.ssdo reduce = self.reduce simulate = self.simulate ripley = self.ripley if reduce: studyArea2Use = self.reduceArea else: studyArea2Use = self.studyArea self.ld = COLL.defaultdict(float) if self.permutations: self.ldMin = COLL.defaultdict(float) self.ldMax = COLL.defaultdict(float) for order in self.cutoffOrder: self.ldMin[order] = 99999999999. permsPlus = self.permutations + 1 for perm in xrange(0, permsPlus): #### Permutation Progressor #### pmsg = ARCPY.GetIDMessage(84184) progressMessage = pmsg.format(perm, permsPlus) ARCPY.SetProgressor("default", progressMessage) #### Permutate the XY #### if perm != 0: self.permutateTable() gaSearch = GAPY.ga_nsearch(self.kTable) gaSearch.init_nearest(self.stepMax, 0, "euclidean") N = len(self.kTable) numIDs = len(self.ids) kij = COLL.defaultdict(float) for i in xrange(N): row = self.kTable[i] id0 = row[0] if id0 in self.ids: x0,y0 = row[1] gaSearch.search_by_idx(i) for nh in gaSearch: neighInfo = self.kTable[nh.idx] nhID = neighInfo[0] x1,y1 = neighInfo[1] dist = WU.euclideanDistance(x0,x1,y0,y1) if ripley: value = self.returnRipley(id0, dist) else: value = 1.0 for order in self.reverseOrder: cutoff = self.cutoffs[order] if dist > cutoff: break kij[order] += value ARCPY.SetProgressorPosition() #### Calculate Stats USing Dictionaries #### weightSumVal = numIDs * (numIDs - 1.0) denom = NUM.pi * weightSumVal for order in self.cutoffOrder: res = kij[order] numer = res * studyArea2Use permResult = NUM.sqrt( (numer/denom) ) if perm: self.ldMin[order] = min(self.ldMin[order], permResult) self.ldMax[order] = max(self.ldMax[order], permResult) else: self.ld[order] = permResult
def weightedCalc(self): """Performs weighted k-function.""" #### Attribute Shortcuts #### ssdo = self.ssdo reduce = self.reduce simulate = self.simulate ripley = self.ripley numIDs = len(self.ids) if reduce: studyArea2Use = self.reduceArea else: studyArea2Use = self.studyArea if simulate: simOrder = [] for simKey, origID in self.simDict.iteritems(): simOrder.append(self.weightDict[origID]) self.ld = COLL.defaultdict(float) if self.permutations: self.ldMin = COLL.defaultdict(float) self.ldMax = COLL.defaultdict(float) for order in self.cutoffOrder: self.ldMin[order] = 99999999999. permsPlus = self.permutations + 1 for perm in xrange(0, permsPlus): #### Permutation Progressor #### pmsg = ARCPY.GetIDMessage(84184) progressMessage = pmsg.format(perm, permsPlus) ARCPY.SetProgressor("default", progressMessage) gaSearch = GAPY.ga_nsearch(self.kTable) gaSearch.init_nearest(self.stepMax, 0, "euclidean") N = len(self.kTable) #### Permutate Weights #### if perm: weights = RAND.permutation(weights) else: weights = self.weightVals if simulate: simWeights = NUM.take(self.weightVals, simOrder) #### Set Statistic Variables #### weightSumVal = 0.0 kij = COLL.defaultdict(float) start = 0 #### Loop Over Entire Table #### for i in xrange(N): row = self.kTable[i] id0 = row[0] #### Calculate For Inside IDs #### if id0 in self.ids: x0,y0 = row[1] weightInd0 = self.weightDict[id0] w0 = weights[weightInd0] #### Weight Sum Resolution #### weightSumVal += (NUM.sum(w0 * weights)) - w0**2.0 if simulate: weightSumVal += (w0 * simWeights).sum() #### Neighbors Within Largest Distance #### gaSearch.search_by_idx(i) for nh in gaSearch: neighInfo = self.kTable[nh.idx] id1 = neighInfo[0] x1,y1 = neighInfo[1] #### Input or Simulated Point #### try: weightInd1 = self.weightDict[id1] except: origID = self.simDict[id1] weightInd1 = self.weightDict[origID] #### Process Neighbor Pair #### w1 = weights[weightInd1] dist = WU.euclideanDistance(x0,x1,y0,y1) if ripley: value = self.returnRipley(id0, dist) else: value = 1.0 value = w0 * (w1 * value) #### Add To Cutoffs #### for order in self.reverseOrder: cutoff = self.cutoffs[order] if dist > cutoff: break kij[order] += value ARCPY.SetProgressorPosition() #### Calculate Stats USing Dictionaries #### denom = NUM.pi * weightSumVal for order in self.cutoffOrder: res = kij[order] numer = res * studyArea2Use permResult = NUM.sqrt( (numer/denom) ) if perm: self.ldMin[order] = min(self.ldMin[order], permResult) self.ldMax[order] = max(self.ldMax[order], permResult) else: self.ld[order] = permResult