Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Python > Unsupported operand type(s) for +: 'float' and 'tuple'

Reply
Thread Tools

Unsupported operand type(s) for +: 'float' and 'tuple'

 
 
Francesc Segura
Guest
Posts: n/a
 
      06-10-2011
Hello all, I'm new to this and I'm having problems on summing two
values at python.

I get the following error:

Traceback (most recent call last):
File "C:\edge-bc (2).py", line 168, in <module>
if (costGG <= cost + T0):
TypeError: unsupported operand type(s) for +: 'float' and 'tuple'

I'm working with networkx and my program is this one:


import networkx as NX
import pylab as P
from math import exp, log
import random
try:
import matplotlib.pyplot as plt
except:
raise

##N=27
N=30
ITERATIONS = 60
T0 = 0.5
RO = 0.99
NK = 20

def costG(G):

bc = NX.edge_betweenness_centrality(G,normalized=True)
edges = NX.edges(G)

for i in range(len(edges)):
total = 0
cost = 0
factor = 1

liedges = list(edges[i])
linode1 = list(liedges[0])
linode2 = list(liedges[1])

distance = (((linode2[0]-linode1[0])%N)^2)+(((linode2[1]-
linode1[1])%N)^2)

edgecentrality = bc[edges[i]]

factor = (distance-19790)*(-0.000055586)

cost = distance*edgecentrality*factor

total = total + cost

return(total)

def avedistance(G):




return (AvgDist)

def costGeasy(G):
bc = NX.edge_betweenness_centrality(G,normalized=True)
total = 0
for i in range(len(bc)):
total=total+bc.values()[i]

return (total)


G = NX.grid_2d_graph(N,N,True)

for i in range(N):
for j in range(N):
G.add_edge((i,j),((i+1) % N ,(j+1) % N))
G.add_edge((i,j),((i-1) % N ,(j+1) % N))


NODES=NX.number_of_nodes(G)
nod=NX.nodes(G)
EDGES=NX.number_of_edges(G)
edg=NX.edges(G)

pos={}
for i in range(NODES):
pos[nod[i]]=(nod[i][0]/(N*1.0),nod[i][1]/(N*1.0))

NX.draw(G,pos,node_color='r',node_size=20,with_lab els=False,width=1)
plt.title("Inicial graph, Toroidal 27x27, degree 8")
plt.savefig("initial_grid_malla.png")
plt.show()

pos=NX.spring_layout(G,iterations=100)
NX.draw(G,pos,node_color='r',node_size=20,with_lab els=False,width=1)
plt.title("Inicial graph, Toroidal 27x27, degree 8")
plt.savefig("initial_grid_tor.png")
plt.show()

initGr = G
best_graph = G
best_cost = costG(G)
average_distance = avedistance(G)
initCost = best_cost
initGHist = NX.degree_histogram(G)

##print NX.info(initGr)
##print 'Diameter = %f ' % (NX.diameter(G))
##print 'Avg Clust Coeff. NetworkX = %-6.4f ' %
(NX.average_clustering(G))
##print 'Avg Dist. NetworkX = %-6.4f ' % (average_distance)
##print 'Distribucio de Graus'
##print initGHist
##print 'Cost inicial'
##print initCost

T0 = initCost*0,1

for y in range(NK):
for x in range(ITERATIONS):
cost = costG(G)
if (cost < (best_cost)):
best_graph = G
best_cost = cost
GG = G
u = random.randint(0,NODES-1)
while GG.degree(nod[u]) <= 1:
u = random.randint(0,NODES-1)
v = random.randint(0,GG.degree(nod[u])-1)
GG.remove_edge(nod[u],GG[nod[u]].keys()[v])
a = random.randint(0,NODES-1)
b = random.randint(0,NODES-1)
adj=G.adjacency_list()
while ((nod[b] in adj[a]) or (b == a)):
a = random.randint(0,NODES-1)
b = random.randint(0,NODES-1)
GG.add_edge(nod[a],nod[b])
while (NX.is_connected(GG) == 0):
GG = G
u = random.randint(0,NODES-1)
while GG.degree(nod[u]) <= 1:
u = random.randint(0,NODES-1)
v = random.randint(0,GG.degree(nod[u])-1)
GG.remove_edge(nod[u],GG[nod[u]].keys()[v])
a = random.randint(0,NODES-1)
b = random.randint(0,NODES-1)
adj=GG.adjacency_list()
while ((nod[b] in adj[a]) or (b == a)):
a = random.randint(0,NODES-1)
b = random.randint(0,NODES-1)
GG.add_edge(nod[a],nod[b])

costGG = costG(GG)
if (costGG <= cost):
G = GG
else:
if (costGG <= cost + T0):
G = GG

T0 = T0 * RO
print 'IT %d' % y
print 'BEST %f ' % best_cost


best_graph = G
print NX.info(best_graph)
print 'Diameter = %f ' % (NX.diameter(best_graph))
print 'Avg Clust Coeff. NetworkX = %-6.4f ' %
(NX.average_clustering(best_graph))
average_distance = avedistance(best_graph)
print 'Avg Dist. NetworkX = %-6.4f ' % (average_distance)
print 'Distribucio de Graus'
print NX.degree_histogram(best_graph)
print 'Millor Cost'
print best_cost

NX.write_edgelist(best_graph,'optimal-graph.dat')

pos={}
for i in range(NODES):
pos[nod[i]]=(nod[i][0]/(N*1.0),nod[i][1]/(N*1.0))


NX.draw(best_graph,pos,node_color='r',node_size=20 ,with_labels=False,width=1)
plt.title("Final graph, Toroidal 27x27, degree 8")
plt.savefig("final_grid_malla.png")
plt.show()

pos=NX.spring_layout(G,iterations=100)
NX.draw(best_graph,pos,node_color='r',node_size=20 ,with_labels=False,width=1)
plt.title("Final graph, Toroidal 27x27, degree 8")
plt.savefig("final_grid_tor.png")
plt.show()
 
Reply With Quote
 
 
 
 
Tim Chase
Guest
Posts: n/a
 
      06-10-2011
On 06/10/2011 05:30 AM, Francesc Segura wrote:
> Hello all, I'm new to this and I'm having problems on summing two
> values at python.
>
> I get the following error:
>
> Traceback (most recent call last):
> File "C:\edge-bc (2).py", line 168, in<module>
> if (costGG<= cost + T0):
> TypeError: unsupported operand type(s) for +: 'float' and 'tuple'
>
> I'm working with networkx and my program is this one:

....
> T0 = initCost*0,1


Here, you're setting T0 to the tuple "(initCost*0, 1)" == "(0,
1)". I think you mean to use a period instead of a comma.

You then try to add that to a float (cost), and Python doesn't
like that. I wouldn't either

-tkc


 
Reply With Quote
 
 
 
 
Francesc Segura
Guest
Posts: n/a
 
      06-10-2011
On 10 jun, 13:38, Tim Chase <(E-Mail Removed)> wrote:
> On 06/10/2011 05:30 AM, Francesc Segura wrote:
>
> > Hello all, I'm new to this and I'm having problems on summing two
> > values at python.

>
> > I get the following error:

>
> > Traceback (most recent call last):
> > * *File "C:\edge-bc (2).py", line 168, in<module>
> > * * *if (costGG<= cost + T0):
> > TypeError: unsupported operand type(s) for +: 'float' and 'tuple'

>
> > I'm working with networkx and my program is this one:

> ...
> > T0 = initCost*0,1

>
> Here, you're setting T0 to the tuple "(initCost*0, 1)" == "(0,
> 1)". *I think you mean to use a period instead of a comma.
>
> You then try to add that to a float (cost), and Python doesn't
> like that. *I wouldn't either
>
> -tkc


Thanks a lot, I am a noob retard!
 
Reply With Quote
 
Gabriel Genellina
Guest
Posts: n/a
 
      06-11-2011
En Fri, 10 Jun 2011 07:30:28 -0300, Francesc Segura <(E-Mail Removed)>
escribió:

> Hello all, I'm new to this and I'm having problems on summing two
> values at python.
>
> I get the following error:
>
> Traceback (most recent call last):
> File "C:\edge-bc (2).py", line 168, in <module>
> if (costGG <= cost + T0):
> TypeError: unsupported operand type(s) for +: 'float' and 'tuple'


I see Tim Chase already told you about this error. Let me make a few
comments about the rest.

> try:
> import matplotlib.pyplot as plt
> except:
> raise


I guess the above try/except was left from some earlier debugging attempt
- such an except clause is useless, just omit it.

> T0 = 0.5
> RO = 0.99


Perhaps those names make sense in your problem at hand, but usually I try
to use more meaningful ones. 0 and O look very similar in some fonts.

> for i in range(len(edges)):
> total = 0
> cost = 0
> factor = 1
> liedges = list(edges[i])
> linode1 = list(liedges[0])
> linode2 = list(liedges[1])


list(something) creates a new list out of the elements from `something`.
You're just iterating here, so there is no need to duplicate those lists.
In addition, Python is not C: the `for` statement iterates over a
collection, you don't have to iterate over the indices and dereference
each item:

for liedges in edges:
linode1 = liedges[0]
linode2 = liedges[1]


> distance = (((linode2[0]-linode1[0])%N)^2)+(((linode2[1]-
> linode1[1])%N)^2)


That doesn't evaluate what you think it does. ^ is the "bitwise xor"
operator, and I bet you want **, the "power" operator.


> total = total + cost
> return(total)


return is not a function but a statement; those () are unnecesary and
confusing.
And I think you want to initialize total=0 *before* entering the loop;
also, initializing cost and factor is unnecesary.

> def costGeasy(G):
> bc = NX.edge_betweenness_centrality(G,normalized=True)
> total = 0
> for i in range(len(bc)):
> total=total+bc.values()[i]
>
> return (total)


bc = NX.edge_betweenness_centrality(G,normalized=True)
values = bc.values()
total = sum(values)
return total

==>

return sum(bc.values())


> pos={}
> for i in range(NODES):
> pos[nod[i]]=(nod[i][0]/(N*1.0),nod[i][1]/(N*1.0))


In Python version 2.x, 1/3 evals to 0, but that's a mistake; it is fixed
in the 3.x version. If you put this line at the top of your script:
from __future__ import division
then 1/3 returns 0.3333...
When you actually want integer division, use //, like 1//3

So we can rewrite the above as:

from __future__ import division
....
for node in nod:
pos[node] = (node[0] / N, node[1] / N)

Another way, not relying on true division:

divisor = float(N)
for node in nod:
pos[node] = (node[0] / divisor, node[1] / divisor)

or even:

pos = dict((node, (node[0] / divisor, node[1] / divisor)) for node in nod)


> for y in range(NK):
> for x in range(ITERATIONS):
> cost = costG(G)
> if (cost < (best_cost)):
> best_graph = G
> best_cost = cost
> GG = G


Again, I think this doesn't do what you think it does. GG = G means "let's
use the name GG for the object currently known as G". GG is not a "copy"
of G, just a different name for the very same object. Later operations
like GG.remove_edge(...) modify the object - and you'll see the changes in
G, and in best_graph, because those names all refer to the same object.
I think you'll benefit from reading this:
http://effbot.org/zone/python-objects.htm

> a = random.randint(0,NODES-1)
> b = random.randint(0,NODES-1)
> adj=G.adjacency_list()
> while ((nod[b] in adj[a]) or (b == a)):
> a = random.randint(0,NODES-1)
> b = random.randint(0,NODES-1)
> GG.add_edge(nod[a],nod[b])


As above, I'd avoid using indexes, take two random nodes using
random.sample instead, and avoid adjacency_list():

while True:
a, b = random.sample(nod, 2)
if b not in G[a]:
break
GG.add_edge(a, b)

(mmm, I'm unsure of the adjacency test, I've used networkx some time ago
but I don't have it available right now)

--
Gabriel Genellina

 
Reply With Quote
 
Gabriel Genellina
Guest
Posts: n/a
 
      06-11-2011
En Fri, 10 Jun 2011 07:30:28 -0300, Francesc Segura <(E-Mail Removed)>
escribió:

> Hello all, I'm new to this and I'm having problems on summing two
> values at python.
>
> I get the following error:
>
> Traceback (most recent call last):
> File "C:\edge-bc (2).py", line 168, in <module>
> if (costGG <= cost + T0):
> TypeError: unsupported operand type(s) for +: 'float' and 'tuple'


I see Tim Chase already told you about this error. Let me make a few
comments about the rest.

> try:
> import matplotlib.pyplot as plt
> except:
> raise


I guess the above try/except was left from some earlier debugging attempt
- such an except clause is useless, just omit it.

> T0 = 0.5
> RO = 0.99


Perhaps those names make sense in your problem at hand, but usually I try
to use more meaningful ones. 0 and O look very similar in some fonts.

> for i in range(len(edges)):
> total = 0
> cost = 0
> factor = 1
> liedges = list(edges[i])
> linode1 = list(liedges[0])
> linode2 = list(liedges[1])


list(something) creates a new list out of the elements from `something`.
You're just iterating here, so there is no need to duplicate those lists.
In addition, Python is not C: the `for` statement iterates over a
collection, you don't have to iterate over the indices and dereference
each item:

for liedges in edges:
linode1 = liedges[0]
linode2 = liedges[1]


> distance = (((linode2[0]-linode1[0])%N)^2)+(((linode2[1]-
> linode1[1])%N)^2)


That doesn't evaluate what you think it does. ^ is the "bitwise xor"
operator, and I bet you want **, the "power" operator.


> total = total + cost
> return(total)


return is not a function but a statement; those () are unnecesary and
confusing.
And I think you want to initialize total=0 *before* entering the loop;
also, initializing cost and factor is unnecesary.

> def costGeasy(G):
> bc = NX.edge_betweenness_centrality(G,normalized=True)
> total = 0
> for i in range(len(bc)):
> total=total+bc.values()[i]
>
> return (total)


bc = NX.edge_betweenness_centrality(G,normalized=True)
values = bc.values()
total = sum(values)
return total

==>

return sum(bc.values())


> pos={}
> for i in range(NODES):
> pos[nod[i]]=(nod[i][0]/(N*1.0),nod[i][1]/(N*1.0))


In Python version 2.x, 1/3 evals to 0, but that's a mistake; it is fixed
in the 3.x version. If you put this line at the top of your script:
from __future__ import division
then 1/3 returns 0.3333...
When you actually want integer division, use //, like 1//3

So we can rewrite the above as:

from __future__ import division
....
for node in nod:
pos[node] = (node[0] / N, node[1] / N)

Another way, not relying on true division:

divisor = float(N)
for node in nod:
pos[node] = (node[0] / divisor, node[1] / divisor)

or even:

pos = dict((node, (node[0] / divisor, node[1] / divisor)) for node in nod)


> for y in range(NK):
> for x in range(ITERATIONS):
> cost = costG(G)
> if (cost < (best_cost)):
> best_graph = G
> best_cost = cost
> GG = G


Again, I think this doesn't do what you think it does. GG = G means "let's
use the name GG for the object currently known as G". GG is not a "copy"
of G, just a different name for the very same object. Later operations
like GG.remove_edge(...) modify the object - and you'll see the changes in
G, and in best_graph, because those names all refer to the same object.
I think you'll benefit from reading this:
http://effbot.org/zone/python-objects.htm

> a = random.randint(0,NODES-1)
> b = random.randint(0,NODES-1)
> adj=G.adjacency_list()
> while ((nod[b] in adj[a]) or (b == a)):
> a = random.randint(0,NODES-1)
> b = random.randint(0,NODES-1)
> GG.add_edge(nod[a],nod[b])


As above, I'd avoid using indexes, take two random nodes using
random.sample instead, and avoid adjacency_list():

while True:
a, b = random.sample(nod, 2)
if b not in G[a]:
break
GG.add_edge(a, b)

(mmm, I'm unsure of the adjacency test, I've used networkx some time ago
but I don't have it available right now)

--
Gabriel Genellina

 
Reply With Quote
 
Terry Reedy
Guest
Posts: n/a
 
      06-11-2011
On 6/10/2011 6:30 AM, Francesc Segura wrote:
> Hello all, I'm new to this and I'm having problems on summing two
> values at python.
>
> I get the following error:
>
> Traceback (most recent call last):
> File "C:\edge-bc (2).py", line 168, in<module>
> if (costGG<= cost + T0):
> TypeError: unsupported operand type(s) for +: 'float' and 'tuple'
>
> I'm working with networkx and my program is this one:


[snip about 100 lines]

Before posting code that does not work, it is a good idea to reduce to
to some minimum needed to exhibit the problem. If you had done that, you
may well have found the answer.

In this specific case, you should have searched for all lines making
assignments to the names causing a problem. This is easier to do by eye
with a minimal example. Or, use a search function for 'T0 =' (or 'T0='
if needed, but it is not) with Find Next and the second hit is the
offending line ("T0 = initCost*0,1").

--
Terry Jan Reedy

 
Reply With Quote
 
Thomas Rachel
Guest
Posts: n/a
 
      06-12-2011
Am 11.06.2011 03:02 schrieb Gabriel Genellina:
>
> Perhaps those names make sense in your problem at hand, but usually I try
> to use more meaningful ones.


Until here we agree.

> 0 and O look very similar in some fonts.


That is right - but who would use such fonts for programming?


Thomas

 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
unsupported operand type(s) for ^: 'float' and 'float' Florian Lindner Python 1 06-15-2007 01:39 PM
Re: TypeError: unsupported operand type(s) for -: 'tuple' and 'tuple' Jay Parlar Python 0 03-17-2006 02:58 AM
Python interpreter error: unsupported operand type(s) for -: 'tuple' and 'int' Rakesh Python 3 03-30-2005 02:36 PM
Re: TypeError: unsupported operand type(s) for +: 'NoneType' and 'str' Brett C. Python 2 08-30-2004 10:25 PM
TypeError: unsupported operand type(s) for +: 'NoneType' and 'str' Martin Koekenberg Python 3 08-26-2004 12:04 PM



Advertisments