Page Menu
Home
c4science
Search
Configure Global Search
Log In
Files
F103109177
bibauthorid_meld_edges.pyx
No One
Temporary
Actions
Download File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Subscribers
None
File Metadata
Details
File Info
Storage
Attached
Created
Thu, Feb 27, 08:46
Size
3 KB
Mime Type
text/x-python
Expires
Sat, Mar 1, 08:46 (1 d, 23 h)
Engine
blob
Format
Raw Data
Handle
24500813
Attached To
R3600 invenio-infoscience
bibauthorid_meld_edges.pyx
View Options
from bibauthorid_prob_matrix import Bib_matrix
def meld_edges(p1, p2):
'''
Creates one out_edges set from two.
The operation is associative and commutative.
The objects are: (out_edges for in a cluster, number of vertices in the same cluster)
'''
cdef int verts1, verts2
out_edges1, verts1 = p1
out_edges2, verts2 = p2
assert verts1 > 0 and verts2 > 0, 'MELD_EDGES: verts problem %s %s ' % (str(verts1), str(verts2))
cdef float vsum, invsum
vsum = verts1 + verts2
invsum = 1. / vsum
assert len(out_edges1) == len(out_edges2), "MELD_EDGES: Invalid arguments for meld edges"
size = len(out_edges1)
result = list()
for i in xrange(size):
result.append(median(out_edges1[i][0], out_edges1[i][1], out_edges2[i][0], out_edges1[i][1],
verts1, verts2, invsum))
return (result, vsum)
cdef tuple median(float e10,float e11, float e20, float e21, int verts1, int verts2, float invsum):
cdef float i1, i2, inter_cert, inter_prob
if e10 < 0:
return (e10,e11)
if e20 < 0:
return (e20,e21)
i1 = e11 * verts1
i2 = e21 * verts2
inter_cert = i1 + i2
inter_prob = e10 * i1 + e20 * i2
try:
return (inter_prob / inter_cert, inter_cert * invsum)
except ZeroDivisionError:
return (0.,0.)
#old code before cythonization
#def meld_edges(p1, p2):
# '''
# Creates one out_edges set from two.
# The operation is associative and commutative.
# The objects are: (out_edges for in a cluster, number of vertices in the same cluster)
# '''
# out_edges1, verts1 = p1
# out_edges2, verts2 = p2
# assert verts1 > 0 and verts2 > 0, PID()+'MELD_EDGES: verts problem %s %s ' % (str(verts1), str(verts2))
# vsum = verts1 + verts2
# invsum = 1. / vsum
#
# special_numbers = Bib_matrix.special_numbers #local reference optimization
#
# def median(e1, e2):
#
# #dirty optimization, should check if value is in dictionary instead
# # if e1[0] in special_numbers: return e1
# # if e2[0] in special_numbers: return e2
# if e1[0] < 0:
# assert e1[0] in special_numbers, "MELD_EDGES: wrong value for median? %s" % str(e1)
# return e1
# if e2[0] < 0:
# assert e2[0] in special_numbers, "MELD_EDGES: wrong value for median? %s" % str(e2)
# return e2
#
# i1 = e1[1] * verts1
# i2 = e2[1] * verts2
# inter_cert = i1 + i2
# inter_prob = e1[0] * i1 + e2[0] * i2
# try:
# return (inter_prob / inter_cert, inter_cert * invsum)
# except ZeroDivisionError:
# return (0.,0.)
#
# assert len(out_edges1) == len(out_edges2), "Invalid arguments for meld edges"
# size = len(out_edges1)
#
# result = numpy.ndarray(shape=(size, 2), dtype=float, order='C')
# gc.disable()
## for i in xrange(size):
## result[i] = median(out_edges1[i], out_edges2[i])
## assert (result[i][0] >= 0 and result[i][0] <= 1) or result[i][0] in Bib_matrix.special_numbers, PID()+'MELD_EDGES: value %s' % result[i]
## assert (result[i][1] >= 0 and result[i][1] <= 1) or result[i][1] in Bib_matrix.special_numbers, PID()+'MELD_EDGES: compat %s' % result[i]
# result = [median(x,y) for x,y in izip(out_edges1, out_edges2)]
# gc.enable()
# return (result, vsum)
Event Timeline
Log In to Comment