Beispiel #1
0
	def conv(self,iFile,idFN,itemFN,oFile,mapFile):
		temp=nu.Mtemp()
		xxtra=temp.file()

		# 入力ファイルのidがnilの場合は連番を生成して新たなid項目を作成する。
		f0   = nm.mcut(f=itemFN+":##item",i=iFile)
		f0 <<= nm.mcount(k="##item",a="##freq")
		f0 <<= nm.mnumber(s="##freq%nr",a="##num",o=mapFile)
		f0.run()

		f1   = nm.mjoin(k=itemFN,K="##item",f="##num",m=mapFile,i=iFile,o=xxtra)
		f1.run()
		
		#f1 <<= nm.mtra(k=idFN,f="##num")
		#f1 <<= nm.mnumber(q=True,a="##traID")
		#f1 <<= nm.mcut(f="##num",nfno=True,o=oFile)

		extTake.mmaketra(i=xxtra,o=oFile,f="##num",k=idFN)

		#f1.run()

		# ##item,##freq%0nr,##num
		# b,4,0
		# d,4,1
		size=nu.mrecount(i=oFile,nfn=True)

		return size
Beispiel #2
0
    def addTaxo(self, taxonomy):

        self.taxonomy = taxonomy

        self.items.addTaxo(self.taxonomy)  # アイテムクラスにtaxonomyを追加する

        tFile = taxonomy.file
        itemFN = taxonomy.itemFN
        taxoFN = taxonomy.taxoFN

        tf = nu.Mtemp()
        xx1 = tf.file()
        cpara = "%s,%s:%s" % (self.idFN, taxoFN, self.itemFN)
        f = None
        f <<= nm.mnjoin(i=self.file,
                        k=self.itemFN,
                        K=itemFN,
                        f=taxoFN,
                        m=tFile)
        f <<= nm.mcut(f=cpara, o=xx1)
        f.run()

        ipara = "%s,%s" % (self.file, xx1)
        kpara = "%s,%s" % (self.idFN, self.itemFN)
        xx2 = tf.file()
        nm.mcat(i=ipara).muniq(k=kpara, o=xx2).run(msg="on")

        self.file = self.temp.file()
        shutil.move(xx2, self.file)
Beispiel #3
0
    def __init__(self, iFile, idFN, itemFN, clsFN=None):
        self.file = None  # トランザクションファイル名
        self.idFN = None  # トランザクションID項目名(String)
        self.itemFN = None  # アイテム集合項目名(String)
        self.clsFN = None  # クラス項目名(String)
        self.traSize = None  # トランザクションサイズ(Num)
        self.items = None  # Itemsクラス
        self.taxonomy = None  # 階層分類クラス
        self.clsNameRecSize = None  # クラス別件数
        self.clsSize = None  # クラス数
        self.cFile = None  # クラスファイル

        self.temp = nu.Mtemp()
        self.iFile = iFile  # 入力ファイル
        self.iPath = os.path.abspath(self.iFile)  # フルパス
        self.idFN = idFN  # トランザクションID項目名
        self.itemFN = itemFN  # 入力ファイル上のアイテム集合項目名
        self.file = self.temp.file()  # 出力ファイル名

        fpara = self.idFN + "," + self.itemFN

        nm.mcut(f=fpara, i=self.iFile).muniq(k=fpara, o=self.file).run()

        # レコード数の計算
        self.recCnt = nu.mrecount(i=self.file)

        # トランザクション数の計算
        xx1 = nm.mcut(f=self.idFN, i=self.file).muniq(k=self.idFN).mcount(
            a='__cnt').mcut(f='__cnt').run()
        self.traSize = int(xx1[0][0])

        # トランザクションデータからアイテムオブジェクトを生成
        self.items = items.Items(self.file, self.itemFN)

        # クラスデータ
        if clsFN:
            self.clsFN = clsFN
            self.cFile = self.temp.file()
            fpara_c = "%s,%s" % (self.idFN, self.clsFN)

            nm.mcut(f=fpara_c, i=self.iFile).muniq(k=fpara_c,
                                                   o=self.cFile).run()

            # 文字列としてのクラス別件数配列を数値配列に変換する
            self.clsSize = 0
            self.clsNames = []
            self.clsNameRecSize = {}
            for vv in nm.mcut(f=self.clsFN, i=self.cFile).mcount(k=self.clsFN,
                                                                 a='count'):
                self.clsNames.append(vv[0])
                self.clsNameRecSize[vv[0]] = int(vv[1])
                self.clsSize += 1
Beispiel #4
0
    def __param_check_set(self, kwd):

        # 存在チェック
        for k, v in kwd.items():
            if not k in mgpmetis.paramter:
                raise (Exception("KeyError: {} in {} ".format(
                    k, self.__class__.__name__)))

        self.msgoff = True

        self.kway = int(kwd["kway"])
        self.oFile = kwd["o"] if "o" in kwd else None
        self.eFile = kwd["ei"]
        self.nFile = kwd["ni"] if "ni" in kwd else None
        self.dFile = kwd["dat"] if "dat" in kwd else None
        self.mFile = kwd["map"] if "map" in kwd else None

        if "ef" in kwd:
            ef0 = kwd["ef"].split(",")
            self.ef1 = ef0[0]
            self.ef2 = ef0[1]
        else:
            self.ef1 = "node1"
            self.ef2 = "node2"

        self.ew = kwd["ew"] if "ew" in kwd else None
        self.nf = kwd["nf"] if "nf" in kwd else None
        self.nw = kwd["nw"] if "nw" in kwd else None
        self.ncon = 0
        if self.nw:
            self.ncon = len(self.nw.split(","))

        # ---- other paramters
        self.ptype = kwd["ptype"] if "ptype" in kwd else "kway"
        self.ncuts = int(kwd["ncuts"]) if "ncuts" in kwd else 1
        self.balance = float(kwd["balance"]) if "balance" in kwd else None
        self.ufactor = None
        if self.balance:
            if self.balance < 1.0:
                raise (Exception("balance expect range (> 1.0)"))
            self.ufactor = int((self.balance - 1.0) * 1000)
        else:
            if self.ptype == "kway":
                self.ufactor = 30
            else:
                self.ufactor = 1

        self.seed = int(kwd["seed"]) if "seed" in kwd else -1
        self.noexe = kwd["noexe"] if "noexe" in kwd else False
        self.verbose = kwd["verbose"] if "verbose" in kwd else False

        self.workf = nu.Mtemp()
Beispiel #5
0
    def repTaxo(self, taxonomy):

        #@taxonomy=taxonomy #replaceの場合はtaxonomyを登録しない

        self.items.repTaxo(taxonomy)  # アイテムクラスをtaxonomyで置換する

        tFile = taxonomy.file
        itemFN = taxonomy.itemFN
        taxoFN = taxonomy.taxoFN

        tf = nu.Mtemp()
        xx1 = tf.file()
        cpara = "%s,%s:%s" % (self.idFN, taxoFN, self.itemFN)
        kpara = "%s,%s" % (self.idFN, self.itemFN)

        nm.mjoin(i=self.file, k=self.itemFN, K=itemFN, f=taxoFN,
                 m=tFile).mcut(f=cpara).muniq(k=kpara, o=xx1).run()

        self.file = self.temp.file()
        shutil.move(xx1, self.file)
	def __init__(self,db,outtf=True):
		self.size  = None
		self.msgoff = True

		self.temp  = nu.Mtemp()
		self.db    = db # 入力データベース
		self.file  = self.temp.file()
		self.outtf = outtf
		items      = self.db.items

		# 重みファイルの作成
		# pos,negのTransactionオブジェクトに対してLCMが扱う整数アイテムによるトランザクションファイルを生成する。
		# この時、pos,negを併合して一つのファイルとして作成され(@wNumTraFile)、
		# 重みファイル(@weightFile[クラス])の作成は以下の通り。
		# 1.対象クラスをpos、その他のクラスをnegとする。
		# 2. negの重みは-1に設定し、posの重みはcalOmegaで計算した値。
		# 3.@wNumTraFileの各行のクラスに対応した重みデータを出力する(1項目のみのデータ)。
		self.weightFile = {}
		self.posWeight  = {}
		self.sigma      = {}

		for cName,posSize in db.clsNameRecSize.items(): 
			self.weightFile[cName] = self.temp.file()
			self.posWeight[cName]  = self.calOmega(posSize)
			cpara = "%s:%s"%(cName,self.posWeight[cName])
			nm.mcut(nfno=True,f=self.db.clsFN,i=self.db.cFile).mchgstr(nfn=True,f=0,O=-1,o=self.weightFile[cName],c=cpara).run()


		# アイテムをシンボルから番号に変換する。
		f=None
		f <<= nm.mjoin(k=self.db.itemFN,K=items.itemFN,m=items.file,f=items.idFN,i=self.db.file)
		f <<= nm.mcut(f=self.db.idFN+","+self.db.timeFN+","+items.idFN)
		f <<= nm.msortf(f=self.db.idFN+","+self.db.timeFN+"%n")
		f <<= nm.mtra(k=self.db.idFN,f=items.idFN)
		f <<= nm.mcut(f=items.idFN,nfno=True,o=self.file)
		f.run()
Beispiel #7
0
    def run(self):

        from datetime import datetime
        t = datetime.now()

        tempW = nu.Mtemp()

        xxinp = tempW.file()
        xxitra = tempW.file()
        xxdiff = tempW.file()
        xxsame = tempW.file()
        xxmap1 = tempW.file()
        xxmap2 = tempW.file()

        self.edge2mtx(self.ei, xxinp, xxmap1, xxmap2)
        extTake.grhfil(type='D""', i=xxinp, o=xxitra)

        iter = 0
        xxprev = tempW.file()
        xxpair = tempW.file()
        xxtra = tempW.file()

        while True:
            # 終了判定
            if iter >= self.iterMax:
                break
            if iter != 0 and self.same(xxitra, xxprev, xxsame):

                break

            #MCMD::msgLog("polishing iteration ##{iter} (tra size=#{File.size(xxitra)}")
            shutil.copyfile(xxitra, xxprev)

            nodeSize, edgeSize = self.calGsize(xxitra)
            edgeSize1 = edgeSize + 1

            #print "sspc #{measure} -l #{minSupp} #{xxtra} #{th} #{xxpair}"
            runpara = {}
            runpara["type"] = "t" + self.measure
            runpara["T"] = self.kn
            runpara["l"] = self.minSupp
            runpara["U"] = 100000
            runpara["L"] = 1
            runpara["i"] = xxitra
            runpara["th"] = self.th
            runpara["o"] = xxpair
            extTake.sspc(runpara)

            #	puts   "sspc t#{measure} -T #{kn} -l #{minSupp} -U 100000 -L 1 #{xxitra} #{th} #{xxpair}"

            if not os.path.exists(xxpair):
                self.noPat()
            if os.path.getsize(xxpair) == 0:
                self.noPat()

            extTake.grhfil(type='eu0', i=xxpair, o=xxtra)

            if self.logDir:
                self.convSim(xxtra, "simGp{}.csv".format(iter), xxmap1,
                             self.logDir)

            os.system("cat {} {} > {}".format(xxitra, xxtra, xxpair))

            runpara = {}
            runpara["type"] = self.measure2
            runpara["T"] = self.kn2
            runpara["c"] = edgeSize
            runpara["i"] = xxpair
            runpara["th"] = self.th2
            runpara["o"] = xxtra

            extTake.sspc(runpara)

            if not os.path.exists(xxtra):
                self.noPat()
            if os.path.getsize(xxtra) == 0:
                self.noPat()

            extTake.grhfil(type='ed', i=xxtra, o=xxpair)

            os.system("tail -n +{} {} > {}".format(edgeSize1, xxpair, xxtra))

            extTake.grhfil(type='D', i=xxtra, o=xxpair)

            extTake.grhfil(type='DE', d=xxitra, i=xxpair,
                           o=xxdiff)  #<==つかってない?

            shutil.copyfile(xxpair, xxitra)

            if self.logDir:
                extTake.grhfil(type='D', i=xxtra, o=xxpair)
                self.convRsl(xxpair, "iter{}.csv".format(iter), xxmap1, xxmap2,
                             logDir)

            iter += 1

        extTake.grhfil(type='D', i=xxitra, o=xxpair)
        self.convRsl(xxpair, self.eo, xxmap1, xxmap2)

        procTime = datetime.now() - t

        if self.logDir:

            kv = [["key", "value"]]

            for k, v in self.args.items():
                kv.append([k, str(v)])

            kv.append(["iter", str(iter)])
            kv.append(["time", str(procTime)])
            for i in range(len(nSizes)):
                kv.append(["nSize" + str(i), str(nSizes[i])])
                kv.append(["eSize" + str(i), str(eSizes[i])])
                kv.append(["dens" + str(i), str(denses[i])])

            nm.writecsv(i=kv, o="{}/keyVal.csv".format(self.logDir)).run()
Beispiel #8
0
	def run(self):

		from datetime import datetime	
		t = datetime.now()

		temp=nu.Mtemp()
		xxsspcin=temp.file()
		xxmap=temp.file()

		# traファイルの変換とマップファイルの作成
		if self.num :
			total = self.convN(self.iFile,self.idFN,self.itemFN,xxsspcin,xxmap)
		else:
			total = self.conv(self.iFile,self.idFN,self.itemFN,xxsspcin,xxmap)

		# system "head xxsspcin"
		# 3 5 0 2
		# 4 1 2
		# 0 2 3 1
		# 1 0 2
		# 3 4 0 1
		# system "head xxmap"
		# ##item,##freq%0nr,##num
		# b,4,0
		# d,4,1
		# f,4,2
		minSupp = int(total*self.minSupPrb)	if self.minSupPrb else self.minSupCnt
			

		# sspc用simの文字列
		if self.sim :
			if self.sim=="J":
				sspcSim="R"
			elif self.sim=="P":
				sspcSim="P"
			elif self.sim=="C":
				sspcSim="i"
		# sim=省略時はRでth=0とする(sim制約なし)
		else:
			sspcSim="R"
			self.th=0

		############ 列挙本体 ############
		xxsspcout=temp.file()
		tpstr =  sspcSim+"ft_" if self.msgoff else sspcSim+"ft"
		extTake.sspc(type=tpstr,TT=minSupp,i=xxsspcin,th=self.th,o=xxsspcout)

		##################################

		xxtmmp=temp.file()
		
		f =   nm.mread(i=xxsspcout) 
		f <<= nm.cmd("tr ' ()' ','") 
		f <<= nm.mcut(f="1:i1,2:i2,0:frequency,4:sim",nfni=True)

		if self.num :

			f <<= nm.mfldname(f="i1:node1,i2:node2")
			if self.sim!="C":
				f <<= nm.mfsort(f="node1,node2")
			
			f <<= nm.mjoin(k="node1",K="##item",m=xxmap,f="##freq:frequency1")
			f <<= nm.mjoin(k="node2",K="##item",m=xxmap,f="##freq:frequency2") 
			
		else:

			f <<= nm.mjoin(k="i1",K="##num",m=xxmap,f="##item:node1,##freq:frequency1")
			f <<= nm.mjoin(k="i2",K="##num",m=xxmap,f="##item:node2,##freq:frequency2") 

			if self.sim!="C":

				f <<= nm.mcut(f="i1,i2,frequency,sim,node1,node2,frequency1,frequency2,node1:node1x,node2:node2x")
				f <<= nm.mfsort(f="node1x,node2x")
				f <<= nm.mcal(c='if($s{node1}==$s{node1x},$s{frequency1},$s{frequency2})',a="freq1")
				f <<= nm.mcal(c='if($s{node2}==$s{node2x},$s{frequency2},$s{frequency1})',a="freq2")
				f <<= nm.mcut(f="i1,i2,frequency,sim,node1x:node1,node2x:node2,freq1:frequency1,freq2:frequency2")

		f <<= nm.msetstr(v=total,a="total")
		f <<= nm.mcal(c='${frequency}/${frequency1}',a="confidence")
		f <<= nm.mcal(c='${frequency}/${total}',a="support")
		f <<= nm.mcal(c='${frequency}/(${frequency1}+${frequency2}-${frequency})',a="jaccard")
		f <<= nm.mcal(c='(${frequency}*${total})/((${frequency1}*${frequency2}))',a="lift")
		f <<= nm.mcal(c='(ln(${frequency})+ln(${total})-ln(${frequency1})-ln(${frequency2}))/(ln(${total})-ln(${frequency}))',a="PMI")
		f <<= nm.mcut(f="node1,node2,frequency,frequency1,frequency2,total,support,confidence,lift,jaccard,PMI")
		f <<= nm.msortf(f="node1,node2",o=self.oeFile)
		f.run()

		if self.onFile:
			f4 =   nm.mcut(f=self.itemFN+":node",i=self.iFile)
			f4 <<= nm.mcount(k="node",a="frequency")
			if self.node_support :
				minstr = "[%s,]"%(minSupp)
				f4 <<= nm.mselnum(f="frequency",c=minstr)

			f4 <<= nm.msetstr(v=total,a="total")
			f4 <<= nm.mcal(c='${frequency}/${total}',a="support")
			f4 <<= nm.mcut(f="node,support,frequency,total",o=self.onFile)
			f4.run()

		procTime=datetime.now()-t

		# ログファイル出力
		if self.logFile :
			kv=[["key","value"]]
			for k,v in self.args.items():
				kv.append([k,str(v)])
			kv.append(["time",str(procTime)])
			nm.writecsv(i=kv,o=self.logFile).run()
	def enumerate(self,eArgs):
		tf=nu.Mtemp()

		# 最小サポートと最小サポート件数
		if "minCnt" in eArgs :
			self.minCnt = int(eArgs["minCnt"])
			self.minSup = float(self.minCnt)/ float(self.db.size)
		else:
			self.minSup = float(eArgs["minSup"])
			self.minCnt = int(self.minSup * float(self.db.size) + 0.99)


		# 最大サポートと最大サポート件数
		self.maxCnt=None
		if "maxCnt" in eArgs or "maxSup" in eArgs:
			if "maxCnt" in eArgs:
				self.maxCnt = int(eArgs["maxCnt"])
				self.maxSup = float(self.maxCnt)/float(self.db.size)
			else:
				self.maxSup = float(eArgs["maxSup"])
				self.maxCnt = int(self.maxSup * float(self.db.size) + 0.99)

		#未使用
		#@minProb = eArgs["minProb"].to_f # 事後確率
		#@minGR   = @minProb/(1-@minProb) # 増加率
		#@minGR   = eArgs["minGR"].to_f if eArgs["minGR"]

		# あるクラスをpos、他のクラスをnegにして、パターン列挙した結果ファイル名を格納する
		pFiles=[]
		tFiles=[]
		for cName,posSize in self.db.clsNameRecSize.items(): 
			negSize=self.db.size-posSize

			# minGRの計算
			if "minGR" in eArgs:
				self.minGR=eArgs["minGR"]
			else:
				minProb = eArgs["minProb"] if ( "minProb" in eArgs ) else 0.5
				if "uniform" in eArgs and eArgs["uniform"]:
					self.minGR = (minProb/(1-minProb)) * (self.db.clsSize-1) # マニュアルの式(4)
				else:
					self.minGR = (minProb/(1-minProb)) * (float(negSize)/float(posSize)) # マニュアルの式(4)


			# 最小サポートと最小サポート件数
			if "minCnt" in eArgs:
				self.minPos = eArgs["minCnt"]
			else:
				self.minPos = int(eArgs["minSup"] * float(posSize) + 0.99)

			# 最大サポートと最大サポート件数
			if "maxCnt" in eArgs or "maxSup" in eArgs:
				if "maxCnt" in eArgs:
					self.maxCnt = int(eArgs["maxCnt"])
				else:
 					self.maxCnt = int(eArgs["maxSup"] * float(posSize) + 0.99)


			self.sigma[cName] = self.calSigma(self.minPos,self.minGR,posSize,negSize)

			# lcm_seqのパラメータ設定と実行
			lcmout = tf.file() # lcm_seq出力ファイル
			# 頻出パターンがなかった場合、lcm出力ファイルが生成されないので
			# そのときのために空ファイルを生成しておいく。
			with open(lcmout, "w") as efile:
				pass

			params = {}
			if self.msgoff:
				params["type"] ="CIA_"
			else:
				params["type"] ="CIA"

			if self.maxCnt: # windowサイズ上限
				params["U"] = str(self.maxCnt)
			if "minLen" in eArgs:
				params["l"] = str(eArgs["minLen"])
			if 'maxLen' in eArgs:
				params["u"] = str(eArgs["maxLen"])
			if 'gap' in eArgs:
				params["g"] = str(eArgs["gap"])
			if 'win' in eArgs:
				params["G"] = str(eArgs["win"])

			params["w"] = self.weightFile[cName]
			params["i"] = self.file
			params["sup"] = str(self.sigma[cName])
			params["o"] = lcmout

			# lcm_seq実行
			#MCMD::msgLog("#{run}")
			if 'padding' in eArgs and eArgs["padding"]: # padding指定時は、0アイテムを出力しないlcm_seqを実行
				extTake.lcmseq_zero(params)
			else:
				extTake.lcmseq(params)

			# パターンのサポートを計算しCSV出力する
			#MCMD::msgLog("output patterns to CSV file ...")
			pFiles.append(self.temp.file())
			transle = self.temp.file()

			extTake.lcmtrans(lcmout,"e",transle) # pattern,countP,countN,size,pid

			f=None
			f <<= nm.mdelnull(f="pattern",i=transle)
			f <<= nm.mcal(c='round(${countN},1)',a="neg")
			f <<= nm.mcal(c='round(${countP}/%s,1)'%(self.posWeight[cName]),a="pos")
			f <<= nm.mdelnull(f="pattern")
			f <<= nm.msetstr(v=cName,a="class")
			f <<= nm.msetstr(v=posSize,a="posTotal")
			f <<= nm.msetstr(v=self.minGR,a="minGR")
			f <<= nm.mcut(f="class,pid,pattern,size,pos,neg,posTotal,minGR",o=pFiles[-1])
			f.run()

			#s = MCMD::mrecount("i=#{pFiles.last}") # 列挙されたパターンの数
			#MCMD::msgLog("the number of contrast patterns on class `#{cName}' enumerated is #{s}")

			if self.outtf :
				# トランザクション毎に出現するシーケンスを書き出す
				#MCMD::msgLog("output tid-patterns ...")
				tFiles.append(self.temp.file())

				xxw= tf.file()
				f=None
				f <<= nm.mcut(f=self.db.idFN,i=self.db.file)
				f <<= nm.muniq(k=self.db.idFN)
				f <<= nm.mnumber(S=0,a="__tid",q=True)
				f <<= nm.msortf(f="__tid",o=xxw)
				f.run()

				nm.mcut(f=self.db.idFN,i=self.db.file).muniq(k=self.db.idFN).mnumber(S=0,a="__tid",q=True,o=xxw).run()
				translt = self.temp.file()
				extTake.lcmtrans(lcmout,"t",translt)
				nm.mjoin(k="__tid",m=xxw,f=self.db.idFN,i=translt).msetstr(v=cName,a="class").mcut(f=self.db.idFN+",class,pid",o=tFiles[-1]).run()


		# クラス別のパターンとtid-pidファイルを統合して最終出力
		self.pFile = self.temp.file()
		self.tFile = self.temp.file()

		# パターンファイル併合
		xxpCat = tf.file()
		f =   nm.mcat(i=",".join(pFiles))
		f <<= nm.msortf(f="class,pid")
		f <<= nm.mnumber(s="class,pid",S=0,a="ppid",o=xxpCat)
		f.run()

		# パターンファイル計算
		items=self.db.items
		f=""
		f =   nm.mcut(f="class,ppid:pid,pattern,size,pos,neg,posTotal,minGR",i=xxpCat)
		f <<= nm.msetstr(v=self.db.size,a="total")
		f <<= nm.mcal(c='${total}-${posTotal}',a="negTotal") # negのトータル件数
		f <<= nm.mcal(c='${pos}/${posTotal}',a="support") # サポートの計算
		f <<= nm.mcal(c='if(${neg}==0,1.797693135e+308,(${pos}/${posTotal})/(${neg}/${negTotal}))',a="growthRate")
		if "uniform" in eArgs and eArgs["uniform"] == True:
			f <<= nm.mcal(c='(${pos}/${posTotal})/(${pos}/${posTotal}+(%s-1)*${neg}/${negTotal})'%(self.db.clsSize),a="postProb")
		else:
			f <<= nm.mcal(c='${pos}/(${pos}+${neg})',a="postProb")

		f <<= nm.msel(c='${pos}>=%s&&${growthRate}>=${minGR}'%(self.minPos)) # minSupとminGRによる選択
		f <<= nm.mvreplace(vf="pattern",m=items.file,K=items.idFN,f=items.itemFN)
		f <<= nm.mcut(f="class,pid,pattern,size,pos,neg,posTotal,negTotal,total,support,growthRate,postProb")
		f <<= nm.mvsort(vf="pattern")
		f <<= nm.msortf(f="class%nr,postProb%nr,pos%nr",o=self.pFile)
		f.run()

		if self.outtf :
			# 列挙されたパターンを含むtraのみ選択するためのマスタ
			xxp4=nm.mcut(f="class,pid",i=self.pFile)

			f =   nm.mcat(i=",".join(tFiles))
			f <<= nm.mjoin(k="class,pid",m=xxpCat,f="ppid") # 全クラス統一pid(ppid)結合
			f <<= nm.mcommon(k="class,ppid",K="class,pid",m=xxp4) # 列挙されたパターンの選択
			f <<= nm.mcut(f=self.db.idFN+",class,ppid:pid")
			f <<= nm.msortf(f=self.db.idFN+",class,pid",o=self.tFile)
			f.run()


		self.size = nu.mrecount(i=self.pFile)
Beispiel #10
0
    def run(self):

        from datetime import datetime
        t = datetime.now()

        wf = nu.Mtemp()
        xxinp = wf.file()
        xxmap = wf.file()
        input = self.ei

        self.g2pair(self.ni, self.nf, self.ei, self.ef1, self.ef2, xxinp,
                    xxmap)

        xxmace = wf.file()  # maceの出力(tra形式)

        para = {}
        if self.msgoff:
            para["type"] = "Ce_" if self.all else "Me_"
        else:
            para["type"] = "Ce" if self.all else "Me"
        para["i"] = xxinp
        para["o"] = xxmace
        if self.minSize:
            para["l"] = self.minSize
        if self.maxSize:
            para["u"] = self.maxSize
        extTake.mace(para)

        #MCMD::msgLog("converting the numbered nodes into original name ...")
        id = nu.mrecount(i=xxmace, nfni=True)

        # xxpair = wf.file() # 上記traをpair形式に変換したデータ

        fpair = None
        fpair <<= nm.mcut(i=xxmace, nfni=True, f="0:num")
        fpair <<= nm.mnumber(q=True, a="id")
        fpair <<= nm.mvcount(vf="num:size")
        fpair <<= nm.mtra(r=True, f="num")

        # when ni= specified, it add the isolated single cliques.
        if self.ni:

            fpair_u = nm.mread(i=fpair)

            if self.all:
                fpair_u <<= nm.mselstr(f="size", v=1)
            fpair_u <<= nm.mcut(f="num")
            fpair_u <<= nm.muniq(k="num")

            # select all nodes which are not included in any cliques
            xxiso = None
            xxiso <<= nm.mcut(f="num", i=xxmap)
            xxiso <<= nm.mcommon(k="num", m=fpair_u, r=True)
            xxiso <<= nm.mnumber(S=id, a="id", q=True)
            xxiso <<= nm.msetstr(v=1, a="size")
            xxiso <<= nm.mcut(f="id,num,size")
            # mcut入れないとおかしくなるあとで直す
            #ddlist = [fpair.mcut(f="id,num,size"),xxiso]
            xxpair = nm.mcut(i=[fpair, xxiso], f="id,num,size")

        else:

            xxpair = fpair

        xxpair <<= nm.mjoin(m=xxmap, k="num", f="node")
        xxpair <<= nm.mcut(f="id,node,size")
        xxpair <<= nm.msortf(f="id,node", o=self.oFile)
        xxpair.run()

        procTime = datetime.now() - t

        # ログファイル出力
        if self.logFile:
            kv = [["key", "value"]]
            for k, v in self.args.items():
                kv.append([k, str(v)])
            kv.append(["time", str(procTime)])
            nm.writecsv(i=kv, o=self.logFile).run()
Beispiel #11
0
    def __param_check_set(self, kwd):

        # 存在チェック
        for k, v in kwd.items():
            if not k in msketchsort.paramter:
                raise (Exception("KeyError: {} in {} ".format(
                    k, self.__class__.__name__)))

        self.msgoff = True
        self.oFile = kwd["o"] if "o" in kwd else None
        self.iFile = kwd["i"] if "i" in kwd else None

        if "e" in kwd:
            if isinstance(kwd["e"], list):
                self.elem = kwd["e"]
            elif isinstance(kwd["e"], str):
                self.elem = kwd["e"].split(",")
            else:
                raise (Exception("can't use type : kwd e : {} ".format(
                    kwd["e"].__name__)))
        else:
            self.elem = []

        if "tid" in kwd:
            if isinstance(kwd["tid"], list):
                self.tidH = kwd["tid"]
            elif isinstance(kwd["tid"], str):
                self.tidH = kwd["tid"].split(",")
            else:
                raise (Exception("can't use type : kwd tid : {} ".format(
                    kwd["tid"].__name__)))
        else:
            self.tidH = []

        self.dist = kwd["dist"] if "dist" in kwd else "C"
        self.th = float(kwd["th"]) if "th" in kwd else 0.01
        self.mr = float(kwd["mr"]) if "mr" in kwd else 0.00001

        self.wfH = kwd["wf"].split(",") if "wf" in kwd else None

        if "wf" in kwd:
            if isinstance(kwd["wf"], list):
                self.wfH = kwd["wf"]
            elif isinstance(kwd["wf"], str):
                self.wfH = kwd["wf"].split(",")
            else:
                raise (Exception("can't use type : kwd tid : {} ".format(
                    kwd["tid"].__name__)))
        else:
            self.wfH = None

        self.ws = int(kwd["ws"]) if "ws" in kwd else 0
        self.seed = int(kwd["seed"]) if "seed" in kwd else 1
        self.uc = kwd["uc"] if "uc" in kwd else False

        import time
        self.pt = int(time.time())

        if self.dist == "H" and self.th < 1.0:
            raise (Exception("The range of th= is different in {} ".format(
                k, self.__class__.__name__)))

        self.workf = nu.Mtemp()