Example #1
0
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))
Example #2
0
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"))
Example #3
0
 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
Example #4
0
    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
Example #5
0
 def store_new_experiment(self, name):
     exp = Experiment()
     exp.name = name
     self.session.add(exp)
     self.session.commit()
     self.experiment_list.refresh_experiments()
Example #6
0
    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