def calculate_property_assignment_from_all_steps(child_assignments: list):
    """
    Takes the assignment results from all child results and uses them to assign a result for the parent itself. This
    algorithm is used to assign results to a single step from child functional elements and for genome properties that
    have no required steps such as "category" type genome properties. This is a more generic version of the algorithm
    used in assign_property_result_from_required_steps()

    If all child assignments are No, parent should be NO.
    If all child assignments are Yes, parent should be YES.
    Any thing else in between, parents should be PARTIAL.

    :param child_assignments: A list of assignment results for child steps or genome properties.
    :return: The parents assignment result.
    """
    yes_count = child_assignments.count('YES')
    no_count = child_assignments.count('NO')

    if yes_count == len(child_assignments):
        genome_property_result = 'YES'
    elif no_count == len(child_assignments):
        genome_property_result = 'NO'
    else:
        genome_property_result = 'PARTIAL'

    return genome_property_result