Ejemplo n.º 1
0
def run_prob_anlg_tran_3x2_and_3x2(prob, anlg, tran):
    b1_to_b2_x = None
    b1_to_b2_y = None
    diff_to_b3_x = None
    diff_to_b3_y = None
    diff_to_b2_x = None
    diff_to_b2_y = None
    diff = None

    b1 = prob.matrix[anlg.get("value")[0]]
    b2 = prob.matrix[anlg.get("value")[1]]
    b3 = prob.matrix[anlg.get("value")[2]]

    if "inv_unite" == tran.get("name"):
        b1_new, _, _, _, _ = transform.apply_binary_transformation(
            b2, b3, transform.get_tran("unite"), imgC=b1)
        score, _, _ = jaccard.jaccard_coef(b1_new, b1)
    elif "preserving_subtract_diff" == tran.get("name"):
        b2_aj = asymmetric_jaccard.asymmetric_jaccard_coef(b1, b2)
        b3_aj = asymmetric_jaccard.asymmetric_jaccard_coef(b1, b3)
        preserving_score = min(b2_aj[0], b3_aj[0])
        score, diff_to_b3_x, diff_to_b3_y, diff_to_b2_x, diff_to_b2_y, diff = \
            asymmetric_jaccard.asymmetric_jaccard_coef(b3, b2)
        if preserving_score < 0.85:
            score = 0
    else:
        b1_b2_t, b1_to_b2_x, b1_to_b2_y, _, _ = transform.apply_binary_transformation(
            b1, b2, tran, imgC=b3)
        score, _, _ = jaccard.jaccard_coef(b1_b2_t, b3)

    if "inv_unite" == tran.get("name"):
        b2_score, _, _, _, _, _ = asymmetric_jaccard.asymmetric_jaccard_coef(
            b2, b3)
        b3_score, _, _, _, _, _ = asymmetric_jaccard.asymmetric_jaccard_coef(
            b3, b2)
        if max(b2_score, b3_score) > 0.9:
            score = 0

    if "unite" == tran.get("name") or "shadow_mask_unite" == tran.get("name"):
        b1_score, _, _, _, _, _ = asymmetric_jaccard.asymmetric_jaccard_coef(
            b1, b2)
        b2_score, _, _, _, _, _ = asymmetric_jaccard.asymmetric_jaccard_coef(
            b2, b1)
        if max(b1_score,
               b2_score) > 0.9:  # if b1 is almost a subset of b2 or vice versa
            score = 0

    prob_anlg_tran_d = assemble_prob_anlg_tran_d(prob,
                                                 anlg,
                                                 tran,
                                                 score,
                                                 b1_to_b2_x=b1_to_b2_x,
                                                 b1_to_b2_y=b1_to_b2_y,
                                                 diff_to_b3_x=diff_to_b3_x,
                                                 diff_to_b3_y=diff_to_b3_y,
                                                 diff_to_b2_x=diff_to_b2_x,
                                                 diff_to_b2_y=diff_to_b2_y,
                                                 diff=diff)

    return prob_anlg_tran_d
Ejemplo n.º 2
0
def predict_xor_diff(prob, anlg, tran, d):
    best_diff_to_u1_x = d.get("diff_to_u1_x")
    best_diff_to_u1_y = d.get("diff_to_u1_y")
    best_diff = d.get("diff")
    u3 = prob.matrix[anlg.get("value")[2]]
    u1_ref = prob.matrix_ref[anlg.get("value")[0]]

    prediction = transform.xor_diff(u3, best_diff_to_u1_x, best_diff_to_u1_y,
                                    best_diff, u1_ref)

    pred_data = []
    for ii, opt in enumerate(prob.options):
        print(prob.name, anlg.get("name"), tran.get("name"), ii)

        pred_score, _, _ = jaccard.jaccard_coef(prediction, opt)
        u3_score, u3_to_opt_x, u3_to_opt_y = jaccard.jaccard_coef(u3, opt)
        u3_score = 1 - u3_score
        u1_aligned, u2_aligned, aligned_to_u2_x, aligned_to_u2_y = utils.align(
            u3, opt, u3_to_opt_x, u3_to_opt_y)
        diff = utils.erase_noise_point(np.logical_xor(u1_aligned, u2_aligned),
                                       4)
        diff_score, _, _ = jaccard.jaccard_coef(diff, best_diff)
        score = (diff_score + u3_score + pred_score) / 3
        pred_data.append({
            **d, "optn": ii + 1,
            "optn_score": score,
            "mato_score": (d.get("mat_score") + score) / 2,
            "pred": prediction
        })

    return pred_data
Ejemplo n.º 3
0
def predict_subtract_diff(prob, anlg, tran, d):
    best_diff_to_u1_x = d.get("diff_to_u1_x")
    best_diff_to_u1_y = d.get("diff_to_u1_y")
    best_diff_to_u2_x = d.get("diff_to_u2_x")
    best_diff_to_u2_y = d.get("diff_to_u2_y")
    best_diff = d.get("diff")
    u3 = prob.matrix[anlg.get("value")[2]]
    u1_ref = prob.matrix_ref[anlg.get("value")[0]]

    prediction, best_diff_to_prediction_x, best_diff_to_prediction_y = transform.subtract_diff(
        u3,
        best_diff_to_u1_x,
        best_diff_to_u1_y,
        best_diff,
        u1_ref,
        coords=True)

    pred_data = []
    for ii, opt in enumerate(prob.options):

        print(prob.name, anlg.get("name"), tran.get("name"), ii)

        u3_score, diff_to_opt_x, diff_to_opt_y, diff_to_u3_x, diff_to_u3_y, diff = \
            asymmetric_jaccard.asymmetric_jaccard_coef(opt, u3)
        opt_to_u3_x = (-diff_to_opt_x) - (-diff_to_u3_x)
        opt_to_u3_y = (-diff_to_opt_y) - (-diff_to_u3_y)
        u2_to_u1_x = (-best_diff_to_u2_x) - (-best_diff_to_u1_x)
        u2_to_u1_y = (-best_diff_to_u2_y) - (-best_diff_to_u1_y)
        if abs(opt_to_u3_x - u2_to_u1_x) > 2 or abs(opt_to_u3_y -
                                                    u2_to_u1_y) > 2:
            u3_score, diff = asymmetric_jaccard.asymmetric_jaccard_coef_pos_fixed(
                opt, u3, u2_to_u1_x, u2_to_u1_y)
        diff_score, _, _ = jaccard.jaccard_coef(diff, best_diff)
        opt_score, _, _ = jaccard.jaccard_coef(prediction, opt)

        # prediction_to_opt_x = -to_pred_x + to_opt_x
        # prediction_to_opt_y = -to_pred_y + to_opt_y
        #
        # best_diff_to_opt_x = best_diff_to_prediction_x + prediction_to_opt_x
        # best_diff_to_opt_y = best_diff_to_prediction_y + prediction_to_opt_y
        # best_diff_aligned, opt_aligned, _, _ = utils.align(best_diff, opt, best_diff_to_opt_x, best_diff_to_opt_y)
        # u3_restored = utils.trim_binary_image(np.logical_or(best_diff_aligned, opt_aligned))
        # u3_restored_score , _, _, _, _, _ = asymmetric_jaccard.asymmetric_jaccard_coef(u3, u3_restored)

        score = (diff_score + u3_score + opt_score) / 3
        pred_data.append({
            **d, "optn": ii + 1,
            "optn_score": score,
            "mato_score": (d.get("mat_score") + score) / 2,
            "pred": prediction
        })

    return pred_data
Ejemplo n.º 4
0
def predict_preserving_subtract_diff(prob, anlg, tran, d):
    best_diff_to_b2_x = d.get("diff_to_b2_x")
    best_diff_to_b2_y = d.get("diff_to_b2_y")
    best_diff_to_b3_x = d.get("diff_to_b3_x")
    best_diff_to_b3_y = d.get("diff_to_b3_y")
    best_diff = d.get("diff")
    b4 = prob.matrix[anlg.get("value")[3]]
    b5 = prob.matrix[anlg.get("value")[4]]
    b2_ref = prob.matrix_ref[anlg.get("value")[0]]

    prediction, best_diff_to_prediction_x, best_diff_to_prediction_y = transform.subtract_diff(
        b5,
        best_diff_to_b2_x,
        best_diff_to_b2_y,
        best_diff,
        b2_ref,
        coords=True)

    pred_data = []
    for ii, opt in enumerate(prob.options):

        print(prob.name, anlg.get("name"), tran.get("name"), ii)

        b5_score, diff_to_opt_x, diff_to_opt_y, diff_to_b5_x, diff_to_b5_y, diff = \
            asymmetric_jaccard.asymmetric_jaccard_coef(opt, b5)
        opt_to_b5_x = (-diff_to_opt_x) - (-diff_to_b5_x)
        opt_to_b5_y = (-diff_to_opt_y) - (-diff_to_b5_y)
        b3_to_b2_x = (-best_diff_to_b3_x) - (-best_diff_to_b2_x)
        b3_to_b2_y = (-best_diff_to_b3_y) - (-best_diff_to_b2_y)
        if abs(opt_to_b5_x - b3_to_b2_x) > 2 or abs(opt_to_b5_y -
                                                    b3_to_b2_y) > 2:
            b5_score, diff = asymmetric_jaccard.asymmetric_jaccard_coef_pos_fixed(
                opt, b5, b3_to_b2_x, b3_to_b2_y)
        diff_score, _, _ = jaccard.jaccard_coef(diff, best_diff)
        opt_score, _, _ = jaccard.jaccard_coef(prediction, opt)

        b4_b5_aj = asymmetric_jaccard.asymmetric_jaccard_coef(b4, b5)
        b4_opt_aj = asymmetric_jaccard.asymmetric_jaccard_coef(b4, opt)

        preserving_score = min(b4_b5_aj[0], b4_opt_aj[0])

        score = (diff_score + b5_score + diff_score + preserving_score) / 4
        pred_data.append({
            **d, "optn": ii + 1,
            "optn_score": score,
            "mato_score": (d.get("mat_score") + score) / 2,
            "pred": prediction
        })

    return pred_data
Ejemplo n.º 5
0
def predict_inv_unite(prob, anlg, tran, d):
    b4 = prob.matrix[anlg.get("value")[3]]
    b5 = prob.matrix[anlg.get("value")[4]]

    pred_data = []
    for ii, opt in enumerate(prob.options):

        print(prob.name, anlg.get("name"), tran.get("name"), ii)

        # prediction = transform.inv_unite(b4, b5, opt)
        # score, _, _ = jaccard.jaccard_coef(opt, prediction)
        b4_new, _, _, _, _ = transform.apply_binary_transformation(
            b5, opt, transform.get_tran("unite"), imgC=b4)
        score, _, _ = jaccard.jaccard_coef(b4_new, b4)
        b5_score, _, _, _, _, _ = asymmetric_jaccard.asymmetric_jaccard_coef(
            b5, opt)
        opt_score, _, _, _, _, _ = asymmetric_jaccard.asymmetric_jaccard_coef(
            opt, b5)
        if max(b5_score, opt_score) > 0.85:
            score = 0
        pred_data.append({
            **d, "optn": ii + 1,
            "optn_score": score,
            "mato_score": (d.get("mat_score") + score) / 2,
            "pred": opt
        })

    return pred_data
Ejemplo n.º 6
0
def jaccard_map(A_coms, B_coms):
    """
    find a injective (not necessarily surjective, bijective or well-defined) mapping
    between A_coms and B_coms such that the sum of jaccard indices of each mapped pair
    of components is maximized
    :param A_coms:
    :param B_coms:
    :return: indices of mapped pair, and minimal jaccard index
    """
    all_jc = np.array(
        [[jaccard.jaccard_coef(A_com, B_com)[0] for B_com in B_coms]
         for A_com in A_coms])

    thresholds = np.unique(all_jc)

    max_mapping = None
    max_mapping_t = None
    max_mapping_size = -np.inf
    for t in thresholds:
        mapping = all_jc >= t

        if utils.is_injective(mapping):
            mapping_size = mapping.sum()
            if mapping_size >= max_mapping_size:
                max_mapping_size = mapping_size
                max_mapping = mapping
                max_mapping_t = t

    if max_mapping is not None:
        mapping_ids = np.where(max_mapping)
        return mapping_ids[0].tolist(), mapping_ids[1].tolist(), max_mapping_t
    else:
        return [], [], 0
Ejemplo n.º 7
0
def evaluate_rearrange(u1, u2):

    u1_coms, u1_coms_x, u1_coms_y = utils.decompose(u1, 8)
    u2_coms, u2_coms_x, u2_coms_y = utils.decompose(u2, 8)

    if len(u1_coms) != len(u2_coms):
        return 0, [], [], [], []

    max_scores = []
    max_ids = []
    chosen = [False] * len(u2_coms)
    for u1_com in u1_coms:

        max_score = -1
        max_id = -1
        for id, u2_com in enumerate(u2_coms):
            if not chosen[id]:
                score, _, _ = jaccard.jaccard_coef(u1_com, u2_com)
                if score > max_score:
                    max_score = score
                    max_id = id

        max_scores.append(max_score)
        max_ids.append(max_id)
        chosen[max_id] = True

    min_max_score = min(max_scores)
    if min_max_score < 0.6:
        return 0, [], [], [], []
    else:
        u2_coms_x = [u2_coms_x[id] for id in max_ids]
        u2_coms_y = [u2_coms_y[id] for id in max_ids]
        return min_max_score, u1_coms_x, u1_coms_y, u2_coms_x, u2_coms_y
Ejemplo n.º 8
0
def inv_unite(A, B, C):
    _, B_to_A_x, B_to_A_y = jaccard.jaccard_coef(B, A)
    _, C_to_A_x, C_to_A_y = jaccard.jaccard_coef(C, A)
    B_to_C_x = B_to_A_x - C_to_A_x
    B_to_C_y = B_to_A_y - C_to_A_y
    B_aligned, C_aligned, aligned_to_C_x, aligned_to_C_y = utils.align(
        B, C, B_to_C_x, B_to_C_y)
    B_new = np.logical_and(B_aligned, np.logical_not(C_aligned))
    aligned_to_A_x = aligned_to_C_x + C_to_A_x
    aligned_to_A_y = aligned_to_C_y + C_to_A_y
    A_aligned, B_aligned, _, _ = utils.align(A, B_new, -aligned_to_A_x,
                                             -aligned_to_A_y)
    C_new = np.logical_and(A_aligned, np.logical_not(B_aligned))
    C_new = utils.trim_binary_image(utils.erase_noise_point(C_new, 8))

    return C_new
Ejemplo n.º 9
0
def predict_add_diff(prob, anlg, tran, d):

    best_diff_to_u1_x = d.get("diff_to_u1_x")
    best_diff_to_u1_y = d.get("diff_to_u1_y")
    best_diff_to_u2_x = d.get("diff_to_u2_x")
    best_diff_to_u2_y = d.get("diff_to_u2_y")
    best_diff = d.get("diff")

    u3 = prob.matrix[anlg.get("value")[2]]
    u1_ref = prob.matrix_ref[anlg.get("value")[0]]
    prediction = transform.add_diff(u3, best_diff_to_u1_x, best_diff_to_u1_y,
                                    best_diff, u1_ref)

    pred_data = []
    for ii, opt in enumerate(prob.options):

        print(prob.name, anlg.get("name"), tran.get("name"), ii)

        u3_score, diff_to_u3_x, diff_to_u3_y, diff_to_opt_x, diff_to_opt_y, diff = \
            asymmetric_jaccard.asymmetric_jaccard_coef(u3, opt)
        u3_to_opt_x = (-diff_to_u3_x) - (-diff_to_opt_x)
        u3_to_opt_y = (-diff_to_u3_y) - (-diff_to_opt_y)
        u1_to_u2_x = (-best_diff_to_u1_x) - (-best_diff_to_u2_x)
        u1_to_u2_y = (-best_diff_to_u1_y) - (-best_diff_to_u2_y)
        if abs(u3_to_opt_x - u1_to_u2_x) > 2 or abs(u3_to_opt_y -
                                                    u1_to_u2_y) > 2:
            u3_score, diff = asymmetric_jaccard.asymmetric_jaccard_coef_pos_fixed(
                u3, opt, u1_to_u2_x, u1_to_u2_y)
        diff_score, _, _ = jaccard.jaccard_coef(diff, best_diff)
        opt_score, _, _ = jaccard.jaccard_coef(opt, prediction)
        score = (diff_score + opt_score + u3_score) / 3

        pred_data.append({
            **d, "optn": ii + 1,
            "optn_score": score,
            "mato_score": (d.get("mat_score") + score) / 2,
            "pred": prediction
        })

    return pred_data
Ejemplo n.º 10
0
def add_diff(img, diff_to_ref_x, diff_to_ref_y, diff, ref):
    """

    :param img:
    :param diff_to_ref_x:
    :param diff_to_ref_y:
    :param diff:
    :param ref:
    :return:
    """

    if 0 == diff.sum():
        return img

    iimg = img.copy()
    iimg_to_img_x = 0
    iimg_to_img_y = 0
    while True:

        _, ref_to_iimg_x, ref_to_iimg_y = jaccard.jaccard_coef(ref, iimg)
        diff_to_iimg_x = diff_to_ref_x + ref_to_iimg_x
        diff_to_iimg_y = diff_to_ref_y + ref_to_iimg_y

        score, _ = asymmetric_jaccard.asymmetric_jaccard_coef_pos_fixed(
            diff, iimg, diff_to_iimg_x, diff_to_iimg_y)

        if score > 0.9:

            ref_aligned, iimg_aligned, aligned_to_iimg_x, aligned_to_iimg_y = utils.align(
                ref, iimg, ref_to_iimg_x, ref_to_iimg_y)

            iimg_aligned = utils.erase_noise_point(
                np.logical_and(iimg_aligned, np.logical_not(ref_aligned)), 4)

            iimg = iimg_aligned
            iimg_to_img_x = aligned_to_iimg_x + iimg_to_img_x
            iimg_to_img_y = aligned_to_iimg_y + iimg_to_img_y

            if iimg.sum() == 0:
                return img
        else:
            break

    diff_to_img_x = diff_to_iimg_x + iimg_to_img_x
    diff_to_img_y = diff_to_iimg_y + iimg_to_img_x

    diff_aligned, img_aligned, _, _ = utils.align(diff, img, diff_to_img_x,
                                                  diff_to_img_y)

    return utils.trim_binary_image(np.logical_or(img_aligned, diff_aligned))
Ejemplo n.º 11
0
def predict_unary_default(prob, anlg, tran, d):
    u3 = prob.matrix[anlg.get("value")[2]]
    prediction = transform.apply_unary_transformation(u3, tran)
    pred_data = []
    for ii, opt in enumerate(prob.options):
        print(prob.name, anlg.get("name"), tran.get("name"), ii)
        score, _, _ = jaccard.jaccard_coef(opt, prediction)
        pred_data.append({
            **d, "optn": ii + 1,
            "optn_score": score,
            "mato_score": (d.get("mat_score") + score) / 2,
            "pred": prediction
        })

    return pred_data
Ejemplo n.º 12
0
def shadow_mask_unite(A, B):
    shadow_A = utils.fill_holes(A)
    shadow_B = utils.fill_holes(B)

    score, shadow_A_to_B_x, shadow_A_to_B_y = jaccard.jaccard_coef(A, B)

    shadow_A_aligned, shadow_B_aligned, _, _ = utils.align(
        shadow_A, shadow_B, shadow_A_to_B_x, shadow_A_to_B_y)
    mask = np.logical_and(shadow_A_aligned, shadow_B_aligned)

    A_aligned, B_aligned, _, _ = utils.align(A, B, shadow_A_to_B_x,
                                             shadow_A_to_B_y)
    union = np.logical_or(A_aligned, B_aligned)

    masked_union = np.logical_and(mask, union)

    return utils.trim_binary_image(masked_union)
Ejemplo n.º 13
0
def predict_binary_default(prob, anlg, tran, d):
    b4 = prob.matrix[anlg.get("value")[3]]
    b5 = prob.matrix[anlg.get("value")[4]]

    prediction, _, _, _, _ = transform.apply_binary_transformation(
        b4, b5, tran)

    pred_data = []
    for ii, opt in enumerate(prob.options):
        score, _, _ = jaccard.jaccard_coef(opt, prediction)
        pred_data.append({
            **d, "optn": ii + 1,
            "optn_score": score,
            "mato_score": (d.get("mat_score") + score) / 2,
            "pred": prediction
        })

    return pred_data
Ejemplo n.º 14
0
def predict_duplicate(prob, anlg, tran, d):
    best_copies_to_u1_x = d.get("copies_to_u1_x")
    best_copies_to_u1_y = d.get("copies_to_u1_y")
    u3 = prob.matrix[anlg.get("value")[2]]
    prediction = transform.duplicate(u3, best_copies_to_u1_x,
                                     best_copies_to_u1_y)

    pred_data = []
    for ii, opt in enumerate(prob.options):
        print(prob.name, anlg.get("name"), tran.get("name"), ii)
        score, _, _ = jaccard.jaccard_coef(opt, prediction)
        pred_data.append({
            **d, "optn": ii + 1,
            "optn_score": score,
            "mato_score": (d.get("mat_score") + score) / 2,
            "pred": prediction
        })

    return pred_data
Ejemplo n.º 15
0
def standardize(coms):

    coms_ref = []
    for com in coms:
        coms_ref.append(utils.fill_holes(com))

    min_sim = np.inf
    for A in coms_ref:
        for B in coms_ref:
            if 0 == A.sum() or 0 == B.sum():
                continue
            sim, _, _ = jaccard.jaccard_coef(A, B)
            if sim < min_sim:
                min_sim = sim

    if min_sim > 0.85:
        coms = utils.resize_to_average_shape(coms)
        coms_ref = [np.full_like(coms[0], fill_value=True)] * len(coms)
        return coms, coms_ref
    else:
        return coms, coms
Ejemplo n.º 16
0
def xor_diff(img, diff_to_ref_x, diff_to_ref_y, diff, ref):
    """

    :param img:
    :param diff_to_ref_x:
    :param diff_to_ref_y:
    :param diff:
    :param ref:
    :return:
    """

    if 0 == diff.sum():
        return img

    _, img_to_ref_x, img_to_ref_y = jaccard.jaccard_coef(img, ref)
    diff_to_img_x = diff_to_ref_x - img_to_ref_x
    diff_to_img_y = diff_to_ref_y - img_to_ref_y

    diff_aligned, img_aligned, _, _ = utils.align(diff, img, diff_to_img_x,
                                                  diff_to_img_y)
    return utils.erase_noise_point(
        utils.trim_binary_image(np.logical_xor(img_aligned, diff_aligned)), 4)
Ejemplo n.º 17
0
def predict_rearrange(prob, anlg, tran, d):
    u1_coms_x = d.get("u1_coms_x")
    u1_coms_y = d.get("u1_coms_y")
    u2_coms_x = d.get("u2_coms_x")
    u2_coms_y = d.get("u2_coms_y")

    u3 = prob.matrix[anlg.get("value")[2]]
    prediction = transform.rearrange(u3, u1_coms_x, u1_coms_y, u2_coms_x,
                                     u2_coms_y)

    pred_data = []
    for ii, opt in enumerate(prob.options):
        print(prob.name, anlg.get("name"), tran.get("name"), ii)
        score, _, _ = jaccard.jaccard_coef(opt, prediction)
        pred_data.append({
            **d, "optn": ii + 1,
            "optn_score": score,
            "mato_score": (d.get("mat_score") + score) / 2,
            "pred": prediction
        })

    return pred_data
Ejemplo n.º 18
0
def apply_binary_transformation(imgA,
                                imgB,
                                tran,
                                imgA_to_imgB_x=None,
                                imgA_to_imgB_y=None,
                                imgC=None):
    if imgA_to_imgB_x is None or imgA_to_imgB_y is None:
        align_foo_name = tran.get("align")
        if align_foo_name is None:
            _, imgA_to_imgB_x, imgA_to_imgB_y = jaccard.jaccard_coef(
                imgA, imgB)
        else:
            align_foo = getattr(THIS, align_foo_name)
            imgA_to_imgB_x, imgA_to_imgB_y = align_foo(imgA, imgB, imgC)

    imgA_aligned, imgB_aligned, aligned_to_B_x, aligned_to_B_y = utils.align(
        imgA, imgB, imgA_to_imgB_x, imgA_to_imgB_y)

    img_aligned = None

    binary_trans = tran.get("value")

    for tran in binary_trans:

        name = tran.get("name")

        if name is None:
            continue
        foo = getattr(THIS, name)

        args = tran.get("args")
        if args is None:
            img_aligned = foo(imgA_aligned, imgB_aligned)
        else:
            img_aligned = foo(imgA_aligned, imgB_aligned, **args)

    return img_aligned, int(imgA_to_imgB_x), int(
        imgA_to_imgB_y), aligned_to_B_x, aligned_to_B_y
Ejemplo n.º 19
0
def subtract_diff(img, diff_to_ref_x, diff_to_ref_y, diff, ref, coords=False):
    """

    :param img:
    :param diff_to_ref_x:
    :param diff_to_ref_y:
    :param diff:
    :param ref:
    :return:
    """

    if 0 == diff.sum():
        if coords:
            return img, 0, 0
        else:
            return img

    _, img_to_ref_x, img_to_ref_y = jaccard.jaccard_coef(img, ref)
    diff_to_img_x = diff_to_ref_x - img_to_ref_x
    diff_to_img_y = diff_to_ref_y - img_to_ref_y

    diff_aligned, img_aligned, aligned_to_img_x, aligned_to_img_y = utils.align(
        diff, img, diff_to_img_x, diff_to_img_y)

    result, result_to_aligned_x, result_to_aligned_y = utils.trim_binary_image(
        utils.erase_noise_point(
            np.logical_and(img_aligned, np.logical_not(diff_aligned)), 8),
        coord=True)

    if coords:
        diff_to_result_x = (diff_to_img_x -
                            aligned_to_img_x) - result_to_aligned_x
        diff_to_result_y = (diff_to_img_y -
                            aligned_to_img_y) - result_to_aligned_y
        return result, diff_to_result_x, diff_to_result_y
    else:
        return result
Ejemplo n.º 20
0
def run_prob_anlg_tran(prob, anlg, tran):
    """
    compute the result for a combination of a problem, an analogy and a transformation.
    :param prob:
    :param anlg:
    :param tran:
    :return:
    """

    diff_to_u1_x = None
    diff_to_u1_y = None
    diff_to_u2_x = None
    diff_to_u2_y = None
    diff = None
    b1_to_b2_x = None
    b1_to_b2_y = None

    if 3 == len(anlg.get("value")):  # unary anlg and tran

        u1 = prob.matrix[anlg.get("value")[0]]
        u2 = prob.matrix[anlg.get("value")[1]]

        print(prob.name, anlg.get("name"), tran.get("name"))

        if "add_diff" == tran.get("name"):
            score, diff_to_u1_x, diff_to_u1_y, diff_to_u2_x, diff_to_u2_y, diff = \
                asymmetric_jaccard.asymmetric_jaccard_coef(u1, u2)
        elif "subtract_diff" == tran.get("name"):
            score, diff_to_u2_x, diff_to_u2_y, diff_to_u1_x, diff_to_u1_y, diff = \
                asymmetric_jaccard.asymmetric_jaccard_coef(u2, u1)
        else:
            u1_t = transform.apply_unary_transformation(u1, tran)
            score, _, _ = jaccard.jaccard_coef(u1_t, u2)

    elif 5 == len(anlg.get("value")):  # binary anlg and tran

        b1 = prob.matrix[anlg.get("value")[0]]
        b2 = prob.matrix[anlg.get("value")[1]]
        b3 = prob.matrix[anlg.get("value")[2]]

        b1_b2_t, b1_to_b2_x, b1_to_b2_y, _, _ = transform.apply_binary_transformation(
            b1, b2, tran)
        score, _, _ = jaccard.jaccard_coef(b1_b2_t, b3)

    else:
        raise Exception("Ryan!")

    return {
        "prob_name": prob.name,
        "anlg_name": anlg.get("name"),
        "tran_name": tran.get("name"),
        "pat_score": score,  # pat = prob + anlg + tran
        "prob_ansr": prob.answer,
        "prob_type": prob.type,
        "anlg_type": anlg.get("type"),
        "tran_type": tran.get("type"),
        "diff_to_u1_x": diff_to_u1_x,
        "diff_to_u1_y": diff_to_u1_y,
        "diff_to_u2_x": diff_to_u2_x,
        "diff_to_u2_y": diff_to_u2_y,
        "diff": diff,
        "b1_to_b2_x": b1_to_b2_x,
        "b1_to_b2_y": b1_to_b2_y
    }
Ejemplo n.º 21
0
def unite_align(A, B, C):
    _, A_to_C_x, A_to_C_y = jaccard.jaccard_coef(A, C)
    _, B_to_C_x, B_to_C_y = jaccard.jaccard_coef(B, C)
    A_to_B_x = A_to_C_x - B_to_C_x
    A_to_B_y = A_to_C_y - B_to_C_y
    return A_to_B_x, A_to_B_y
Ejemplo n.º 22
0
def run_prob_anlg_tran_2x2(prob, anlg, tran):
    u1 = prob.matrix[anlg.get("value")[0]]
    u2 = prob.matrix[anlg.get("value")[1]]

    diff_to_u1_x = None
    diff_to_u1_y = None
    diff_to_u2_x = None
    diff_to_u2_y = None
    diff = None
    copies_to_u1_x = None
    copies_to_u1_y = None
    u1_coms_x = None
    u1_coms_y = None
    u2_coms_x = None
    u2_coms_y = None

    if "add_diff" == tran.get("name"):
        score, diff_to_u1_x, diff_to_u1_y, diff_to_u2_x, diff_to_u2_y, diff = \
            asymmetric_jaccard.asymmetric_jaccard_coef(u1, u2)
    elif "subtract_diff" == tran.get("name"):
        score, diff_to_u2_x, diff_to_u2_y, diff_to_u1_x, diff_to_u1_y, diff = \
            asymmetric_jaccard.asymmetric_jaccard_coef(u2, u1)
    elif "xor_diff" == tran.get("name"):
        score, u1_to_u2_x, u1_to_u2_y = jaccard.jaccard_coef(u1, u2)
        score = 1 - score
        u1_aligned, u2_aligned, aligned_to_u2_x, aligned_to_u2_y = utils.align(
            u1, u2, u1_to_u2_x, u1_to_u2_y)
        diff = utils.erase_noise_point(np.logical_xor(u1_aligned, u2_aligned),
                                       4)
        diff_to_u2_x = int(aligned_to_u2_x)
        diff_to_u2_y = int(aligned_to_u2_y)
        diff_to_u1_x = int(diff_to_u2_x - u1_to_u2_x)
        diff_to_u1_y = int(diff_to_u2_y - u1_to_u2_y)
    elif "upscale_to" == tran.get("name"):
        u1_upscaled = transform.upscale_to(u1, u2)
        score, _, _ = jaccard.jaccard_coef(u2, u1_upscaled)
    elif "duplicate" == tran.get("name"):
        scores = []
        u1_to_u2_xs = []
        u1_to_u2_ys = []
        current = u2.copy()
        current_to_u2_x = 0
        current_to_u2_y = 0
        while current.sum():
            score_tmp, diff_tmp_to_u1_x, diff_tmp_to_u1_y, diff_tmp_to_current_x, diff_tmp_to_current_y, _ = \
                asymmetric_jaccard.asymmetric_jaccard_coef(u1, current)

            if score_tmp < 0.6:
                break

            scores.append(score_tmp)
            u1_to_current_x = (-diff_tmp_to_u1_x) - (-diff_tmp_to_current_x)
            u1_to_current_y = (-diff_tmp_to_u1_y) - (-diff_tmp_to_current_y)
            u1_to_u2_x = u1_to_current_x + current_to_u2_x
            u1_to_u2_y = u1_to_current_y + current_to_u2_y
            u1_to_u2_xs.append(u1_to_u2_x)
            u1_to_u2_ys.append(u1_to_u2_y)
            u1_aligned, current_aligned, aligned_to_current_x, aligned_to_current_y = utils.align(
                u1, current, u1_to_current_x, u1_to_current_y)
            current = utils.erase_noise_point(
                np.logical_and(current_aligned, np.logical_not(u1_aligned)), 8)
            current_to_u2_x = aligned_to_current_x + current_to_u2_x
            current_to_u2_y = aligned_to_current_y + current_to_u2_y

        if 1 >= len(scores):
            score = 0
            copies_to_u1_x = [0]
            copies_to_u1_y = [0]
        else:
            score = min(scores)
            copies_to_u1_x = (np.array(u1_to_u2_xs[1:]) -
                              u1_to_u2_xs[0]).tolist()
            copies_to_u1_y = (np.array(u1_to_u2_ys[1:]) -
                              u1_to_u2_ys[0]).tolist()
    elif "rearrange" == tran.get("name"):
        score, u1_coms_x, u1_coms_y, u2_coms_x, u2_coms_y = transform.evaluate_rearrange(
            u1, u2)
    else:
        u1_t = transform.apply_unary_transformation(u1, tran)
        score, _, _ = jaccard.jaccard_coef(u1_t, u2)

    if "mirror" == tran.get("name") or "mirror_rot_180" == tran.get("name"):
        # if u1 or u2 is already symmetric, then we shouldn't use mirror tran.
        u1_mirror_score, _, _ = jaccard.jaccard_coef(u1_t, u1)
        u2_mirror = transform.apply_unary_transformation(u2, tran)
        u2_mirror_score, _, _ = jaccard.jaccard_coef(u2_mirror, u2)
        if max(u1_mirror_score, u2_mirror_score) > 0.9:
            score = 0

    prob_anlg_tran_d = assemble_prob_anlg_tran_d(prob,
                                                 anlg,
                                                 tran,
                                                 score,
                                                 diff_to_u1_x=diff_to_u1_x,
                                                 diff_to_u1_y=diff_to_u1_y,
                                                 diff_to_u2_x=diff_to_u2_x,
                                                 diff_to_u2_y=diff_to_u2_y,
                                                 diff=diff,
                                                 copies_to_u1_x=copies_to_u1_x,
                                                 copies_to_u1_y=copies_to_u1_y,
                                                 u1_coms_x=u1_coms_x,
                                                 u1_coms_y=u1_coms_y,
                                                 u2_coms_x=u2_coms_x,
                                                 u2_coms_y=u2_coms_y)

    return prob_anlg_tran_d
Ejemplo n.º 23
0
def predict(prob, d):

    anlg = analogy.get_anlg(d.get("anlg_name"))
    tran = transform.get_tran(d.get("tran_name"))

    if 3 == len(anlg.get("value")):
        best_diff_to_u1_x = d.get("diff_to_u1_x")
        best_diff_to_u1_y = d.get("diff_to_u1_y")
        best_diff_to_u2_x = d.get("diff_to_u2_x")
        best_diff_to_u2_y = d.get("diff_to_u2_y")
        best_diff = d.get("diff")
        u3 = prob.matrix[anlg.get("value")[2]]
        u1 = prob.matrix[anlg.get("value")[0]]

        if tran.get("name") == "add_diff":
            prediction = transform.add_diff(u3, best_diff_to_u1_x,
                                            best_diff_to_u1_y, best_diff, u1)
        elif tran.get("name") == "subtract_diff":
            prediction = transform.subtract_diff(u3, best_diff_to_u1_x,
                                                 best_diff_to_u1_y, best_diff,
                                                 u1)
        else:
            prediction = transform.apply_unary_transformation(u3, tran)

    elif 5 == len(anlg.get("value")):
        best_b1_to_b2_x = d.get("b1_to_b2_x")
        best_b1_to_b2_y = d.get("b1_to_b2_y")
        b1 = prob.matrix[anlg.get("value")[0]]
        b2 = prob.matrix[anlg.get("value")[1]]
        b4 = prob.matrix[anlg.get("value")[3]]
        b5 = prob.matrix[anlg.get("value")[4]]
        _, b4_to_b1_x, b4_to_b1_y = jaccard.jaccard_coef(b4, b1)
        _, b5_to_b2_x, b5_to_b2_y = jaccard.jaccard_coef(b5, b2)
        b4_to_b5_x = b4_to_b1_x - (b5_to_b2_x - best_b1_to_b2_x)
        b4_to_b5_y = b4_to_b1_y - (b5_to_b2_y - best_b1_to_b2_y)
        prediction, _, _, _, _ = transform.apply_binary_transformation(
            b4, b5, tran, b4_to_b5_x, b4_to_b5_y)

    else:
        raise Exception("Ryan!")

    pred_data = []
    for ii, opt in enumerate(prob.options):

        print(prob.name, anlg.get("name"), tran.get("name"), ii)

        if tran.get("name") == "add_diff":
            u1_to_u2_x = (-best_diff_to_u1_x) - (-best_diff_to_u2_x)
            u1_to_u2_y = (-best_diff_to_u1_y) - (-best_diff_to_u2_y)
            u3_score, diff = asymmetric_jaccard.asymmetric_jaccard_coef_pos_fixed(
                u3, opt, u1_to_u2_x, u1_to_u2_y)
            diff_score, _, _ = jaccard.jaccard_coef(diff, best_diff)
            opt_score, _, _ = jaccard.jaccard_coef(opt, prediction)
            score = (diff_score + opt_score + u3_score) / 3
        elif tran.get("name") == "subtract_diff":
            u2_to_u1_x = (-best_diff_to_u2_x) - (-best_diff_to_u1_x)
            u2_to_u1_y = (-best_diff_to_u2_y) - (-best_diff_to_u1_y)
            u3_score, diff = asymmetric_jaccard.asymmetric_jaccard_coef_pos_fixed(
                opt, u3, u2_to_u1_x, u2_to_u1_y)
            diff_score, _, _ = jaccard.jaccard_coef(diff, best_diff)
            opt_score, _, _ = jaccard.jaccard_coef(opt, prediction)
            score = (diff_score + opt_score + u3_score) / 3
        else:
            score, _, _ = jaccard.jaccard_coef(opt, prediction)

        pred_data.append({
            **d, "optn": ii + 1,
            "pato_score": score,
            "pred": prediction
        })

    return pred_data