// iterator over this cpu subset using lpt whole cell algorithm
// assuming a specified complexity for mitral and granule
cxmitral = 1675
cxgranule = 258
objref lptiter_gidvec, pc
iterator cell_gids() { local i
if (object_id(lptiter_gidvec) == 0) { lptiter_set() }
for i=0, lptiter_gidvec.size-1 {
$&1 = lptiter_gidvec.x[i]
$&2 = i
iterator_statement
}
}
proc lptiter_set() {local i localobj ldbal, cx, p
cx = new Vector(ncell)
cx.fill(cxmitral, nmitral_begin, ngranule_begin-1)
cx.fill(cxgranule, ngranule_begin, ncell-1)
p = lptiter_lpt(cx, pc.nhost, 0)
lptiter_gidvec = p.c.indvwhere("==", pc.id)
lptiter_gidvec.add(nmitral_begin)
//for i=0, lptiter_gidvec.size-1 { printf("%d %d\n", pc.id, lptiter_gidvec.x[i])}
}
// from loadbal.hoc
// least processing time algorithm
// $o1 is vector of weights $2 is number of partitions
// return is vector of partition indices parallel to weights
obfunc lptiter_lpt() {local i, j localobj wx, ix, pw
if ($3) {
print $o1.size, " piece weights"
$o1.printf
}
wx = $o1.sortindex.reverse
ix = new Vector($o1.size)
pw = new Vector($2)
for i=0, $o1.size-1 {
j = wx.x[i]
w = $o1.x[j]
ip = pw.min_ind
pw.x[ip] += w
ix.x[j] = ip
}
if ($3) {
print $2, " partition complexities"
pw.printf
}
if (pw.mean) {
thread_cxbal_ = pw.max/(pw.mean)
}else{
thread_cxbal_ = 1
}
return ix
}