示例#1
0
def get_results(tid, assignmentid, workerid, hid):
    try:
        db = get_db()
        programname = db.get_tasklet_program(tid)
        key = HaCRSUtil.get_compositekey(tid, assignmentid, workerid, hid)

        tasklet = db.get_full_tasklet(tid)
        next_payout, next_transition, curr_payout, curr_transition = -1, -1, -1, -1

        if tasklet == None:
            return "No task found"
        if tasklet['type'] == 'SEED':
            pass
            #render_me['payout_arr'] = tasklet['payout_arr']

        config_path = os.path.dirname(__file__) + "/webconfig.ini"
        config = HaCRSUtil.get_config(config_path)
        # config = HaCRSUtil.get_config('webconfig.ini')
        xfile = HaCRSUtil.find_result_file(config, programname, key)
        results = json.loads(open(xfile).readlines()[-1])
        next_payout, next_transition = HaCRSUtil.get_next_payout_border(tasklet['payout_arr'], results['new_transitions'])
        curr_payout = HaCRSUtil.get_current_payout(tasklet['payout_arr'], results['new_transitions'])
        results['next_payout'] = next_payout
        results['next_transition'] = next_transition
        results['curr_payout'] = curr_payout
        results['min_payout'] = tasklet['amount']
        return json.dumps(results)
    except Exception as e:
        return "{}"
示例#2
0
 def __init__(self):
     self.config = HaCRSUtil.get_config('../config.ini')
     HOST = self.config.get('mturk','host')
     AWS_ACCESS_KEY_ID = self.config.get('mturk', 'access_key_id')
     AWS_SECRET_ACCESS_KEY = self.config.get('mturk', 'secret_access_key')
     self.MTconnection = MTurkConnection(aws_access_key_id=AWS_ACCESS_KEY_ID,
          aws_secret_access_key=AWS_SECRET_ACCESS_KEY,
          host=HOST)
     self.db = HaCRSDB()
     self.con, self.cur = HaCRSUtil.get_db(self.config)
     self.mt = HaCRSTurker()
示例#3
0
    def push_tasks_mturk(self):
        frame_height = self.config.get('mturk', 'frameheight')
        amount = 0.01
        tasklets = self.db.get_unassigned_tasklets()
        sdescription = self.config.get('mturk', 'shortdescr')

        for tasklet in tasklets:
            #print 'pushing!'

            url = "https://cgcturk.hacked.jp/tasklet/{}/".format(tasklet['id'])
            keywords = ["easy"]
            questionform = ExternalQuestion(url, frame_height)

            hit_result = self.MTconnection.create_hit(
                title=HaCRSUtil.get_tasklet_name(tasklet),
                description=sdescription,
                keywords=keywords,
                max_assignments=1,
                question=questionform,
                reward=Price(amount=amount),
                response_groups=('Minimal', 'HITDetail'),  # ?
            )
            assert len(hit_result) == 1
            mturkid = self.db.create_mturk_resource(hit_result[0].HITId,
                                                    hit_result[0].HITGroupId)
            self.db.add_mturk_tasklet_association(tasklet['id'], mturkid)
        self.db.commit()
示例#4
0
def create_seed_tasklet( ):
    input_args = ['programname', 'total_transitions', 'previous_transitions']
    try:
        args = {}
        for x in input_args:
            assert x in request.get_json().keys()
            args[x] = request.get_json()[x]
    except Exception as e:
        raise InvalidUsage('Required argument missing')

    try:
        db = get_db()
        config = get_config()
        pid = db.lookup_program(args['programname'])
        assert pid != None
        rating, base_pay, payout_array = HaCRSUtil.hit_info(int(args['total_transitions']) - int(args['previous_transitions']), int(args['total_transitions']))
        tid = db.create_seed_tasklet(pid, base_pay, payout_array, rating)

    #except Exception as e:
    except IOError as e:
        return repr(e)
        raise InvalidUsage('Error creating tasklet: {}'.format(e))

    try:
        pass
        #mt = get_mt()
        # push tasklet to mturk!
        #mturkid, hit_result = mt.push_tasklet_mturk(tid)
    except Exception as e:
        raise InvalidUsage()
    return json.dumps({'tasklet_id': str(tid), 'base_pay': base_pay, 'rating': rating, 'payout_array': payout_array})
示例#5
0
 def get_config(self, conffile='config.ini'):
     try:
         config_path = os.path.dirname(__file__) + "/../config.ini"
         self.config = HaCRSUtil.get_config(config_path)
         #self.config = configparser.configparser()
         #self.config.readfp(open(conffile))
         self.config.readfp(open(config_path))
     except Exception as e:
         sys.stderr.write("Couldn't read config ({}): {}\n".format(
             conffile, e))
         sys.exit(1)
示例#6
0
    def create_tasklet(self, typ, program, base_pay_cents, keywords):

        # to be safe
        assert base_pay_cents < 2000
        assert HaCRSUtil.is_tasklet_type(typ)

        base_pay = round(float(base_pay_cents) / 100, 2)
        
        self.cur.execute('insert into tasklets (type, program, amount, keywords ) values (%s, %s, %s, %s) returning id', [typ, program, base_pay, keywords])
        taskletid = self.cur.fetchone()[0]
        self.con.commit()
        return taskletid
示例#7
0
def get_merged_interactions(programname, xid):
    config_path = os.path.dirname(__file__) + "/webconfig.ini"
    config = HaCRSUtil.get_config(config_path)
    # config = HaCRSUtil.get_config('webconfig.ini')
    print('=========================== xid = ', xid)
    if xid.startswith('AUTO'):
        seed_dir = 'afl_seeds'
    else:
        seed_dir = 'minified_seeds'
    xdir = "{}/{}/{}".format(config.get('general', 'resultsdir'), programname.replace(' ', '_'), seed_dir)

    influence = json.loads(get_printable_string(resource_stream('mtweb', '{}/{}.influence.json'.format(xdir,xid)).read()))
    output = make_printable_string(resource_stream('mtweb', '{}/{}.output'.format(xdir, xid)).read())
    interactions = json.loads(get_printable_string(resource_stream('mtweb', '{}/{}.interaction.json'.format(xdir,xid)).read()))
    print('pulled {}/{}.interaction.json'.format(xdir, xid))

    #character_similarities = read_similarities_csv(open('{}/{}.character_similarities.csv'.format(xdir,xid)).read())
    compartments = json.loads(get_printable_string(resource_stream('mtweb', '{}/{}.compartment_information.json'.format(xdir, xid)).read()))
    print('pulled {}/{}.compartment_information.json'.format(xdir, xid))

    in_out_merge = {}
    try:
        for interaction in interactions:
            if interaction['type'] == 'write':
                for offset in interaction['offsets']:
                    in_out_merge[str(len(in_out_merge))]={'value': output[offset], 'type': 'input'}
            elif interaction['type'] == 'read':
                for offset in interaction['offsets']:
                    in_out_merge[str(len(in_out_merge))]={'value': influence[str(offset)]['value'] ,
                                                          'reachable_strings': influence[str(offset)]['reachable_strings'] ,
                                                          'other_options': influence[str(offset)]['other_options'] ,
                                                          #'similarities': character_similarities[offset],
                                                          'compartment': find_compartment(compartments, offset),
                                                          'type': 'output'}
            else:
                sys.stderr.write('?\n')
    except Exception as e:
        import traceback
        #print offset, len(output)
        traceback.print_exc()
        raise

    #print 'dumping in_out_merge json'
    return json.dumps(in_out_merge)
示例#8
0
def showtid(tid, aid = None, hid=None, wid = None, showinput=None):


    if aid == None:
        aid = request.args.get("assignmentId", "")
    if hid == None:
        hid = request.args.get("hitId", "")
    if wid == None:
        wid = request.args.get("workerId", "")
    if showinput == None:
        showinput = request.args.get("showinput", "")

    instructions = {}
    instructions['SEED'] = 'instructions/seeding.html'

    templates = {}
    templates['SEED'] = 'templates/seedtasklet.html'

    try:
        assert len(tid) == 36
        db = get_db()
        config_path = os.path.dirname(__file__) + "/webconfig.ini"
        config = HaCRSUtil.get_config(config_path)
        # config = HaCRSUtil.get_config('webconfig.ini')
        render_me = {}
        tasklet = db.get_full_tasklet(tid)

        if tasklet == None:
            return "No task found (or not implemented)"

        seeds = get_interactions(config, tasklet['program'])


        if not ( aid  == "" or aid == "ASSIGNMENT_ID_NOT_AVAILABLE"):
            execution_id = uuid.uuid4()

            turkerinfo = HaCRSUtil.get_compositekey(tid, aid, wid, hid)

            password = random_vnc_password()
            vr = VNCRunner(tasklet, turkerinfo, password)
            vr_thread = Thread(target = vr_thread_runner, args = (vr, ))
            vr_thread.start()

            render_me['vrport'] = vr.useport
            render_me['password'] = password

            db.log_session_start(tid, hid, wid, aid, execution_id,
                            str(request.user_agent), request.remote_addr)

        render_me['amazon_host'] =  config.get('mt', 'host')
        render_me['assignment_id'] = aid
        render_me['tasklet_id'] = tid
        render_me['hit_id'] = hid
        render_me['difficulty'] = tasklet['keywords']
        render_me['seeds'] = seeds
        render_me['tasktype'] = tasklet['type']
        render_me['programname'] = tasklet['program'].replace('_', ' ')
        render_me['programinstructions'] = get_printable_string(get_program_description(config, tasklet['program']))
        render_me['worker_id'] = wid
        render_me['taskname'] = HaCRSUtil.get_tasklet_name(tasklet)
        # render_me['instructions'] = open(instructions[tasklet['type']]).read()
        render_me['instructions'] = resource_stream('mtweb', instructions[tasklet['type']]).read()
        render_me['showinput'] = urllib.parse.quote(showinput)

        return do_render(templates[tasklet['type']], render_me)
    except Exception as e:
        return "Couldn't fetch task: {}".format(e)
示例#9
0
 def __init__(self):
     config_path = os.path.dirname(__file__) + "/../config.ini"
     self.config = HaCRSUtil.get_config(config_path)
     HOST = self.config.get('mturk','host')
     self.con, self.cur = HaCRSUtil.get_db(self.config)
     psycopg2.extras.register_uuid()
示例#10
0
def get_config():
    if not hasattr(g, 'config'):
        config_path = os.path.dirname(__file__) + "/../config.ini"
        g.config = HaCRSUtil.get_config(config_path)
        # g.config = HaCRSUtil.get_config('../config.ini')
    return g.config
示例#11
0
    def get_solve_ratio(self):
        global EXPERIMENT_START
        prog_maxcoverage = {}
        taskid_earnings = {}
        total_payout_with_bonus = 0

        goalreached = 0
        goalnotreached = 0
        for program in json.load(open(self.config.get('general', 'programsjson'))):
            prog_maxcoverage[program] = 0
        program = None

        seed_taskletid_solved = {}
        empty = { 'easy': 0, 'medium': 0, 'hard': 0, 'very_hard': 0, 'priority': 0 }

        for tasklet in self.db.get_seed_tasklets() + self.db.get_seek_tasklets():
            if not str(tasklet['timestamp']).startswith(EXPERIMENT_START):
                continue

            for jfile in glob.glob('{}/{}/{}*/*.json'.format(self.config.get('general', 'resultsfolder'), tasklet['program'], str(tasklet['id']))):
                try:
                    metadata = self.split_composite_key(jfile.split(os.path.sep)[jfile.split(os.path.sep).index('result.json')-1])
                # fake keys
                except Exception as e:
                    #print e
                    continue
                # that's us
                if metadata['workerid'] == 'A2PRAI0ABXN99X':
                    continue
                results = json.loads(open(jfile).readlines()[-1])
                tasklet = self.db.get_full_tasklet(metadata['tid'])

                if tasklet == None:
                    #print "No tasklet for program {}".format(tasklet['program'])
                    continue

                if tasklet['type'] == 'SEED':
                    payout = HaCRSUtil.get_current_payout(tasklet['payout_arr'], results['new_transitions'])
                    prog_maxcoverage[tasklet['program']] = max(prog_maxcoverage[tasklet['program']], results['coverage'])

                elif tasklet['type'] == 'SEEK':
                    payout = tasklet['amount']
                elif tasklet['type'] == 'DRILL':
                    payout = tasklet['amount']

                total_payout_with_bonus += payout

                # over-achieved
                if tasklet['amount'] <= payout:
                    goalreached += 1
                elif tasklet['amount'] > payout:
                    goalnotreached += 1

                if tasklet['amount'] <= payout and tasklet['type'] == 'SEED':
                    hitinfos = self.db.get_hit_for_tasklet(tasklet['id'])
                    for hit in hitinfos:
                        assignment = self.mt.get_assignment_from_hit(hit)
                        if assignment and assignment.WorkerId in ['A10O5YR01H865K', 'A1HRHFU7KTS0KW', 'A1PUHCEBSOWETV']:
                            pass
                        seed_taskletid_solved[tasklet['id']] = True

                if metadata['tid'] not in taskid_earnings.keys():
                    taskid_earnings[metadata['tid']] = {}
                if metadata['workerid'] not in taskid_earnings[metadata['tid']].keys():
                    taskid_earnings[metadata['tid']][metadata['workerid']] = {}

                taskid_earnings[metadata['tid']][metadata['workerid']] = {'payout': payout, 'amount': tasklet['amount']}
        #print "Goal reached: {}, Goal not reached: {}". format(goalreached, goalnotreached)
        #print "taskid_earnings"
        pprint(taskid_earnings)

        return taskid_earnings, prog_maxcoverage, seed_taskletid_solved
示例#12
0
    def get_seed_stats(self, seed_taskletid_solved):
        global EXPERIMENT_START

        unique_seed_workers = set()
        worker_payouts_base = {}
        worker_payouts_bonus = {}
        worker_payouts_combined = {}
        worker_solves = {}
        tasklet_solved = set()

        total_payout_base = 0
        total_payout_bonus = 0

        tasklet_difficulty = {}

        program_solves = {}

        for program in json.load(open(self.config.get('general', 'programsjson'))):
            prog_maxcoverage[program] = 0
            if program not in program_solves:
                program_solves[program] = 0
        program = None

        total_payout = 0

        for tasklet in self.db.get_seed_tasklets():

            if not str(tasklet['timestamp']).startswith(EXPERIMENT_START):
                continue

            if tasklet['program'] in ['seed_training', 'A_Game_of_Chance']:
                continue

            if tasklet['id'] in seed_taskletid_solved.keys():
                program_solves[tasklet['program']] += 1

            for jfile in glob.glob('{}/{}/{}*/*.json'.format(self.config.get('general', 'resultsfolder'), tasklet['program'], str(tasklet['id']))):
                try:
                    metadata = self.split_composite_key(jfile.split(os.path.sep)[jfile.split(os.path.sep).index('result.json')-1])

                # fake keys
                except Exception as e:
                    continue
                # that's us
                if metadata['workerid'] == 'A2PRAI0ABXN99X':
                    continue

                results = json.loads(open(jfile).readlines()[-1])
                tasklet = self.db.get_full_tasklet(metadata['tid'])

                payout = HaCRSUtil.get_current_payout(tasklet['payout_arr'], results['new_transitions'])
                prog_maxcoverage[tasklet['program']] = max(prog_maxcoverage[tasklet['program']], results['coverage'])
                if payout > 0:
                    if metadata['workerid'] not in worker_solves.keys():
                        worker_solves[metadata['workerid']] = 0
                    worker_solves[metadata['workerid']] += 1
                    unique_seed_workers.add(metadata['workerid'])
                    if tasklet['keywords'] not in tasklet_difficulty:
                        tasklet_difficulty[tasklet['keywords']] = 0
                    tasklet_difficulty[tasklet['keywords']] += 1
                    tasklet_solved.add(tasklet['id'])
                    if metadata['workerid'] not in worker_payouts_base.keys():
                        worker_payouts_base[metadata['workerid']] = []
                        worker_payouts_bonus[metadata['workerid']] = []
                        worker_payouts_combined[metadata['workerid']] = []
                    worker_payouts_base[metadata['workerid']].append(tasklet['amount'])
                    total_payout_base += tasklet['amount']
                    if payout > tasklet['amount']:
                        total_payout_bonus += round(payout - tasklet['amount'], 2)
                        worker_payouts_bonus[metadata['workerid']].append(round(payout - tasklet['amount'], 2))
                        total_payout_bonus += round(payout - tasklet['amount'], 2)
                    worker_payouts_combined[metadata['workerid']].append(round(payout, 2))
                total_payout += payout

                pass

        #print 'Total seed BASE payment: $ {}'.format(total_payout_base)
        #print 'Total seed BONUS payment: $ {}'.format(total_payout_bonus)
        #print 'Workers solving at least one SEED Task: {}'.format(len(unique_seed_workers))
        #print 'Number of solved SEED tasks: {}'.format(len(tasklet_solved))
        #print 'Number of tasklets by difficulty: {}'.format(tasklet_difficulty)
        #print 'Busiest worker: {} solves'.format(max(worker_solves.values()))
        #print 'Average worker throughput: {} solves'.format(round(sum(worker_solves.values())  / float(len(worker_solves.values())), 2))
        pdb.set_trace()