def getWeightPrimeMatrix(self):
	# compute D_x^(-1/2)    
	D_x = getDiagonalMatrix(self.weightMatrix)
	D_x_powered = powDiagonalMatrix(D_x, -0.5)	

	# compute D_y^(-1/2)
	D_y = getDiagonalMatrix(np.transpose(self.weightMatrix))
	D_y_powered = powDiagonalMatrix(D_y, -0.5)	

	# multiply matrices
	w_prime = np.dot(np.dot(D_x_powered, self.weightMatrix), D_y_powered)
    
	return w_prime
    def partition(self):
	print len(self.matrix.keys())
	print self.weightMatrix

	# get singular vectors
	x,y = self.getLeftRightSingularVectors()

	# compute D_x^(-1/2)    
	D_x = getDiagonalMatrix(self.weightMatrix)
    	D_x_powered = powDiagonalMatrix(D_x, -0.5)	
	
	# compute D_y^(-1/2)
	D_y = getDiagonalMatrix(np.transpose(self.weightMatrix))
	D_y_powered = powDiagonalMatrix(D_y, -0.5)	

    	#print "weight_matrix", self.weightMatrix
	#print "D_x", D_x

	x_new = np.dot(D_x_powered, x)
	y_new = np.dot(D_y_powered, y)

	print "x'", x_new
	print "y'", y_new

	A = []
	A_c = []
	B = []
	B_c = []

	c_x = 0.0
    	# Partition advertisements
	index = 0
    	print "c_x", c_x
	for adv in sorted(self.matrix.keys(), key = lambda adv : adv.advertiser_id):
	    if x_new.item(index) >= c_x:
		A.append(adv)
	    else:
		A_c.append(adv)

		if adv.advertiser_id == '27961':
		    print "c_x specific", x_new.item(index)

	    index += 1

	c_y = 0.0
	# Partition ads
	index = 0
	print "c_y", c_y
	for ad in sorted(self.dict_of_keywords.keys(), key = lambda ad : ad.keyword_id):
	    if y_new.item(index) >= c_y:
		B.append(ad)
	    else:
		B_c.append(ad)

	    if ad.keyword_id == '394':
		print "c_y_specific", y_new.item(index)

	    index += 1

	# Build new partitioned bipartite graphs
	# where G = (A,B) and G_c = (A_c,B_c)
	partition = SpectralBipartiteGraph()
	partition_c = SpectralBipartiteGraph()

	for adv in sorted(A, key = lambda adv : adv.advertiser_id):
	    for ad in sorted(B, key = lambda ad : ad.keyword_id):
		if self.matrix[adv][ad] >= 1:
		    partition.add(adv,ad, self.matrix[adv][ad])

	for adv in sorted(A_c, key = lambda adv : adv.advertiser_id):
	    for ad in sorted(B_c, key = lambda ad : ad.keyword_id):
		if self.matrix[adv][ad] >= 1:
		    partition_c.add(adv, ad, self.matrix[adv][ad])

	# Do check for partitions to ensure no keyword is left out
	for kw in sorted(self.dict_of_keywords.keys(), key = lambda ad : ad.keyword_id):
	    if partition.getKeyword(kw) == None and partition_c.getKeyword(kw) == None:
		for ad in self.dict_of_keywords[kw]:
		    if partition.getAdv(ad) != None:
			partition.add(ad, kw, self.matrix[ad][kw])
		    else:
			partition_c.add(ad, kw, self.matrix[ad][kw])


	partition.setWeightMatrix()
	partition_c.setWeightMatrix()
	return (partition, partition_c)