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
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)
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
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()
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()
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()
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)
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()
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()