- こちらやこちらで有性生殖の(行列)演算のことを書いている
- 個々の親子トリオは線形代数(ベクトル・行列)を使った演算だった
- 家系図全体の演算はどうなるだろう
- 家系図はグラフで言う「木」
- 時間の約束は守っているので、すべてのトリオの生成には順序があるので、すべてのトリオの演算には全順序がありそうだ
- だからと言って、「家系図」の「木」は一列に並んでいない
- いわゆる半順序の様相を呈している
- さて、これはどういう風に考えればよいか
- いずれにせよ、「家系図〜木」が与えられた時点で、トリオ演算として実行するべき「(全)順序」を定めることができるので、何度も同じ「グラフ〜木」に親子トリオ演算を行うときには、「グラフ」を「直列処理」に直して実行することで、「グラフ」を「直列処理」にする部分を解くオーバーヘッドを省略することはできそうだ
- ぼんやりしたところでは「多価関数〜グラフ〜グラフ〜順序(こちら)」、「有性生殖による多様性算出〜多価化する線形代数処理?(こちら」、「グラフ〜多次元空間の取引(こちら)」とこの話がつながるようなつながらないような・・・(たぶん、つながる、緩くはつながる)
- うんちくはさておき、親子関係情報が「思いついた順番」のときに、時系列を考慮してIDづけしなおして並べ替えてみよう
p<-matrix(
c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
0, 0, 0, 0, 2, 2, 4, 4, 6, 6, 0, 0, 12, 13,
0, 0, 0, 0, 1, 1, 3, 3, 7, 7, 0, 0, 11, 10,
0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 1, 1,
1,1,1,1,2,3,3,1,3,1,1,2,2,1),
ncol=5)
library(kinship)
MakePedigreeFromFamilyInfo<-function(p){
ns<-length(p[,1])
affected<-status<-rep(1,ns)
affected[which(p[,5]==2)]<-0
affected[which(p[,5]==3)]<-0
status[which(p[,5]==1)]<-0
status[which(p[,5]==2)]<-0
ptemp<-pedigree(id=p[,1],dadid=p[,3],momid=p[,2],sex=p[,4],affected=affected,status=status)
if(sum(ptemp$affected)==0)ptemp$affected<-affected
ptemp
}
s<-sample(1:length(p[,1]))
sbind<-cbind(1:length(p[,1]),s)
p2<-p
ReOrder<-function(p,s){
p2<-p
for(i in 1:length(p[,1])){
p2[i,1]<-s[p[i,1]]
if(p[i,2]!=0)p2[i,2]<-s[p[i,2]]
if(p[i,3]!=0)p2[i,3]<-s[p[i,3]]
}
p2
}
ReOrder2<-function(p,s2){
p2<-p
p2
}
p2<-ReOrder(p,s)
p2sort<-p2[order(p2[,1]),]
ptemp<-MakePedigreeFromFamilyInfo(p2sort)
plot(ptemp)
SortPedigree<-function(p){
n<-length(p[,1])
newid<-rep(-1,n)
sumfm<-p[,2]+p[,3]
noparents<-which(sumfm==0)
withparents<-which(sumfm!=0)
cnt<-length(noparents)
newid[p[noparents,1]]<-1:cnt
cnt<-cnt+1
while(length(withparents>0)){
for(i in withparents){
tmpm<-p[i,2]
tmpf<-p[i,3]
if(newid[tmpm]!=-1 & newid[tmpf]!=-1){
newid[p[i,1]]<-cnt
cnt<-cnt+1
}
withparents<-which(newid==-1)
}
}
cbind(1:n,newid)
}
neworder<-SortPedigree(p2sort)
neworder
p3<-ReOrder(p2sort,neworder[,2])
p3sort<-p3[order(p3[,1]),]
p
p2
p2sort
p3
par(mfcol=c(2,3))
plot(MakePedigreeFromFamilyInfo(p))
plot(MakePedigreeFromFamilyInfo(p2))
plot(MakePedigreeFromFamilyInfo(p2sort))
plot(MakePedigreeFromFamilyInfo(p3))
plot(MakePedigreeFromFamilyInfo(p3sort))
par(mfcol=c(1,1))