複体メモ

  • こちらで、分割表・マルコフ基底に関する話の延長で複体が出てきた
  • 表現の仕方など、こまごましたことのメモがある方がよいので、こちらにメモ
  • 複体(Wiki日本版Wiki英語版)
  • 複体は、点、線、面…でできている。この点、線、面…などをfaceと言う
  • 点、線、面…と「大きいface」になるが、「より大きいface」は「より小さいface」と、「より小さいfaceでは作りえない、1段階大きい1つのface」でできている
  • 複体に「あるface」が含まれるときには、その「あるface」に含まれる「より小さいface」はすべて含まれることになっている
  • このことから、あるfaceが複体に含まれていて、そのfaceを含む、より大きなfaceが複体に含まれていないとき、複体に含まれているface(inclusion-maximal face)をfacetと呼ぶ
  • また、ある複体のfacetsを列挙すれば、複体のfacesを列挙するよりも、簡単に(〜短く)、その複体の構成を示すことができる
  • Rを使って、faceを適当に選んで、そこから、facetを選び出すという作業をやってみよう
# For simplicial complex

library(sets)
library(igraph)
Nv<-7
Vs<-1:Nv

Nf<-4

Faces<-list()
maxN<-3
Ns<-sample(1:maxN,Nf,replace=TRUE)
for(i in 1:Nf){
	tmpVs<-sample(Vs,Ns[i])
	Faces[[i]]<-as.set(tmpVs)
}

Subs<-outer(Faces,Faces,FUN="set_is_proper_subset")
diag(Subs)<-FALSE


tmp.facets<-abs(sign(apply(Subs,1,sum))-1)

Faces2<-list()
cnt<-1
for(i in 1:length(tmp.facets)){
	if(tmp.facets[i]==1){
		Faces2[[cnt]]<-Faces[[i]]
		cnt<-cnt+1
	}
}

Facets<-as.set(Faces2)
Faces
Faces2
Facets


for (i in Facets) print(i)

Xs<-Ys<-rep(0,Nv)

Xs<-runif(Nv)
Ys<-runif(Nv)
xlim<-range(Xs)
ylim<-range(Ys)
plot(Xs,Ys,col=0,xlim=xlim,ylim=ylim)

for(i in Facets){
	tmpPower<-set_power(i)
	for(j in tmpPower){
		tmp<-c()
		for(k in j){
			tmp<-c(tmp,k)
		}
		print(tmp)
		if(length(tmp)==1){
			points(Xs[tmp],Ys[tmp])
		}else if(length(tmp)==2){
			segments(Xs[tmp[1]],Ys[tmp[1]],Xs[tmp[2]],Ys[tmp[2]])
		}
	}
}
# グラフにしてみる
E<-matrix(0,Nv,Nv)
for(i in Facets){
	tmp<-c()
	for(j in i){
		tmp<-c(tmp,j)
	}
	for(j in 1:(length(tmp)-1)){
		for(k in (j+1):length(tmp)){
			E[tmp[j],tmp[k]]<-E[tmp[k],tmp[j]]<-1
		}
	}
}

g<-graph.adjacency(E,mode="undirected")

plot(g,layout=layout.circle)