def bayesSCPP(**kwargs): """ save pkl will save the hist class; to recover bayesian probabilities must call hist.bayesMargDistSCPP() """ oDir = kwargs.get('oDir') agentType = kwargs.get('agentType') nAgents = kwargs.get('nAgents',8) m = kwargs.get('m',5) minPrice = kwargs.get('minPrice',0) maxPrice = kwargs.get('maxPrice',50) maxSim = kwargs.get('maxSim', 1000) nGames = kwargs.get('nGames', 100) parallel = kwargs.get('parallel', False) nProc = kwargs.get('nProc', multiprocessing.cpu_count() - 1) tol = kwargs.get('tol',0.001) plot = kwargs.get('plot', True) log = kwargs.get('log', True) saveBayesPkl = kwargs.get('saveBayesPkl',True) # saveBayesNpz = kwargs.get('saveBayesNpz',True) saveBayesTxt = kwargs.get('saveBayesTxt',True) saveHistPkl = kwargs.get('saveHistPkl',False) # saveHistNpz = kwargs.get('saveHistNpz',False) savenpz = kwargs.get('savenpz',False) verbose = kwargs.get('verbose', True) if not oDir: str = "-----ERROR-----\n" +\ "In bayesSCPP(...)\n" +\ "Must Provide output directory\n" raise ValueError(str) if plot: pltDir = os.path.join(oDir,'plots') if not os.path.exists(pltDir): os.makedirs(pltDir) else: [os.remove(filename) for filename in glob.glob(os.path.join(pltDir,'*.png'))] # shutil.rmtree(pltDir,ignore_errors=True) # os.makedirs(pltDir) if not os.path.exists(oDir): os.makedirs(oDir) if saveBayesPkl: bayesPklDir = os.path.join(oDir,'bayesSCPP_bayesPkl') if not os.path.exists(bayesPklDir): os.makedirs(bayesPklDir) else: [os.remove(f) for f in glob.glob(os.path.join(bayesPklDir,'*.pkl'))] if saveBayesTxt: bayesTxtDir = os.path.join(oDir,'bayesSCPP_bayesTxt') if not os.path.exists(bayesTxtDir): os.makedirs(bayesTxtDir) else: [os.remove(f) for f in glob.glob(os.path.join(bayesTxtDir,'*txt'))] if saveHistPkl: histPklDir = os.path.join(oDir,'bayesSCPP_histPkl') if not os.path.exists(histPklDir): os.makedirs(histPklDir) else: [os.remove(f) for f in glob.glob(os.path.join(histPklDir,'*.pkl'))] if log: logFile = os.path.join(oDir,'bayesSCPP_{0}.txt'.format(agentType)) if os.path.exists(logFile): os.remove(logFile) with open(logFile,'a') as f: f.write("oDir = {0}\n".format(oDir)) f.write("agentType = {0}\n".format(agentType)) f.write("nAgents = {0}\n".format(nAgents)) f.write("tol = {0}\n".format(tol)) f.write("m = {0}\n".format(m)) f.write("minPrice = {0}\n".format(minPrice)) f.write("maxPrice = {0}\n".format(maxPrice)) f.write("maxSim = {0}\n".format(maxSim)) f.write("nGames = {0}\n".format(nGames)) f.write("parallel = {0}\n".format(parallel)) f.write("plot = {0}\n".format(plot)) if verbose: print "oDir = {0}".format(oDir) print "agentType = {0}".format(agentType) print "nAgents = {0}".format(nAgents) print "tol = {0}".format(tol) print "m = {0}".format(m) print "minPrice = {0}".format(minPrice) print "maxPrice = {0}".format(maxPrice) print "maxSim = {0}".format(maxSim) print "nGames = {0}".format(nGames) print "parallel = {0}".format(parallel) print "plot = {0}".format(plot) currHist = hist() if plot: oFile = os.path.join(pltDir,'bayesSCPP_{0}_{1}.png'.format(agentType,0)) title='bayesSCPP, {0}, Initial Distribution'.format(agentType) currHist.bayesMargDistSCPP().graphPdfToFile(fname = oFile, title=title) klList = [] ksList = [] agentFactoryParams = {'agentType' : agentType, 'm' : m, 'minPrice' : minPrice, 'maxPrice' : maxPrice} for sim in xrange(maxSim): oldHist = copy.deepcopy(currHist) for i in xrange(nGames): agentList = [agentFactory(**agentFactoryParams) for i in xrange(nAgents)] if parallel: pool = multiprocessing.Pool(nProc) bayesMarg = currHist.bayesMargDistSCPP() results = [pool.apply_async(bidHelper, kwds = {'agent': agent, 'bayesMargDist': bayesMarg} ) for agent in agentList] pool.close() pool.join() bids = numpy.zeros((nAgents,m)) for idx,r in enumerate(results): bids[idx,:] = r.get() r._value = [] else: bids = numpy.atleast_2d([agent.bid(pricePrediction = currHist.bayesMargDistSCPP()) for agent in agentList]) winningBids = numpy.max(bids,0) for idx, wb in enumerate(winningBids): currHist.upcount(idx,wb,mag=1) # [currHist.upcount(idx, wb, mag=1) for idx, wb in enumerate(winningBids)] currBayesMargDist = currHist.bayesMargDistSCPP() oldBayesMargDist = oldHist.bayesMargDistSCPP() klList.append(klDiv(currBayesMargDist, oldBayesMargDist)) ksList.append(ksStat(currBayesMargDist, oldBayesMargDist)) if verbose: print '' print 'itr = {0}'.format(sim+1) print '\tNumber of Games = {0}'.format((sim+1)*nGames) print '\tkld = {0}'.format(klList[-1]) print '\tks = {0}'.format(ksList[-1]) if plot: oPlot = os.path.join(pltDir,'bayesSCPP_{0}_{1}.png'.format(agentType,(sim+1)*nGames)) title='BayesSCPP {0}, klD = {1:.6}, ks = {2:.6} itr = {3}'.format(agentType,klList[-1],ksList[-1],(sim+1)*nGames) currBayesMargDist.graphPdfToFile(fname = oPlot, title=title) if saveBayesPkl: of = os.path.join(bayesPklDir,'bayesSCPP_bayesMargDist_{0}_{1}.pkl'\ .format(agentType,int((sim+1)*nGames))) with open(of, 'w') as f: pickle.dump(currBayesMargDist,f) if saveBayesTxt: of = os.path.join(bayesTxtDir,'bayesSCPP_bayesTxt_{0}_{1}.txt'\ .format(agentType,int((sim+1)*nGames))) currBayesMargDist.savetxt(of) if saveHistPkl: of = os.path.join(bayesPklDir,'bayesSCPP_hist_{0}_{1}.pkl'\ .format(agentType,(sim+1)*nGames)) with open(of, 'w') as f: pickle.dump(currHist,f) if klList[-1] < tol: break if log: with open(logFile,'a') as f: f.write('Done after {0} games ({1} iterations)\n'.format((sim+1)*nGames,sim)) f.write('kl = {0}\n'.format(klList)) f.write('ks = {0}\n'.format(ksList)) klFile = os.path.join(oDir,'kl.json') with open(klFile,'w') as f: json.dump(klList,f) ksFile = os.path.join(oDir,'ks.json') with open(ksFile,'w') as f: json.dump(ksList,f) if verbose: print 'Done'
def yw2SCPP(**kwargs): oDir = kwargs.get('oDir') if not oDir: raise ValueError("Must provide oDir") oDir = os.path.realpath(oDir) agentType = kwargs.get('agentType') nAgents = kwargs.get('nAgents',8) m = kwargs.get('m', 5) L = kwargs.get('L',100) d = kwargs.get('d', 0.01) g = kwargs.get('g', 1000000) minPrice = kwargs.get('minPrice',0) maxPrice = kwargs.get('maxPrice',50) serial = kwargs.get('serial', False) dampen = kwargs.get('dampen', True) nProc = kwargs.get('nProc', multiprocessing.cpu_count() - 1) verbose = kwargs.get('verbose',True) pltItr = kwargs.get('pltItr', True) if verbose: print'Computing Symmetric Self Confirming Point Price Prediction.' print'Agent Type = {0}'.format(agentType) print 'Termination Threshold (d) = {0}'.format(d) print'Number of Iterations = {0}'.format(L) print'Number of Games = {0}'.format(g) print'Number of Items per Auction = {0}'.format(m) print 'Using Dampining = {0}'.format(dampen) if serial: print 'Using serial implementation' else: print'Number of Parallel Cores = {0}'.format(nProc) if not serial: nGamesList = [g/nProc]*nProc nGamesList[-1] += (g%nProc) #initial uniform distribution tempDist = [] p = float(1)/round(maxPrice - minPrice) a = [p]*(maxPrice - minPrice) # binEdges = [bin for bin in xrange( int(minPrice - maxPrice)+1 ) ] binEdges = numpy.arange(minPrice,maxPrice+1,1) for i in xrange(m): tempDist.append((numpy.atleast_1d(a),numpy.atleast_1d(binEdges))) currentDist = margDistSCPP(tempDist) #clean up # keep the binEdges for later histograms del p,a,tempDist ksList = [] klList = [] for t in xrange(0,L): if pltItr: cs = cs = ['y--p', 'm-*', 'r-o','y-^','y-*'] graphname = os.path.join(oDir,'ywSCPP_itr_{0}.png'.format(t)) if not ksList: title = "yw2SCPP, {0}, \n itr = {1}".format(agentType,t) else: title = "ywSCPP, {0} \n kld = {1}, ks = {2} \nitr = {3}".format(agentType,klList[-1],ksList[-1],t) currentDist.graphPdfToFile(fname = graphname, colorStyles = cs, title = title) if verbose: print "" print 'Iteration = {0}'.format(t) if dampen: kappa = float(L - t) / L else: kappa = 1 if serial: result = numpy.zeros(g,m) for i in xrange(g): result[i,:] = simulateAuction(agentType = agentType, nAgents = nAgents, margDist = currentDist) else: tasks = multiprocessing.JoinableQueue() results = multiprocessing.Queue() consumers = [Consumer(tasks,results) for i in xrange(nProc)] #start the consumers [w.start() for w in consumers] [tasks.put( yw2Task(agentType = agentType, nAgents = nAgents, margDist = currentDist, nGames = nGames) ) for nGames in nGamesList] [tasks.put(None) for i in xrange(nProc)] if verbose: start = time.time() print "Waiting for {0} game simulation Simulation...".format(g) tasks.join() if verbose: print "" print "Finished {0} simulations in {1} seconds.".format(g,time.time()-start) if verbose: print "" print "Collecting Results" start = time.time() rList = [] while not results.empty(): rList.append(results.get()) result = numpy.vstack(rList) if verbose: print "" print "Done collecting results in {0} seconds".format(time.time() - start) [w.terminate() for w in consumers] del results,tasks,consumers histData = [] histCount = [] for m in xrange(result.shape[1]): histData.append(numpy.histogram(result[:,m],binEdges,density=True)) # histCount.append(numpy.histogram(result[:,m],binEdges,density=False)) newDist = margDistSCPP(histData) ksList.append(ksStat(currentDist, newDist)) klList.append(klDiv(currentDist, newDist)) if ksList[-1] < d or t == (L-1): postfix = '{0}_{1}_{2}_{3}_{4}_{5}'.format(agentType, g, m, d,minPrice,maxPrice) pklName = 'distPricePrediction_' + postfix + '.pkl' txtName = 'distPricePrediction_' + postfix + '.txt' pricePredictionPklFilename = os.path.join(oDir, pklName) currentDist.savePickle(pricePredictionPklFilename) pricePredictionTxtFilename = os.path.join(oDir, txtName) #this section could be improved.... testdata = [] for m in xrange(currentDist.m): if m == 0: textdata = numpy.vstack([currentDist.data[m][0],currentDist.data[m][1][:-1]]) else: textdata = numpy.vstack([textdata, numpy.vstack([currentDist.data[m][0],currentDist.data[m][1][:-1]])]) numpy.savetxt(pricePredictionTxtFilename,textdata) print '' print'Terminated after {0} Iterations'.format(t) print'Final Expected Price Vector = {0}'.format(currentDist.expectedPrices()) ksListName = os.path.join(oDir,'ksList.json') with open(ksListName,'w') as f: json.dump(ksList,f) klListName = os.path.join(oDir,'klList.json') with open(klListName,'w') as f: json.dump(klList,f) break else: currentDist = updateDist(currentDist, newDist, kappa) del result, newDist
def ywSCPP(**kwargs): oDir = kwargs.get('oDir') if oDir == None: raise ValueError("Must provide oDir") oDir = os.path.realpath(oDir) agentType = kwargs.get('agentType', 'straightMU8') nAgents = kwargs.get('nAgents',8) m = kwargs.get('m',5) L = kwargs.get('L',100) d = kwargs.get('d', 0.01) g = kwargs.get('g', 1000000) minPrice = kwargs.get('minPrice',0) maxPrice = kwargs.get('maxPrice',50) nSamples = kwargs.get('nSamples',8) serial = kwargs.get('serial', False) dampen = kwargs.get('dampen', True) nProc = kwargs.get('nProc', multiprocessing.cpu_count() - 1) verbose = kwargs.get('verbose',True) pltItr = kwargs.get('pltItr', True) if verbose: print'Computing Symmetric Self Confirming Point Price Prediction.' print'Agent Type = {0}'.format(agentType) print 'Termination Threshold (d) = {0}'.format(d) print'Number of Iterations = {0}'.format(L) print'Number of Games = {0}'.format(g) print'Number of Items per Auction = {0}'.format(m) print 'Using Dampining = {0}'.format(dampen) if serial: print 'Using serial implementation' else: print'Number of Parallel Cores = {0}'.format(nProc) print'Output Directory = {0}'.format(oDir) sDPP = symmetricDPPworker({'agentType' : agentType, 'm' : m, 'method' : 'iTsample', 'nSamples' : nSamples, 'nAgents' : nAgents}) #initial uniform distribution tempDist = [] p = float(1)/round(maxPrice - minPrice) a = [p]*(maxPrice - minPrice) # binEdges = [bin for bin in xrange( int(minPrice - maxPrice)+1 ) ] binEdges = numpy.arange(minPrice,maxPrice+1,1) for i in xrange(m): tempDist.append((numpy.atleast_1d(a),numpy.atleast_1d(binEdges))) currentDist = margDistSCPP(tempDist) #clean up # keep the binEdges for later histograms del p,a,tempDist ksList = [] klList = [] kappa = 1 for t in xrange(0,L): print "" if verbose: print 'Iteration: {0}'.format(t) # set up the dampining constant if so specified if dampen: kappa = float(L-t)/L if verbose: print 'kappa = {0}'.format(kappa) gamesStart = time.clock() result = [] if serial: # use serial 1 core implementation result = numpy.atleast_2d([r for r in itertools.imap(sDPP, itertools.repeat(currentDist,times=g))]).astype(numpy.float) else: pool = multiprocessing.Pool(processes=nProc) result = numpy.atleast_2d( pool.map(sDPP, itertools.repeat(currentDist,times=g)) ).astype(numpy.float) pool.close() pool.join() if verbose: gamesFinish = time.clock() print 'Finished {0} games in {1} seconds.'.format(g, gamesFinish-gamesStart) if verbose: histStart=time.clock() histData = [] histCount = [] for m in xrange(result.shape[1]): histData.append(numpy.histogram(result[:,m],binEdges,density=True)) histCount.append(numpy.histogram(result[:,m],binEdges,density=False)) if verbose: histFinish = time.clock() print 'Histogramed {0} marginal distributions of {1} games {2} seconds'.\ format(result.shape[1],g,histFinish-histStart) if verbose: updateStart = time.clock() updatedDist = updateDist(currDist = currentDist, newDist = margDistSCPP(histData), kappa = kappa, verbose = verbose) if verbose: updateFinish = time.clock() print 'Updated distribution in {0} seconds.'.format(updateFinish-updateStart) ksList.append(ksStat(margDist1 = currentDist, margDist2 = updatedDist)) klList.append(klDiv(currentDist, updatedDist)) if pltItr: cs = cs = ['y--p', 'm-*', 'r-o','y-^','y-*'] graphname = os.path.join(oDir,'ywSCPP_itr_{0}.png'.format(t)) updatedDist.graphPdfToFile(fname = graphname, colorStyles = cs, title = "ywSCPP, {0}, kld = {1}, ks = {2}".format(agentType,klList[-1],ksList[-1])) if verbose: print 'Previous Expected Prices = {0}'.format(currentDist.expectedPrices()) print 'New expected Prices = {0}'.format(updatedDist.expectedPrices()) print 'KS Statistic between Successive Iterations = {0}'.format(ksList[-1]) if ksList[-1] <= d or t == (L-1): postfix = '{0}_{1}_{2}_{3}_{4}_{5}'.format(agentType, g, m, d,minPrice,maxPrice) pklName = 'distPricePrediction_' + postfix + '.pkl' txtName = 'distPricePrediction_' + postfix + '.txt' pricePredictionPklFilename = os.path.join(oDir, pklName) updatedDist.savePickle(pricePredictionPklFilename) pricePredictionTxtFilename = os.path.join(oDir, txtName) #this section could be improved.... testdata = [] for m in xrange(updatedDist.m): if m == 0: textdata = numpy.vstack([updatedDist.data[m][0],updatedDist.data[m][1][:-1]]) else: textdata = numpy.vstack([textdata, numpy.vstack([updatedDist.data[m][0],updatedDist.data[m][1][:-1]])]) numpy.savetxt(pricePredictionTxtFilename,textdata) print '' print'Terminated after {0} Iterations'.format(t) print'Final Expected Price Vector = {0}'.format(updatedDist.expectedPrices()) ksListName = os.path.join(oDir,'ksList.json') with open(ksListName,'w') as f: json.dump(ksList,f) klListName = os.path.join(oDir,'klList.json') with open(klListName,'w') as f: json.dump(klList,f) break else: currentDist = updatedDist del updatedDist
def yw2Hob(**kwargs): oDir = kwargs.get('oDir') if oDir == None: raise ValueError("Must specify oDir") if not os.path.exists(oDir): os.makedirs(oDir) agentType = kwargs.get('agentType') if agentType == None: raise ValueError("Must specify agentType.") nAgents = kwargs.get('nAgents',8) selfIdx = kwargs.get('selfIdx',numpy.random.randint(nAgents)) nGames = kwargs.get('nGames',100) m = kwargs.get('m',5) minPrice = int(kwargs.get('minPrice',0)) maxPrice = int(kwargs.get('maxPrice',50)) minValuation = kwargs.get('minValuation',0) maxValuation = kwargs.get('maxValuation',50) maxItr = kwargs.get('maxItr', 100) tol = kwargs.get('tol', 0.01) dampen = kwargs.get('dampen', True) parallel = kwargs.get('parallel',False) nProc = kwargs.get('nProc',multiprocessing.cpu_count()-1) savePkl = kwargs.get('savePkl',True) saveTime = kwargs.get('saveTime',True) pltMarg = kwargs.get('pltMarg',True) pltKld = kwargs.get('pltKld',True) pltKs = kwargs.get('pltKs',True) verbose = kwargs.get('verbose',True) if verbose: print 'oDir = {0}'.format(oDir) print 'agentType = {0}'.format(agentType) print 'nAgents = {0}'.format(nAgents) print 'nGames = {0}'.format(nGames) print 'm = {0}'.format(m) print 'minPrice = {0}'.format(minPrice) print 'maxPrice = {0}'.format(maxPrice) print 'minValuation = {0}'.format(minValuation) print 'maxValuation = {0}'.format(maxValuation) print 'selfIdx = {0}'.format(selfIdx) print 'maxItr = {0}'.format(maxItr) print 'tol = {0}'.format(tol) print 'parallel = {0}'.format(parallel) print 'nProc = {0}'.format(nProc) print 'savePkl = {0}'.format(savePkl) print 'saveTime = {0}'.format(saveTime) print 'pltMarg = {0}'.format(pltMarg) print 'pltKld = {0}'.format(pltKld) print 'pltKs = {0}'.format(pltKs) if savePkl: pklDir = os.path.join(oDir, 'gmmPkl') if not os.path.exists(pklDir): os.makedirs(pklDir) else: [os.remove(f) for f in glob.glob(os.path.join(pklDir,'*.pkl'))] if pltMarg: margDir = os.path.join(oDir,'pltMarg') if not os.path.exists(margDir): os.makedirs(margDir) else: [os.remove(f) for f in glob.glob(os.path.join(margDir,'*.png'))] [os.remove(f) for f in glob.glob(os.path.join(margDir,'*.pdf'))] if saveTime: timeFile = os.path.join(oDir,'time.txt') if os.path.exists(timeFile): os.remove(timeFile) klFile = os.path.join(oDir,'kld.txt') if os.path.exists(klFile): os.remove(klFile) ksFile = os.path.join(oDir,'ks.txt') if os.path.exists(ksFile): os.remove(ksFile) #initial uniform distribution tempDist = [] p = float(1)/round(maxPrice - minPrice) a = [p]*(maxPrice - minPrice) binEdges = numpy.arange(minPrice,maxPrice+1,1) for i in xrange(m): tempDist.append((numpy.atleast_1d(a),numpy.atleast_1d(binEdges))) currentDist = margDistSCPP(tempDist) del tempDist, p, a if pltMarg: of = os.path.join(margDir,'yw2SccpHob_{0}_m{1}_n{2}_init.pdf'.format(agentType,m,nAgents)) title = 'Marginal SCPP {0}'.format(agentType) xlabel = r'$q$' ylabel = r'$p(q)$' currentDist.graphPdfToFile(fname = of, title = title, xlabel = xlabel, ylabel = ylabel) klList = [] ksList = [] for t in xrange(maxItr): if verbose: print '' print 'Iteration = {0}'.format(t) if dampen: kappa = numpy.float(maxItr - t) / maxItr else: kappa = 1 if verbose: print 'kappa = {0}'.format(kappa) if verbose or saveTime: start = time.time() hob = simulateAuction( agentType = agentType, pricePrediction = currentDist, m = m, nAgents = nAgents, nGames = nGames, parallel = parallel, nProc = nProc, minValuation = minValuation, maxValuation = maxValuation, retType = 'hob', selfIdx = selfIdx, verbose = verbose) if verbose or saveTime: end = time.time() if verbose: print 'Simulated {0} auctions with {1} {2} agents in {3} seconds.'.format(nGames, nAgents, agentType, end-start) if savePkl: pklFile = os.path.join(pklDir, 'yw2ScppHob_{0}_m{1}_n{2}_{3:05d}.pkl'.format(agentType,m,nAgents,t)) with open(pklFile,'wb') as f: pickle.dump(currentDist,f) histData = [] for goodIdx in xrange(hob.shape[1]): histData.append(numpy.histogram(hob[:,goodIdx],binEdges,density=True)) newDist = margDistSCPP(histData) klList.append( klDiv(currentDist, newDist) ) if verbose: print 'kld = {0}'.format(klList[-1]) with open(klFile,'a') as f: f.write("{0}\n".format(klList[-1])) ksList.append( ksStat(currentDist,newDist) ) if verbose: print 'kls = {0}'.format(ksList[-1]) with open(ksFile,'a') as f: f.write("{0}\n".format(ksList[-1])) if saveTime: with open(timeFile,'a') as f: f.write("{0}\n".format(end-start)) if pltMarg: of = os.path.join(margDir,'yw2SccpHob_{0}_m{1}_n{2}_{3:05d}.pdf'.format(agentType,m,nAgents,t)) if verbose: print 'Plotting Marginal pdf to {0}'.format(of) title = 'Marginal SCPP {0}'.format(agentType) xlabel = r'$q$' ylabel = r'$p(q)$' newDist.graphPdfToFile(fname = of, title = title, xlabel = xlabel, ylabel = ylabel) if klList[-1] < tol or t == (maxItr - 1): if verbose: print 'TERMINATED:' if klList[-1] < tol: print '\tkld = {0} < tol = {1}'.format(klList[-1],tol) else: print '\tt = {0}, maxItr = {1}'.format(t,maxItr) if pltKld: if verbose: print 'Plotting K-L Divergence vs. Iteration.' klPdf = os.path.join(oDir,'kld.pdf') plt.figure() plt.plot(range(len(klList)), klList) plt.xlim((0,maxItr)) plt.ylabel('K-L Divergence') plt.xlabel('Iteration') plt.title('Marginal SCPP {0}'.format(agentType)) plt.savefig(klPdf) plt.close() if pltKs: if verbose: print 'Plotting K-S Stat vs. Iteration' ksPdf = os.path.join(oDir,'ks.pdf') plt.figure() plt.plot(range(len(ksList)), ksList) plt.xlim((0,maxItr)) plt.ylabel('K-S Statistic') plt.xlabel('Iteration') plt.title('Marginal SCPP {0}'.format(agentType)) plt.savefig(ksPdf) plt.close() if verbose: print 'DONE!!!!!' break else: if verbose: print 'Updating distribution.' currentDist = updateDist(currentDist,newDist,kappa) del hob, newDist