awips2/pythonPackages/scientific/Src/Scientific_affinitypropagation.pyx
root 9f19e3f712 Initial revision of AWIPS2 11.9.0-7p5
Former-commit-id: 64fa9254b946eae7e61bbc3f513b7c3696c4f54f
2012-01-06 08:55:05 -06:00

52 lines
1.5 KiB
Cython
Executable file

# Implementation of Affinity Propagation in Pyrex
# Accelerates DataSet.findCluster by a factor of 5.
#
# Written by Konrad Hinsen
# last revision: 2007-3-20
#
include 'Scientific/numeric.pxi'
from Scientific import N
def _affinityPropagation(dataset, ArrayType s, ArrayType a,
ArrayType r, float damping):
cdef ArrayType as
cdef ArrayType r_new
cdef ArrayType a_new
cdef ArrayType rpos
cdef ArrayType ind_array
cdef long *ind
cdef double *dptr
cdef double v
cdef int i
cdef int j
as = a + s
r_new = N.zeros((dataset.nsimilarities,), N.Float)
for i from 0 <= i < dataset.nsimilarities:
ind_array = dataset.r_update_indices[i]
ind = <long *>ind_array.data
dptr = <double *>as.data
v = dptr[ind[0]]
for j from 1 <= j < ind_array.dimensions[0]:
if dptr[ind[j]] > v:
v = dptr[ind[j]]
r_new[i] = s[i] - v
r = damping*r + (1-damping)*r_new
rpos = N.maximum(0., r)
a_new = N.take(r, dataset.a_update_indices_1)
a_new[-dataset.nitems:] = 0.
for i from 0 <= i < dataset.nsimilarities:
ind_array = dataset.a_update_indices_2[i]
ind = <long *>ind_array.data
dptr = <double *>rpos.data
v = dptr[ind[0]]
for j from 1 <= j < ind_array.dimensions[0]:
v = v + dptr[ind[j]]
a_new[i] = a_new[i] + v
a_new[:-dataset.nitems] = N.minimum(0., a_new[:-dataset.nitems])
a = damping*a + (1-damping)*a_new
return a, r