mirror of
https://github.com/kennethreitz/context.git
synced 2026-06-05 14:50:19 +00:00
105 lines
2.9 KiB
LLVM
105 lines
2.9 KiB
LLVM
/*
|
|
* @progname tree_density.ll
|
|
* @version 1
|
|
* @author Jim Eggert (eggertj@atc.ll.mit.edu)
|
|
* @category
|
|
* @output Text
|
|
* @description
|
|
|
|
This program calculates the weight of each node in an ancestral tree.
|
|
The weight of a node is given by the number of people in the database
|
|
that are most closely related to that node. The degree of relation is
|
|
measured in hops, where a hop is a step to a parent, spouse, sibling,
|
|
or child. Thus this program allows you to get an idea of where most
|
|
of the research has been done, where large numbers of cousins hook in
|
|
to the database, and where more work may be needed.
|
|
|
|
The output of the program is a simple ahnentafel with the ahnentafel
|
|
number, node weight, and key and name of the ancestors.
|
|
|
|
tree_density - a LifeLines program
|
|
by Jim Eggert (eggertj@atc.ll.mit.edu)
|
|
Version 1, 15 February 1996
|
|
*/
|
|
|
|
global(plist)
|
|
global(mark)
|
|
global(anccounts)
|
|
|
|
proc include(person,anckey)
|
|
{
|
|
if (person) {
|
|
set(pkey,key(person))
|
|
if (not(lookup(mark,pkey))) {
|
|
set(skey,save(pkey))
|
|
set(sanckey,save(anckey))
|
|
insert(mark,skey,sanckey)
|
|
set(count,lookup(anccounts,sanckey))
|
|
insert(anccounts,sanckey,add(count,1))
|
|
enqueue(plist,skey)
|
|
}
|
|
}
|
|
}
|
|
|
|
proc main ()
|
|
{
|
|
table(mark)
|
|
table(anccounts)
|
|
list(plist)
|
|
list(alist)
|
|
|
|
getindimsg(from_person,
|
|
"Enter person to compute relation from:")
|
|
set(from_key,save(key(from_person)))
|
|
call include(from_person,from_key)
|
|
|
|
set(counter,0)
|
|
set(nextcount,0)
|
|
|
|
while (pkey,dequeue(plist)) {
|
|
incr(counter)
|
|
if (ge(counter,nextcount)) {
|
|
print(d(counter)," ")
|
|
set(nextcount,add(nextcount,100))
|
|
}
|
|
|
|
set(person,indi(pkey))
|
|
set(anckey,save(lookup(mark,pkey)))
|
|
if (not(strcmp(pkey,anckey))) {
|
|
call include(father(person),save(key(father(person))))
|
|
call include(mother(person),save(key(mother(person))))
|
|
}
|
|
else {
|
|
call include(father(person),anckey)
|
|
call include(mother(person),anckey)
|
|
}
|
|
children(parents(person),child,cnum) {
|
|
call include(child,anckey)
|
|
}
|
|
families(person,fam,spouse,pnum) {
|
|
call include(spouse,anckey)
|
|
children(fam,child,cnum) {
|
|
call include(child,anckey)
|
|
}
|
|
}
|
|
}
|
|
|
|
"Ahnentafel" col(10) " weight" col(20) "key" col(28) "name"
|
|
enqueue(plist,from_key)
|
|
enqueue(alist,1)
|
|
while (pkey,dequeue(plist)) {
|
|
set(a,dequeue(alist))
|
|
set(p,indi(pkey))
|
|
if (f,father(p)) {
|
|
enqueue(plist,save(key(f)))
|
|
enqueue(alist,add(a,a))
|
|
}
|
|
if (m,mother(p)) {
|
|
enqueue(plist,save(key(m)))
|
|
enqueue(alist,add(a,a,1))
|
|
}
|
|
d(a) col(10) rjustify(d(lookup(anccounts,pkey)),8)
|
|
col(20) key(p) col(28) name(p) "\n"
|
|
}
|
|
}
|