Пример #1
0
def aggregate_values(pass_on_values, args, form):
    pass_on_values = dict(pass_on_values)
    for key in pass_on_values:
        if hasattr(args, key) and getattr(args, key) is not None:
            if isinstance(pass_on_values[key], (list, tuple)) and not isinstance(getattr(args, key), (list, tuple)):
                pass_on_values[key] = [getattr(args, key)]
            else:
                pass_on_values[key] = getattr(args, key)

    rtn = {}

    for key in pass_on_values:
        if isinstance(pass_on_values[key], bool):
            rtn[key] = get_boolean_value(form, key, default=pass_on_values[key])
        else:
            rtn[key] = form.getfirst(key, pass_on_values[key])
        if isinstance(rtn[key], str) and any(sign_char in rtn[key] for sign_char in PLUS_MINUS_STRINGS):
            for sign_char in PLUS_MINUS_STRINGS:
                rtn[key] = rtn[key].replace(sign_char, PLUS_MINUS_CHAR)
            rtn[key] = rtn[key].split(PLUS_MINUS_CHAR)
            rtn[key] = list(map(int, rtn[key]))
        elif isinstance(rtn[key], (tuple, list)):
            rtn[key] = list(map(int, rtn[key]))
        elif isinstance(rtn[key], bool):
            pass
        elif isinstance(pass_on_values[key], (list, tuple)):
            rtn[key] = [int(rtn[key])]
        elif isinstance(pass_on_values[key], int):
            rtn[key] = int(rtn[key])
        elif isinstance(pass_on_values[key], float):
            rtn[key] = float(rtn[key])
        if isinstance(rtn[key], list) and len(rtn[key]) < 2:
            rtn[key].append(0)

    return rtn
def main():
    form = cgi.FieldStorage(keep_blank_values=True)
    non_existant_variable = form.getvalue('&=variableDoesNotExistString=&')
    if 'help' in sys.argv[1:] and get_boolean_value(form, 'help'): # so that a web call with ?help works, since parser normally calls sys.exit if it doesn't understand the arguments
        return construct_character_set(form, None, help=True)
    args = parser.parse_args()
    rtn = construct_character_set(form, args, verbose=args.verbose)
    if rtn:
        print('Content-type: text/plain\n')
        print(json.dumps(rtn))
Пример #3
0
def main():
    form = cgi.FieldStorage(keep_blank_values=True)
    non_existant_variable = form.getvalue('&=variableDoesNotExistString=&')
    if 'help' in sys.argv[1:] and get_boolean_value(
            form, 'help'
    ):  # so that a web call with ?help works, since parser normally calls sys.exit if it doesn't understand the arguments
        return construct_character_set(form, None, help=True)
    args = parser.parse_args()
    rtn = construct_character_set(form, args, verbose=args.verbose)
    if rtn:
        print('Content-type: text/plain\n')
        print(json.dumps(rtn))
Пример #4
0
def create_first_task(form, args, reset=False, verbose=False):
    if "taskGroupIndex" in form.keys():
        task_group_index = int(form.getfirst("taskGroupIndex"))
    else:
        task_group_index = 0
    passOnValues = {
        "pauseToFirstHint": [500],
        "pauseToSecondHint": [500],
        "pauseToExample": [1000],
        "pauseToNoise": [50],
        "pauseToTest": [1000],
        "tasksPerFeedbackGroup": [10],
        "tasksPerWaitGroup": [10],
        "pauseToGroup": [-1],
        "displayProgressBarDuringTask": False,
        "allowDidNotSeeCount": [1],
        "random": False,
        "characterSet": None,
        "trialsPerExperiment": 200,
        "fractionSame": 0.5,  # this was 0.25 before the RT task, changed to 0.5 for RT
        "calibrationTaskCount": 25,
    }
    rtn = aggregate_values(passOnValues, args, form)

    if get_boolean_value(form, "random", default=passOnValues["random"]):
        tasks = make_get_random_task(form, passOnValues, verbose=verbose)
    else:
        tasks = get_a_task(task_group_index, reset=reset, verbose=verbose)
    alphabets = get_accepted_image_list(from_path=FROM_PATH)
    tasks = [
        (
            anonymize_image(alphabets[task[0][0]][task[0][2]][task[0][1]], from_path=FROM_PATH),
            anonymize_image(alphabets[task[1][0]][task[1][2]][task[1][1]], from_path=FROM_PATH),
            task[0][0] == task[1][0] and task[0][1] == task[1][1],
        )
        for task in tasks
    ]

    tasks = [
        (
            example,
            test,
            urllib.parse.urljoin(BASE_URL, random.choice(_STROKE_NOISES)),
            correct_answer,
        )  # http://www.quasimondo.com/hydra/sineNoise1.jpg')
        for example, test, correct_answer in tasks
    ]
    rtn["tasks"] = tasks
    return rtn
Пример #5
0
def create_first_task(form, args, reset=False, verbose=False):
    if 'taskGroupIndex' in form.keys():
        task_group_index = int(form.getfirst('taskGroupIndex'))
    else:
        task_group_index = 0
    passOnValues = {
        'pauseToFirstHint': [500],
        'pauseToSecondHint': [500],
        'pauseToExample': [1000],
        'pauseToNoise': [50],
        'pauseToTest': [1000],
        'tasksPerFeedbackGroup': [10],
        'tasksPerWaitGroup': [10],
        'pauseToGroup': [-1],
        'displayProgressBarDuringTask': False,
        'allowDidNotSeeCount': [1],
        'random': False,
        'characterSet': None,
        'trialsPerExperiment': 200,
        'fractionSame':
        0.5,  # this was 0.25 before the RT task, changed to 0.5 for RT
        'calibrationTaskCount': 25
    }
    rtn = aggregate_values(passOnValues, args, form)

    if get_boolean_value(form, 'random', default=passOnValues['random']):
        tasks = make_get_random_task(form, passOnValues, verbose=verbose)
    else:
        tasks = get_a_task(task_group_index, reset=reset, verbose=verbose)
    alphabets = get_accepted_image_list(from_path=FROM_PATH)
    tasks = [(anonymize_image(alphabets[task[0][0]][task[0][2]][task[0][1]],
                              from_path=FROM_PATH),
              anonymize_image(alphabets[task[1][0]][task[1][2]][task[1][1]],
                              from_path=FROM_PATH), task[0][0] == task[1][0]
              and task[0][1] == task[1][1]) for task in tasks]

    tasks = [
        (example, test,
         urllib.parse.urljoin(BASE_URL, random.choice(_STROKE_NOISES)),
         correct_answer)  #http://www.quasimondo.com/hydra/sineNoise1.jpg')
        for example, test, correct_answer in tasks
    ]
    rtn['tasks'] = tasks
    return rtn
Пример #6
0
def aggregate_values(pass_on_values, args, form):
    pass_on_values = dict(pass_on_values)
    for key in pass_on_values:
        if hasattr(args, key) and getattr(args, key) is not None:
            if isinstance(
                    pass_on_values[key],
                (list, tuple)) and not isinstance(getattr(args, key),
                                                  (list, tuple)):
                pass_on_values[key] = [getattr(args, key)]
            else:
                pass_on_values[key] = getattr(args, key)

    rtn = {}

    for key in pass_on_values:
        if isinstance(pass_on_values[key], bool):
            rtn[key] = get_boolean_value(form,
                                         key,
                                         default=pass_on_values[key])
        else:
            rtn[key] = form.getfirst(key, pass_on_values[key])
        if isinstance(rtn[key], str) and any(
                sign_char in rtn[key] for sign_char in PLUS_MINUS_STRINGS):
            for sign_char in PLUS_MINUS_STRINGS:
                rtn[key] = rtn[key].replace(sign_char, PLUS_MINUS_CHAR)
            rtn[key] = rtn[key].split(PLUS_MINUS_CHAR)
            rtn[key] = list(map(int, rtn[key]))
        elif isinstance(rtn[key], (tuple, list)):
            rtn[key] = list(map(int, rtn[key]))
        elif isinstance(rtn[key], bool):
            pass
        elif isinstance(pass_on_values[key], (list, tuple)):
            rtn[key] = [int(rtn[key])]
        elif isinstance(pass_on_values[key], int):
            rtn[key] = int(rtn[key])
        elif isinstance(pass_on_values[key], float):
            rtn[key] = float(rtn[key])
        if isinstance(rtn[key], list) and len(rtn[key]) < 2:
            rtn[key].append(0)

    return rtn
def construct_character_set(form, args, reset=False, verbose=False, help=False):
    if get_boolean_value(form, 'help', default=help):
        print('Content-type: text/html\n')
        print("""<p>You may any of the following permissible url parameters:</p>
<ul>
  <li>
    <b>characters</b> - A list of characters that must be used, in the form [<em>alphabet</em>, <em>number</em>], where <em>number</em> is a 
    one-based index.  For example, <tt>?characters=[["latin", 1], ["latin", 2], ["greek", 10]]</tt>.  
    <span style="color:red"><strong>Note that the quotes (") are mandatory.</strong></span>
  </li>
  <li>
    <b>alphabets</b> - A list of alphabets from which to draw the characters.  For example, 
    <tt>?constructCharacterSet&amp;alphabets=["latin", "greek", "hebrew"]</tt>.  Does not work well with <b>nonAlphabets</b>.
    <span style="color:red"><strong>Note that the quotes (") are mandatory.</strong></span>
  </li>
  <li>
    <b>drawers</b> - A list of alphabet/drawer pairs that must be used, in the form [<em>alphabet</em>, <em>id</em>].
    For example, <tt>?drawers=[["latin", "a1j8s7giuyto4a"], ["latin", "a1kj5bqqwzijjt"], ["greek", "a2pfktghhg1ofp"]]</tt>.
    <span style="color:red"><strong>Note that the quotes (") are mandatory.</strong></span>
  </li>
  <li>
    <b>nonAlphabets</b> - A list of alphabets from which characters may not be drawn.  For example, 
    <tt>?constructCharacterSet&amp;nonAlphabets=["latin", "greek", "hebrew"]</tt>.  Does not work well with <b>alphabets</b>.
    <span style="color:red"><strong>Note that the quotes (") are mandatory.</strong></span>
  </li>
  <li><b>totalCharacters</b> - the total number of characters to draw. </li>
  <li><b>alias</b> - the name of the structure.  If you do not choose an alias, you will be given a hash code. </li>
  <li><b>overwrite</b> - whether or not an already existent character set should be overwritten.  Either <tt>true</tt> or <tt>false</tt>.</li>
  <li><b>get</b> - If you want to see the current contents of a character set, use this parameter.  For example, <tt>?get=small</tt>.</li>
</ul>""")
        return False
    try:
        get_alias = form.getfirst('get', args.get)
        if get_alias:
            def do_error():
                raise ValueError('No structure with alias "%s" exists.' % get_alias)
            return get_object(CHARACTER_SET_NAME_FORMAT % get_alias, do_error, is_old=(lambda x: False))
        drawers = get_list_of_values(form, 'drawers', args.drawers)
        characters = get_list_of_values(form, 'characters', args.characters)
        alphabets = get_list_of_values(form, 'alphabets', args.alphabets)
        non_alphabets = get_list_of_values(form, 'nonAlphabets', args.non_alphabets)
        totalCharacters = int(form.getfirst('totalCharacters', args.total_characters))
        alias = form.getfirst('alias', args.alias)
        overwrite = get_boolean_value(form, 'overwrite', default=((not args.no_overwrite) and (args.overwrite or (alias is None)))) 
        if characters:
            rtn = [(alphabet, int(ch_num) - 1) for alphabet, ch_num in characters]
        elif alphabets:
            rtn = alphabets
        elif drawers:
            rtn = [(alphabet, '*', uid) for alphabet, uid in drawers]
        elif non_alphabets:
            rtn = [alphabet for alphabet in get_accepted_image_list() 
                   if alphabet not in nonAlphabets and alphabet.lower() not in nonAlphabets]
        else:
            raise Exception("Insufficient parameters for decision")
        rtn.sort()
        if not alias:
            alias = str(hash(rtn))
    except Exception:
        construct_character_set(form, args, help=True)
        raise
    if rtn != get_object(CHARACTER_SET_NAME_FORMAT % alias, (lambda: rtn), is_old=(lambda x: overwrite)):
        raise Exception('Structure with given alias (%s) already exists.  Pick a new alias.' % alias)
    return {'alias':alias}
Пример #8
0
def construct_character_set(form,
                            args,
                            reset=False,
                            verbose=False,
                            help=False):
    if get_boolean_value(form, 'help', default=help):
        print('Content-type: text/html\n')
        print(
            """<p>You may any of the following permissible url parameters:</p>
<ul>
  <li>
    <b>characters</b> - A list of characters that must be used, in the form [<em>alphabet</em>, <em>number</em>], where <em>number</em> is a 
    one-based index.  For example, <tt>?characters=[["latin", 1], ["latin", 2], ["greek", 10]]</tt>.  
    <span style="color:red"><strong>Note that the quotes (") are mandatory.</strong></span>
  </li>
  <li>
    <b>alphabets</b> - A list of alphabets from which to draw the characters.  For example, 
    <tt>?constructCharacterSet&amp;alphabets=["latin", "greek", "hebrew"]</tt>.  Does not work well with <b>nonAlphabets</b>.
    <span style="color:red"><strong>Note that the quotes (") are mandatory.</strong></span>
  </li>
  <li>
    <b>drawers</b> - A list of alphabet/drawer pairs that must be used, in the form [<em>alphabet</em>, <em>id</em>].
    For example, <tt>?drawers=[["latin", "a1j8s7giuyto4a"], ["latin", "a1kj5bqqwzijjt"], ["greek", "a2pfktghhg1ofp"]]</tt>.
    <span style="color:red"><strong>Note that the quotes (") are mandatory.</strong></span>
  </li>
  <li>
    <b>nonAlphabets</b> - A list of alphabets from which characters may not be drawn.  For example, 
    <tt>?constructCharacterSet&amp;nonAlphabets=["latin", "greek", "hebrew"]</tt>.  Does not work well with <b>alphabets</b>.
    <span style="color:red"><strong>Note that the quotes (") are mandatory.</strong></span>
  </li>
  <li><b>totalCharacters</b> - the total number of characters to draw. </li>
  <li><b>alias</b> - the name of the structure.  If you do not choose an alias, you will be given a hash code. </li>
  <li><b>overwrite</b> - whether or not an already existent character set should be overwritten.  Either <tt>true</tt> or <tt>false</tt>.</li>
  <li><b>get</b> - If you want to see the current contents of a character set, use this parameter.  For example, <tt>?get=small</tt>.</li>
</ul>""")
        return False
    try:
        get_alias = form.getfirst('get', args.get)
        if get_alias:

            def do_error():
                raise ValueError('No structure with alias "%s" exists.' %
                                 get_alias)

            return get_object(CHARACTER_SET_NAME_FORMAT % get_alias,
                              do_error,
                              is_old=(lambda x: False))
        drawers = get_list_of_values(form, 'drawers', args.drawers)
        characters = get_list_of_values(form, 'characters', args.characters)
        alphabets = get_list_of_values(form, 'alphabets', args.alphabets)
        non_alphabets = get_list_of_values(form, 'nonAlphabets',
                                           args.non_alphabets)
        totalCharacters = int(
            form.getfirst('totalCharacters', args.total_characters))
        alias = form.getfirst('alias', args.alias)
        overwrite = get_boolean_value(form,
                                      'overwrite',
                                      default=((not args.no_overwrite)
                                               and (args.overwrite or
                                                    (alias is None))))
        if characters:
            rtn = [(alphabet, int(ch_num) - 1)
                   for alphabet, ch_num in characters]
        elif alphabets:
            rtn = alphabets
        elif drawers:
            rtn = [(alphabet, '*', uid) for alphabet, uid in drawers]
        elif non_alphabets:
            rtn = [
                alphabet for alphabet in get_accepted_image_list()
                if alphabet not in nonAlphabets
                and alphabet.lower() not in nonAlphabets
            ]
        else:
            raise Exception("Insufficient parameters for decision")
        rtn.sort()
        if not alias:
            alias = str(hash(rtn))
    except Exception:
        construct_character_set(form, args, help=True)
        raise
    if rtn != get_object(CHARACTER_SET_NAME_FORMAT % alias, (lambda: rtn),
                         is_old=(lambda x: overwrite)):
        raise Exception(
            'Structure with given alias (%s) already exists.  Pick a new alias.'
            % alias)
    return {'alias': alias}
Пример #9
0
def create_first_task(form, args, verbose=False):
    passOnValues = {'pauseToFirstHint':[500],
                    'pauseToSecondHint':[500],
                    'pauseToAnchor':[1000],
                    'pauseToNoise':[-1],
                    'pauseToTest':[1000],
                    'tasksPerFeedbackGroup':[10],
                    'pauseToNextGroup':[-1],
                    'displayProgressBarDuringTask':False,
                    'allowDidNotSeeCount':[1],
                    'taskCount':50,
                    'anchorCount':1,
                    'classCount':20,
                    'unique':False,
                    'uniqueClasses':True,
                    'confirmToContinue':True,
                    'anchorPosition':'above',
                    'sameAlphabetClassCount':-1,
                    'characterSize':'50px',
                    'characterSet':''
                    }
    for key in passOnValues:
        if hasattr(args, key) and getattr(args, key) is not None:
            if isinstance(passOnValues[key], (list, tuple)) and not isinstance(getattr(args, key), (list, tuple)):
                passOnValues[key] = [getattr(args, key)]
            else:
                passOnValues[key] = getattr(args, key)

    rtn = {}

    for key in passOnValues:
        if isinstance(passOnValues[key], bool): rtn[key] = get_boolean_value(form, key, default=passOnValues[key])
        else: rtn[key] = form.getfirst(key, passOnValues[key])
        if isinstance(rtn[key], str) and any(sign_char in rtn[key] for sign_char in PLUS_MINUS_STRINGS):
            for sign_char in PLUS_MINUS_STRINGS:
                rtn[key] = rtn[key].replace(sign_char, PLUS_MINUS_CHAR)
            rtn[key] = rtn[key].split(PLUS_MINUS_CHAR)
            rtn[key] = list(map(int, rtn[key]))
        elif isinstance(rtn[key], (tuple, list)):
            rtn[key] = list(map(int, rtn[key]))
        elif isinstance(rtn[key], bool):
            pass
        elif isinstance(passOnValues[key], (list, tuple)):
            rtn[key] = [int(rtn[key])]
        elif isinstance(passOnValues[key], int):
            rtn[key] = int(rtn[key])
        elif isinstance(passOnValues[key], float):
            rtn[key] = float(rtn[key])
        if isinstance(rtn[key], list) and len(rtn[key]) < 2:
            rtn[key].append(0)
    
    rtn['imagesPerTask'] = 2 * rtn['anchorCount'] + rtn['classCount']

    if rtn['characterSet']:
        rtn['tasks'] = make_task_from_alphabet_set(rtn['characterSet'], verbose=verbose, anchor_count=rtn['anchorCount'], class_count=rtn['classCount'],
                                                   same_alphabet_class_count=rtn['sameAlphabetClassCount'], task_count=rtn['taskCount'], 
                                                   unique=rtn['unique'], unique_classes=rtn['uniqueClasses'])
    else:
        rtn['tasks'] = make_task(verbose=verbose, anchor_count=rtn['anchorCount'], class_count=rtn['classCount'], 
                                 same_alphabet_class_count=rtn['sameAlphabetClassCount'], task_count=rtn['taskCount'], unique=rtn['unique'],
                                 unique_classes=rtn['uniqueClasses'])
    return rtn