def processSolutionsFolder(folder):
    assert os.path.isdir(folder)
    pcrl = {}
    for f in sorted(os.listdir(folder)):
        t = int(f.split(".")[0])

        ipcr = cudfpkg.createProfileChangeRequest(os.path.join(folder, f), nameversiononly=True)
        print folder, f, t
        pcrl[t] = ipcr
    return pcrl
    def numberOfNotInstalled(userfile):
        ufolder = userfile + ".sols"
        lastsol = os.path.join(ufolder, sorted(os.listdir(ufolder))[-1])
        cc = cudfpkg.createProfileChangeRequest(lastsol)
        lines = open(userfile).readlines()
        lines = filter(lambda x: "install:" in x, lines)
        times = map(lambda x: x.split()[0][:-1].strip(), lines)
        installs = map(lambda x: x.split()[2][:-1].strip(), lines)

        ns = []
        for t, i in zip(times, installs):
            if i not in cc.getPackageNames(onlyinstalled=True):
                ns.append((t, i))

        installedSucessfulRemovedLater = []
        notSatisfied = []
        for t, i in ns:
            isol = cudfpkg.createProfileChangeRequest(os.path.join(ufolder, str(t) + ".cudfsystem"))
            if i in isol.getPackageNames(onlyinstalled=True):
                installedSucessfulRemovedLater.append(i)
            else:
                notSatisfied.append(i)

        return notSatisfied, installedSucessfulRemovedLater
def generateCUDF(usefilename, previousSystem,repFile,request):
	preamble = "preamble: \n"
	preamble += "property: recommends: vpkgformula, age: int, hubs: int, auth: int, ca: int, ce: int, instability: int, metains: int, metaouts: int, metaversion: int, pagerank: int\n\n"
	
	request = "\nrequest: \n" + request
	
	
	#change to installed
	pcri = cudfpkg.createProfileChangeRequest(previousSystem)
	tmpcudf = os.path.join(os.path.dirname(usefilename),"."+os.path.basename(usefilename)+ ".tmpcudf")
	out = open(tmpcudf ,'w')

	out.write(preamble)
	f = None
	if repFile.endswith(".gz"):
		f = gzip.open(repFile,'r')
	else:
		f = open(repFile,"r")
	
	pv = [None,None]
	i = 0
		
	line = f.readline()
	while line:
		out.write(line)
		if line.startswith("package:"):
			pv[0] = line[len("package: "):].strip()
		elif line.startswith("version:"):
			pv[1] = line[len("version: "):].strip()
		
		if pv[0] != None and pv[1] != None:
			if len(pcri.getPackagesThatSatisfy((pv[0],pv[1],"="))) > 0:
				i += 1
				out.write("installed: true\n")
				
			pv = [None,None]
		line = f.readline()
		
	#create request	
	out.write(request)
	out.close()
	return tmpcudf

def summary(cudfs):
	
	print "newNames =", cudfpkg.newNames(cudfs)
	print "removedNames =",  cudfpkg.removedNames(cudfs)
	print "removedPackages =",  cudfpkg.removedPackages(cudfs)
	print "newPackages =",  cudfpkg.newPackages(cudfs)
	print "updatedPackages =",  cudfpkg.updatedPackages(cudfs)

	
if False:
	trackedcudfs = []
	for c in trackedreps:
		print c
		done = cudfpkg.createProfileChangeRequest(c,nameversiononly=True)
		trackedcudfs.append(done.toMap())
	


	summary(trackedcudfs)


repsdir = "reps"
repscudfs = []
for i in range(1,33):
	days = datetime.timedelta(days=i)
	t = time.mktime((t0date + days).timetuple())
	cudf = getCudf(t, repsdir)
	print cudf
	done = cudfpkg.createProfileChangeRequest(cudf,nameversiononly=True)
#!/usr/bin/python
import os
from cudfpy import cudfpkg
import numpy
import time, datetime

import pylab

start = 1256814000  # one day before first action
end = 1288410600

initsys = cudfpkg.createProfileChangeRequest("9.10.cudf", nameversiononly=True)
startdate = datetime.datetime.fromtimestamp(1256900400)


def topnpairs(cudfmap):
    return set([(n, v) for n in cudfmap.keys() for v in cudfmap[n]])


def processSolutionsFolder(folder):
    assert os.path.isdir(folder)
    pcrl = {}
    for f in sorted(os.listdir(folder)):
        t = int(f.split(".")[0])

        ipcr = cudfpkg.createProfileChangeRequest(os.path.join(folder, f), nameversiononly=True)
        print folder, f, t
        pcrl[t] = ipcr
    return pcrl

#!/usr/bin/python
from cudfpy import cudfpkg
import numpy

rep = cudfpkg.createProfileChangeRequest("1288868400.0",nameversiononly=False)
initsys = cudfpkg.createProfileChangeRequest("9.10.cudf",nameversiononly=True)

start = 1256814000 #one day before first action
end = 1288410600
print "first"
ups = {}
for pn in initsys.getPackageNames():
	apack = initsys.getPackagesThatSatisfy((pn,-1,""))[0]
	ups[pn] = 0
	packs = rep.getPackagesThatSatisfy((pn,-1,""))
	for package in packs:
		if package.date >= start and package.date <= end and package.version > apack.version:
			ups[pn] = ups[pn] + 1

print "First Value", numpy.mean(ups.values())
def getCUDF(cfile):
	return cudfpkg.createProfileChangeRequest(cfile)
	if not os.path.exists(spath):
		os.mkdir(spath)
	
	for date in sorted(dates):
		c +=1
		tstr = str(int(time.mktime(date.timetuple()))) + ".pickle"
		
		todo = sorted(dates[date])
		#Remove any file already created
		todo = filter(lambda x : not os.path.exists(os.path.join(spath,x,tstr)),todo)
		if len(todo) == 0:
			print "Skipping: done all",date
			continue;
			
		print c,"/",len(dates),strategy,"Loading Repository : " + repositories[date]
		repo = cudfpkg.createProfileChangeRequest(os.path.join("reps",str(repositories[date])))
		print "Finsihed Loading Repository"
		c2 = 0
		for us in todo:
			c2 += 1
			print c,"/",len(dates), " ------ ",c2,"/",len(todo)
			
			
			t = dates[date][us]["time"]

			res = createResult(repo,dates[date][us]["previoussystem"],dates[date][us]["currentsystem"],t)
			
			sys.stdout.write("saving ")
			
			if not os.path.exists(os.path.join(spath,us)):
				os.mkdir(os.path.join(spath,us))
#process = subprocess.Popen(["./gUser.py","-a","9.10.cudf","-t",str(int(t0)),"-T",str(31),"-u",str(1.0),"-U","\"-removed,-new,-uptodatedistance\"","-o",])
#process.wait()

userfolder = "trackedsim"
trackeddir = "trackedSystem"
totaltracked = "totalSimulatedUser"

#process = subprocess.Popen(["./runSimulation.py", "-u", userfile, "-o", userfolder])
#process.wait()

#./gUser.py -a trackedSystem/1320109230.installed.cudf -t 1320109320 -T 31 -u 1.0 -U="-removed,-new,-uptodatedistance" -o totalSimulatedUser.user -r trackedSystem/reps/

simcudfs = sorted(filter(lambda x: x.endswith(".cudfsystem"), os.listdir(userfolder)))
trackedcudfs = sorted(filter(lambda x: x.endswith(".installed.cudf"), os.listdir(trackeddir)))

simcudfs = map(lambda x : cudfpkg.createProfileChangeRequest(os.path.join(userfolder,x),nameversiononly=True).toMap(),simcudfs)
trackedcudfs = map(lambda x : cudfpkg.createProfileChangeRequest(os.path.join(trackeddir,x),nameversiononly=True).toMap(),trackedcudfs)




def summary(cudfs):
	print "newNames =", cudfpkg.newNames(cudfs)
	print "removedNames =",  cudfpkg.removedNames(cudfs)
	print "removedPackages =",  cudfpkg.removedPackages(cudfs)
	print "newPackages =",  cudfpkg.newPackages(cudfs)
	print "updatedPackages =",  cudfpkg.updatedPackages(cudfs)

print "Simulation"
summary(simcudfs)