周辺度数の制約を複体を使って表す

  • 「周辺度数」は尺度の組合せごとにあるから、「あるパターンで周辺度数が制約されている」というのは、「制約されている尺度の組合せの集合」として定義される
  • 今、ある尺度の組合せが制約されているとすると、その組合せの部分集合の尺度の組合せも(もれなく)制約されているから、「制約されている尺度の組合せのすべて」を列挙しなくても、「包含関係にある組合せの小さい方の組合せを省略」して、「大きい方の組合せ」のみを列挙しても、制約の状態を一意に説明できる
  • このように「大きい方の組合せの集合」で表すことを、「複体」での制約表現と言う
  • 以下のように、任意の尺度の組合せの集合から、包含関係に注意して、「複体」式の「大きい方の組合せ」のみを取り出してみる
  • 制約のある尺度の組合せをFace、「大きいもののみを残した」ときの尺度の組合せをFacetsと言う
library(sets)
k<-5
s<-as.set(1:k)
powset<-set_power(s)
# Facesの候補をpowsetから適当に選ぶ
# 大きいFaceが選ばれても、その部分集合のすべてが選ばれるようにはしていないので、ここで作っているFacesはFaceのリストにはなっていないことに注意Faces<-list()
cnt<-1
thres<-0.2
for(i in powset){
	if(runif(1)<thres){
		Faces[[cnt]]<-i
		cnt<-cnt+1
	}
}
print(Faces)

MakeFacets<-function(Faces){
	# Facesの要素である尺度集合同志の真部分集合関係を調べる
	Subs<-outer(Faces,Faces,FUN="set_is_proper_subset")
	# 対角成分は、要素とそれ自身の関係なので、FALSEを入れる
	diag(Subs)<-FALSE
	# ほかの要素に含まれない要素のみが1であるベクトルを作る
	tmp.facets<-abs(sign(apply(Subs,1,sum))-1)
	# ほかの要素に含まれない要素のみをFaces2リストに格納する
	Faces2<-list()
	cnt<-1
	for(i in 1:length(tmp.facets)){
		if(tmp.facets[i]==1){
			Faces2[[cnt]]<-Faces[[i]]
			cnt<-cnt+1
		}
	}
	#tmp<-set(Faces2)
	# Faces2リストの重複を除くために集合扱いする
	tmp<-as.set(Faces2)
	
}
Facets<-MakeFacets(Faces)
print(Facets)
> print(Faces)
[[1]]
{1L}

[[2]]
{2L}

[[3]]
{2L, 3L}

[[4]]
{2L, 4L}

[[5]]
{1L, 4L, 5L}

[[6]]
{2L, 3L, 5L}


> Facets<-MakeFacets(Faces)
> print(Facets)
{{2L, 4L}, {1L, 4L, 5L}, {2L, 3L, 5L}}
>