def test_margLocalUpdate1(self): """ Updates computed by hand given: v = [45,20], l = 1 p(q_1 = 20) = 0.5 p(q_1 = 30) = 0.5 p(q_2 = 15) = 0.2 p(q_2 = 20) = 0.8 Under independent prices p(q_1,q_2) = p(q_1)p(q_2) Hence: p(q_1 = 20, q_2 = 15) = 0.1 p(q_1 = 20, q_2 = 20) = 0.4 p(q_1 = 30, q_2 = 15) = 0.1 p(q_1 = 30, q_2 = 20) = 0.4 The joint pdf is represented with 1000 samples. 100 samples of [20,15] 400 samples of [20,20] 100 samples of [30,15] 400 samples of [30,20] Ground Truth Anwers: Starting at [25,25] 1.1) b1 <- 25 1.2) b2 <- 10 2.1) b1 <- 45 2.2) b2 <- 0 3.1) b1 <- 25 3.2) b2 <- 0 Therefore, starting at [25,25] converges to [45,0] after 3 iterations """ samples = numpy.zeros((1000,2)) samples[:100,:] = numpy.asarray([20,15]) samples[100:500,:] = numpy.asarray([20,20]) samples[500:600,:] = numpy.asarray([30,15]) samples[600:,:] = numpy.asarray([30,20]) m=2 l = 1 v = [45,20] bundles = listBundles(m) revenue = msListRevenue(bundles, v, l) bids = numpy.asarray([25.,25.]) bids[0] = margLocalUpdate(bundles,revenue,bids,0,samples,True) numpy.testing.assert_equal(bids[0], 25, "Update 1.1 Failed", True) bids[1] = margLocalUpdate(bundles,revenue,bids,1,samples,True) numpy.testing.assert_equal(bids[1], 10, "Update 1.2 Failed", True ) bids[0] = margLocalUpdate(bundles,revenue,bids,0,samples,True) numpy.testing.assert_equal(bids[0], 45, "Update 2.1 Failed", True) bids[1] = margLocalUpdate(bundles,revenue,bids,1,samples,True) numpy.testing.assert_equal(bids[1], 0, "Update 2.2 Failed", True) bids[0] = margLocalUpdate(bundles,revenue,bids,0,samples,True) numpy.testing.assert_equal(bids[0], 45, "Update 3.1 Failed", True) bids[1] = margLocalUpdate(bundles,revenue,bids,1,samples,True) numpy.testing.assert_equal(bids[1], 0, "Update 3.2 Failed", True) #should converge after 3 iterations bids = numpy.asarray([25.,25.]) bids, converged, itr, tol = margLocal(bundles, revenue, bids, samples, ret = 'all') numpy.testing.assert_array_equal(bids, numpy.asarray([45,0]), "margLocal bids test failed", True) numpy.testing.assert_equal(converged, True, "margLocal converged failed", True) numpy.testing.assert_equal(itr,3,"margLocal number of iterations failed.", True) numpy.testing.assert_almost_equal(tol, 0., 8, "margLocal tol failed", True)
def main(): desc="Compute jointLocal bids given v's, l's initial bids and parameters" parser = argparse.ArgumentParser(description=desc) parser.add_argument('-s','--samplesFile',dest='samplesFile', required=True,type=str, help='Samples (text file)') parser.add_argument('-v','--vfile',dest='vfile', required=True,type=str, help='Valuation v vector txt file.') parser.add_argument('-l','--lfile',dest='lfile', required=True,type=str, help='Valuation lambda txt file.') parser.add_argument('-ib','--initBidFile',dest='initBidFile', required=True,type=str, help='Initial Bids txt file.') parser.add_argument('-es','--evalSamples',dest='evalFile', required=True,type=str, help='Evaluation samples file.') parser.add_argument('-o','--odir',dest='odir', required=True,type=str, help='Output directory.') parser.add_argument('-eps','--eps',dest='eps', required=False,default=1,type=float, help='Eps condLocal parameter') parser.add_argument('-mi','--maxitr', dest='maxitr', required=False, default=100, type=int, help='Maximum Update Iterations') parser.add_argument('-t','--tol',dest='tol', required=False, default=1e-5, type=float,help='L2 Update Stopping Tolerance') parser.add_argument('--verbose',dest='verbose', required=False,default=False, type=bool,help='Output debugg information') args = parser.parse_args() args.odir = os.path.realpath(args.odir) jointSamples = numpy.loadtxt(os.path.realpath(args.samplesFile)) initBids = numpy.loadtxt(os.path.realpath(args.initBidFile)) vmat = numpy.loadtxt(os.path.realpath(args.vfile)) lmat = numpy.loadtxt(os.path.realpath(args.lfile)) evalSamples = numpy.loadtxt(os.path.realpath(args.evalFile)) m = initBids.shape[1] bundles = listBundles(m) bids = numpy.zeros(initBids.shape) es = numpy.zeros(initBids.shape[0]) for itr, initBid, v, l in zip(xrange(vmat.shape[0]),initBids,vmat,lmat): print 'iteration {0}'.format(itr) revenue = msListRevenue(bundles,v,l) bids[itr,:] = \ margLocal(bundles,revenue, initBid,jointSamples, maxItr = args.maxitr, tol = args.tol, verbose = args.verbose, ret = 'bids') brd = {} for b,r in zip(bundles,revenue): brd[tuple(b)] = r es[itr] = expectedSurplus_(brd, bids[itr,:], evalSamples) numpy.savetxt(os.path.join(args.odir,'margLocalBids.txt'), bids) numpy.savetxt(os.path.join(args.odir,'margLocalExpectedSurplus.txt'),es) with open(os.path.join(args.odir,'margLocalStats.txt'),'w') as f: print >> f, numpy.mean(es) print >> f, numpy.var(es)
def localSearchDominance(nbids = 100, n_samples = 1000, rootDir = ".", scppFile = None, vfile = None, lfile = None, njs = 1000, nms = 1000): scppFile = os.path.realpath(scppFile) with open(scppFile,'r') as f: scpp = pickle.load(f) m = scpp.m() bundles = listBundles(m) rootDir = os.path.realpath(rootDir) oDir = os.path.join(rootDir,timestamp_()) if not os.path.exists(oDir): os.makedirs(oDir) table = [["parameter", "value"]] table.append(["nbids", nbids]) table.append(["n_samples",n_samples]) table.append(["m",m]) table.append(["njs",njs]) table.append(["nms",nms]) table.append(["vfile",vfile]) table.append(["lfile",lfile]) table.append(["sccpFile", scppFile]) pprint_table(sys.stdout,table) with open(os.path.join(oDir,'params.txt'),'a') as f: pprint_table(f,table) jointBidFile = os.path.join(oDir,"jointLocalBids.txt") condBidFile = os.path.join(oDir,"condLocalBids.txt") margBidFile = os.path.join(oDir,"margLocalBids.txt") useExternalValuations = False if vfile == None and lfile == None: vfile = os.path.join(oDir,'v.txt') lfile = os.path.join(oDir,'l.txt') else: vmat = numpy.loadtxt(vfile) lmat = numpy.loadtxt(lfile) nbids = lmat.shape[0] useExternalValuations = True surplusSamples = scpp.sample(n_samples = n_samples) numpy.savetxt(os.path.join(oDir,'ppSamples.txt'),surplusSamples) jsdir = os.path.join(oDir,'jointSamples') if not os.path.exists(jsdir): os.makedirs(jsdir) msdir = os.path.join(oDir,'margSamples') if not os.path.exists(msdir): os.makedirs(msdir) es = numpy.zeros((nbids,3)) for i in xrange(nbids): print 'Bid number {0}'.format(i) if useExternalValuations: v = vmat[i,:] l = lmat[i] else: print 'randomizing valuation' v,l = randomValueVector(m=m) with open(vfile,'a') as f: numpy.savetxt(f, v.reshape(1,v.shape[0])) # print >> f, v with open(lfile,'a') as f: numpy.savetxt(f,numpy.atleast_1d(l)) print 'v = {0}'.format(v) print 'l = {0}'.format(l) revenue = listRevenue(bundles, v, l) bundleRevenueDict = {} for b, r in zip(bundles,revenue): bundleRevenueDict[tuple(b)] = r jointSamples = scpp.sample(n_samples = njs) margSamples = scpp.sampleMarg(n_samples = nms) numpy.savetxt( os.path.join(jsdir,'jointSamples_{0:04}.txt'.format(i)), jointSamples) numpy.savetxt( os.path.join(msdir,'margSamples_{0:04}.txt'.format(i)), margSamples) initBid = straightMUa(bundles, revenue, scpp) jbid = jointLocal(bundles,revenue,initBid,jointSamples) cbid = condLocal(bundles, revenue, initBid, jointSamples) mbid = margLocal(bundles, revenue, initBid, margSamples) with open(jointBidFile,'a') as f: numpy.savetxt(f, jbid.T) with open(condBidFile,'a') as f: numpy.savetxt(f, cbid.T) with open(margBidFile,'a') as f: numpy.savetxt(f, mbid.T) es[i,0] = expectedSurplus_(bundleRevenueDict, jbid, surplusSamples) es[i,1] = expectedSurplus_(bundleRevenueDict, cbid, surplusSamples) es[i,2] = expectedSurplus_(bundleRevenueDict, mbid, surplusSamples) with open(os.path.join(oDir,"jointLocalExpectedSurplus.txt"),'a') as f: numpy.savetxt(f,numpy.atleast_1d(es[i,0])) with open(os.path.join(oDir,"condLocalExpectedSurplus.txt"),'a') as f: numpy.savetxt(f,numpy.atleast_1d(es[i,1])) with open(os.path.join(oDir,"margLocalExpectedSurplus.txt"),'a') as f: numpy.savetxt(f,numpy.atleast_1d(es[i,2])) jmean = numpy.mean(es[:,0]) jvar = numpy.var(es[:,0]) cmean = numpy.mean(es[:,1]) cvar = numpy.var(es[:,1]) mmean = numpy.mean(es[:,2]) mvar = numpy.var(es[:,2]) print 'jointLocal Expected Surplus Mean {0}'.format(jmean) print 'jointLocal Expected Surplus Variance {0}'.format(jvar) print 'condLocal Expected Surplus Mean {0}'.format(cmean) print 'condLocal Expected Surplus Variance {0}'.format(cvar) print 'margLocal Expected Surplus Mean {0}'.format(mmean) print 'margLocal Expected Surplus Variance {0}'.format(mvar) with open(os.path.join(oDir,'jointLocalStats.txt'),'a') as f: print >> f, 'mean ', jmean print >> f, 'var ', jvar with open(os.path.join(oDir,'condLocalStats.txt'),'a') as f: print >> f, 'mean ', cmean print >> f, 'var ', cvar with open(os.path.join(oDir,'margLocalStats.txt'),'a') as f: print >> f, 'mean ', mmean print >> f, 'var ', mvar with open(os.path.join(oDir,'stats.txt'),'a') as f: print >> f, 'jointLocal expected surplus mean: {0}'.format(jmean) print >> f, 'jointLocal expected surplus variation: {0}'.format(jvar) print >> f, 'condLocal expected surplus mean: {0}'.format(cmean) print >> f, 'condLocal expected surplus variation: {0}'.format(cvar) print >> f, 'margLocal expected surplus mean: {0}'.format(mmean) print >> f, 'margLocal expected surplus variation: {0}'.format(mvar) bins = range(int(es.min())-1, int(es.max())+1) jhist, jbins = numpy.histogram(es[:,0], bins, normed = True) chist, cbins = numpy.histogram(es[:,1], bins, normed = True) mhist, mbins = numpy.histogram(es[:,2], bins, normed = True) f,ax = plt.subplots(3,1, sharex = True) ax[0].bar( (jbins[:-1]+jbins[1:])/2, jhist, align = 'center') ax[0].set_title('jointLocal expected surplus') ax[1].bar( (cbins[:-1]+cbins[1:])/2, chist, align = 'center' ) ax[1].set_title('condLocal expected surplus') ax[2].bar( (mbins[:-1]+mbins[1:])/2, mhist, align = 'center') ax[2].set_title('margLocal expected surplus') plt.savefig(os.path.join(oDir,'expectedSurplus.pdf'))