On 16.09.2016 16:22, Alexandre Hannud Abdo wrote:
> Don't think there's a boxed method for this task, [...]
In this particular case, in fact there is:
g.vp.year = incident_edges_op(g, "out", "min", g.ep.year)
Here are the docs:
Some small comments to your tips:
> Two possible ways to improve it:
> * you could use the fact that the min() function in Python takes an iterable
> as argument, and pass it something like the generator below:
> # chain must be imported from itertools
> for v in g.vertices():
> g.vp.year[v] = min( g.ep.year[e] for e in chain(v.out_edges(),
> v.in_edges()) )
I think it would be better to use v.all_edges() instead of chain(), but
chain() is a good general tip to have in mind.
> * you could iterate only once over g.edges() and then, update the g.vp.year
> of source and target for each edge.
> I would go with something like this:
> # this assumes g.vp.year was initlized to a large value by passing 'val' to
> for e in g.edges():
> for v in (e.source(), e.target()):
> if g.vp.year[v] > g.ep.year[e]:
> g.vp.year[v] = g.ep.year[e]
Definitely the most elegant. The only reason why "incident_edges_op()"
is not implemented like this in C++ is because doing it like your first
option can be parallelized. But this is a moot point in Python.
Tiago de Paula Peixoto <ti...@skewed.de>
graph-tool mailing list