def test_separation(): tube = Tube() chemComp = {"a/D": 3, "b/T": 2, "c/B": 1, "d/D": 5} tube.chemComp = chemComp r = Operator.separation(tube, 0.5) print r
def test(self, cyc, HN, tst, tsExpt, ftest): tsPerCyc = self.pm.get("tsPerCyc") cls = self.pm.get("cls") dvol = self.pm.get("dvol") tag = self.pm.get("tag") rTime = self.pm.get("rTime") sepY = self.pm.get("sepY") dThres = self.pm.get("dThres") isRecordReact = self.pm.get("isRecordReact") isDNATube = self.pm.get("isDNATube") clsNum = len(cls) # Prepare test Tubes # print("\t\t\t\tPreparing test tubes...") tsTubes = list() for i in range(clsNum) : c = self.testData[i][1][0][0] lblPrf = "ts_cyc" + str(cyc) if isDNATube : tsTubes.extend(self.makeDNATubesFromData(lblPrf, "B", self.testData[i][0], c, tsPerCyc/2, tst, tsExpt)) else : tsTubes.extend(self.makeTubesFromData(lblPrf, "B", self.testData[i][0], c, tsPerCyc/2, tst, tsExpt)) random.shuffle(tsTubes) # Run Test # print("\t\t\t\tRunning test reaction...") testSummary = np.zeros((clsNum,clsNum)) for i in range(tsPerCyc) : print("\t\t\t\t%dth test" % (i+1)) subHN = [None]*clsNum DList = [None]*clsNum for j in range(clsNum) : ts = tsTubes[i] subHN[j] = HN[j].copyTube(dvol) subHN[j].setLabel("HN" + str(cls[j]) + "_Cycle" + str(cyc+1) + "_test" + str(i+1)) # print "\t\t\t\tPour test tube..." subHN[j].addTube(ts) # print "\t\t\t\tReacting..." Operator.reactionSSA(subHN[j], rTime, tag, isRecordReact) # print "\t\t\t\tElectrophoresis..." DList[j] = Operator.separation(subHN[j], sepY) csf = Classifier() if isDNATube : score, predict = csf.thresholdClassifyOnDNATube(DList, cls, dThres) else : score, predict = csf.thresholdClassifyOnTube(DList, cls, dThres) testSummary[cls.index(predict)][cls.index(ts.cls)] += 1 tsTubes[i] = None # Save Result dm.saveTestSummaryLine(ftest, cyc, testSummary)
def run(self, trTubes, cyc, tst, tsExpt): cls = self.pm.get("cls") dim = self.pm.get("dim") conc = self.pm.get("conc") vol = self.pm.get("vol") dvol = self.pm.get("dvol") dThres = self.pm.get("dThres") tag = self.pm.get("tag") sepY = self.pm.get("sepY") rThres = self.pm.get("rThres") rTime = self.pm.get("rTime") isDNATube = self.pm.get("isDNATube") isRecordReact = self.pm.get("isRecordReact") clsNum = len(cls) dm = DataModule() ftrain = dm.makeTrainSummaryFile(tag) ftest = dm.makeTestSummaryFile(tag) HN = [None] * clsNum print("\t\tMaking Initial Random Hypernetworks...") for i in range(clsNum) : if isDNATube : HN[i] = Operator.makeRandomLibraryOnDNATube(dim, conc, vol, rThres, "T") else : HN[i] = Operator.makeRandomLibraryOnTube(dim, conc, vol, rThres) HN[i].setLabel("Hypernetworks" + str(cls[i])) print("\t\tStart Learning Cycle...") for i in range(cyc) : start = timer() summaryCycle = list() summaryCycle.append(i+1) for j in range(clsNum) : if isDNATube : summaryCycle.append(HN[j].getSpcNum("T")) summaryCycle.append(HN[j].getConcSum("T")) else : summaryCycle.append(HN[j].getSpcNum()) summaryCycle.append(HN[j].getConcSum()) print("\t\t%dth Cycle" % (i+1)) subHN = [None] * clsNum DList = [None] * clsNum for j in range(clsNum) : print("\t\t\tFor Class %d Hypernetwork" % cls[j]) tr = trTubes[i] subHN[j] = HN[j].divideTube(dvol) subHN[j].setLabel("HN" + str(cls[j]) + "_learningcycle" + str(i+1)) print "\t\t\tPour training tube..." subHN[j].addTube(tr) print "\t\t\tReacting..." rTimeEnd = Operator.reactionSSA(subHN[j], rTime, tag, isRecordReact) summaryCycle.append(rTimeEnd) print "\t\t\tElectrophoresis..." DList[j] = Operator.separation(subHN[j], sepY) csf = Classifier() if isDNATube : score, predict = csf.thresholdClassifyOnDNATube(DList, cls, dThres) else : score, predict = csf.thresholdClassifyOnTube(DList, cls, dThres) for j in range(clsNum) : summaryCycle.append(score[j]) summaryCycle.append(predict) summaryCycle.append(tr.cls) print("\t\t\tFeedback...") update = [None] * clsNum for j in range(clsNum) : if isDNATube : DList[j] = Operator.PCR_DNA(DList[j]) update[j] = Operator.denaturationOnDNATube(DList[j], "T", dvol) else : DList[j] = Operator.PCR(DList[j]) update[j] = Operator.denaturationOnTube(DList[j], "T", dvol) if predict == tr.cls : for j in range(clsNum) : if cls[j] == predict : Operator.amplification(update[j], 8) #TODO: Tune multiply number HN[j].addTube(update[j]) else : Operator.amplification(update[j], 1) HN[j].addTube(update[j]) else : for j in range(clsNum) : if cls[j] == predict : Operator.amplification(update[j], 0) HN[j].addTube(update[j]) else : Operator.amplification(update[j], 1) HN[j].addTube(update[j]) # Test with test data # don't update Hypernetwork print("\t\t\tTesting...") self.test(i, HN, tst, tsExpt, ftest) trTubes[i] = None # Discard used tube end = timer() dt = end-start print("\t\t\ttime elapsed %f s" % dt) summaryCycle.append(dt) dm.saveTrainSummaryLine(ftrain, summaryCycle) ftrain.close() ftest.close()