<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def extract_simple_optional_location_info( ir_blocks, complex_optional_roots, location_to_optional_roots):
 """Construct a map from simple optional locations to their inner location and traversed edge. Args: ir_blocks: list of IR blocks to extract optional data from complex_optional_roots: list of @optional locations (location immmediately preceding an @optional traverse) that expand vertex fields location_to_optional_roots: dict mapping from location -> optional_roots where location is within some number of @optionals and optional_roots is a list of optional root locations preceding the successive @optional scopes within which the location resides Returns: dict mapping from simple_optional_root_location -> dict containing keys - 'inner_location_name': Location object correspoding to the unique MarkLocation present within a simple optional (one that does not expand vertex fields) scope - 'edge_field': string representing the optional edge being traversed where simple_optional_root_to_inner_location is the location preceding the @optional scope """

    # Simple optional roots are a subset of location_to_optional_roots.values() (all optional roots)
    # We filter out the ones that are also present in complex_optional_roots.
    location_to_preceding_optional_root_iteritems = six.iteritems({
        location: optional_root_locations_stack[-1]
        for location, optional_root_locations_stack in six.iteritems(location_to_optional_roots)
    })
    simple_optional_root_to_inner_location = {
        optional_root_location: inner_location
        for inner_location, optional_root_location in location_to_preceding_optional_root_iteritems
        if optional_root_location not in complex_optional_roots
    }
    simple_optional_root_locations = set(simple_optional_root_to_inner_location.keys())

    # Blocks within folded scopes should not be taken into account in this function.
    _, non_folded_ir_blocks = extract_folds_from_ir_blocks(ir_blocks)

    simple_optional_root_info = {}
    preceding_location = None
    for current_block in non_folded_ir_blocks:
        if isinstance(current_block, MarkLocation):
            preceding_location = current_block.location
        elif isinstance(current_block, Traverse) and current_block.optional:
            if preceding_location in simple_optional_root_locations:
                # The current optional Traverse is "simple"
                # i.e. it does not contain any Traverses within.
                inner_location = simple_optional_root_to_inner_location[preceding_location]
                inner_location_name, _ = inner_location.get_location_name()
                simple_optional_info_dict = {
                    'inner_location_name': inner_location_name,
                    'edge_field': current_block.get_field_name(),
                }
                simple_optional_root_info[preceding_location] = simple_optional_info_dict

    return simple_optional_root_info