def repeat(id): experiment = Experiment.query.get_or_404(id) # Search to modify the name properly (ending in *.RepNo) match = re.match(r'(.+\.)(\d+)', experiment.name) # If already a similar ending cause of older repeats or # randomly if match: repExpName = match.group(1) + str(int(match.group(2)) + 1) # For sure the first repeat else: repExpName = experiment.name + ".1" try: repNodes = [i for i in experiment.nodes if i.available] if not repNodes: flash("No node is ready to repeat the experiment") return redirect(url_for(".show", id=id)) repExp = Experiment(repExpName, experiment.overlay, repNodes) db.session.add(repExp) db.session.commit() flash("Experiment '%s' added successfully" % repExpName) return redirect(url_for(".show", id=repExp.id)) except Exception as e: db.session.rollback() flash("Failed to add experiment '%s' %s" % (repExpName, str(e))) return redirect(url_for(".show", id=id))
def add(): if request.method == "GET": overlays = enumerate(sorted(os.listdir(app.config["OVERLAY_DIR"]))) nodes = get_nodes(None) freeNodes = [ node for node in nodes if (node.reachable == True and node.available == True) ] return render_template("experiment/add.html", freeNodes=freeNodes, overlays=overlays) elif request.method == "POST": try: try: name = request.form["name"] if not name: raise Exception("Invalid name") except KeyError: raise Exception("Name not specified") try: overlay = request.form["overlay"] except KeyError: raise Exception("Overlay not selected") overlayFile = None if overlay == "NEW": try: overlayFile = request.files["overlay_file"] overlay = secure_filename(overlayFile.filename) overlayFile.save( os.path.join(app.config["OVERLAY_DIR"], overlay)) except KeyError: raise Exception("Invalid overlay uploaded") try: nodes = Node.query.filter( Node.id.in_(request.form.getlist("nodeIds"))).all() if not nodes: raise KeyError except KeyError: raise Exception("Can't setup an experiment with no nodes") experiment = Experiment(name, overlay, nodes) db.session.add(experiment) db.session.commit() flash("Experiment '%s' added successfully" % name) return redirect(url_for(".show", id=experiment.id)) except Exception as e: db.session.rollback() flash("Failed to add experiment: %s" % str(e)) return redirect(url_for(".add"))
def create_experiment(self, name="anexperiment", nodes=[], overlay=""): if not nodes: nodes = [self.create_node()] experiment = Experiment( name=name, overlay=overlay, nodes=nodes ) db.session.add(experiment) db.session.commit() return experiment
def probe(self): # Receive message from SQS queue response = self.sqs.receive_message( QueueUrl=self.sqs_url, AttributeNames=['All'], MaxNumberOfMessages=1, MessageAttributeNames=['StimuliType'], VisibilityTimeout=0, WaitTimeSeconds=10) if not response or response.get('Messages', None) is None: return None message = response['Messages'][0] receipt_handle = message['ReceiptHandle'] message_id = message['MessageId'] body = message['Body'] msg_attrs = message['MessageAttributes'] stimuli = msg_attrs['StimuliType']['StringValue'] if stimuli == WORD_LIST: info = json.loads(body) self.sqs.delete_message(QueueUrl=self.sqs_url, ReceiptHandle=receipt_handle) Experiment()(info) return message_id
def store_new_experiment(self, name): exp = Experiment() exp.name = name self.session.add(exp) self.session.commit() self.experiment_list.refresh_experiments()
def onStart(self, input_list): probabilistic_interleavings_list = input_list[0]["probabilistic"] team_draft_interleavings_list = input_list[0]["team_draft"] probabilistic_click_model = input_list[1]["probabilistic"] random_click_model = input_list[1]["random"] experiment_1 = Experiment((probabilistic_interleavings_list), probabilistic_click_model, 1) experiment_2 = Experiment((probabilistic_interleavings_list), random_click_model, 2) experiment_3 = Experiment((team_draft_interleavings_list), probabilistic_click_model, 3) experiment_4 = Experiment((team_draft_interleavings_list), random_click_model, 4) save_and_load = Saver("data/") experiments = [experiment_1, experiment_2, experiment_3, experiment_4] ignores = [] q = mp.Queue() processes = [ mp.Process(target=self.experimenting, args=(exp, q)) for exp in experiments ] results = [None] * 4 try: print("Running experiments: 1/4") result = save_and_load.load_python_obj("experiment1") results[0] = result ignores.append(0) except: print("started multiprocessing " + str(1)) # result_1 = experiment_1.run() # save_and_load.save_python_obj(result_1, "experiment_1") processes[0].start() try: print("Running experiments: 2/4") result = save_and_load.load_python_obj("experiment2") results[1] = result ignores.append(1) except: print("started multiprocessing " + str(2)) # result_2 = experiment_2.run() # save_and_load.save_python_obj(result_2, "experiment_2") processes[1].start() try: print("Running experiments: 3/4") result = save_and_load.load_python_obj("experiment3") results[2] = result ignores.append(2) except: print("started multiprocessing " + str(3)) # result_3 = experiment_3.run() # save_and_load.save_python_obj(result_3, "experiment_3") processes[2].start() try: print("Running experiments: 4/4") result = save_and_load.load_python_obj("experiment4") results[3] = result ignores.append(3) except: print("started multiprocessing " + str(4)) # result_4 = experiment_4.run() # save_and_load.save_python_obj(result_4, "experiment_4") processes[3].start() for experiment_index in range(4): if (experiment_index in ignores): continue print("Attempting get\n") result = q.get() index = result["name"] results[index - 1] = result del result["name"] print("Got {}\n".format(index)) for i, p in enumerate(processes): if (i in ignores): continue print("Attempting join\n") p.join() print("joined {}\n".format(i)) for i, res in zip([1, 2, 3, 4], results): save_and_load.save_python_obj(res, "experiment{}".format(i)) result_1, result_2, result_3, result_4 = results[0], results[ 1], results[2], results[3] print("\rRunning experiments: Done!") result = { "pbm": { "probabilistic_interleaving": result_1, "team_draft": result_3 }, "random": { "probabilistic_interleaving": result_2, "team_draft": result_4 } } return result