Instruction:
Make a summary of the following Python 3 code
def noise4d(self, x, y, z, w):
        # Place input coordinates on simplectic honeycomb.
        stretch_offset = (x + y + z + w) * STRETCH_CONSTANT_4D
        xs = x + stretch_offset
        ys = y + stretch_offset
        zs = z + stretch_offset
        ws = w + stretch_offset

        # Floor to get simplectic honeycomb coordinates of rhombo-hypercube super-cell origin.
        xsb = floor(xs)
        ysb = floor(ys)
        zsb = floor(zs)
        wsb = floor(ws)

        # Skew out to get actual coordinates of stretched rhombo-hypercube origin. We'll need these later.
        squish_offset = (xsb + ysb + zsb + wsb) * SQUISH_CONSTANT_4D
        xb = xsb + squish_offset
        yb = ysb + squish_offset
        zb = zsb + squish_offset
        wb = wsb + squish_offset

        # Compute simplectic honeycomb coordinates relative to rhombo-hypercube origin.
        xins = xs - xsb
        yins = ys - ysb
        zins = zs - zsb
        wins = ws - wsb

        # Sum those together to get a value that determines which region we're in.
        in_sum = xins + yins + zins + wins

        # Positions relative to origin po.
        dx0 = x - xb
        dy0 = y - yb
        dz0 = z - zb
        dw0 = w - wb

        value = 0
        extrapolate = self._extrapolate4d
        if in_sum <= 1: # We're inside the pentachoron (4-Simplex) at (0,0,0,0)

            # Determine which two of (0,0,0,1), (0,0,1,0), (0,1,0,0), (1,0,0,0) are closest.
            a_po = 0x01
            a_score = xins
            b_po = 0x02
            b_score = yins
            if a_score >= b_score and zins > b_score:
                b_score = zins
                b_po = 0x04
            elif a_score < b_score and zins > a_score:
                a_score = zins
                a_po = 0x04

            if a_score >= b_score and wins > b_score:
                b_score = wins
                b_po = 0x08
            elif a_score < b_score and wins > a_score:
                a_score = wins
                a_po = 0x08

            # Now we determine the three lattice pos not part of the pentachoron that may contribute.
            # This depends on the closest two pentachoron vertices, including (0,0,0,0)
            uins = 1 - in_sum
            if uins > a_score or uins > b_score: # (0,0,0,0) is one of the closest two pentachoron vertices.
                c = b_po if (b_score > a_score) else a_po # Our other closest vertex is the closest out of a and b.
                if (c & 0x01) == 0:
                    xsv_ext0 = xsb - 1
                    xsv_ext1 = xsv_ext2 = xsb
                    dx_ext0 = dx0 + 1
                    dx_ext1 = dx_ext2 = dx0
                else:
                    xsv_ext0 = xsv_ext1 = xsv_ext2 = xsb + 1
                    dx_ext0 = dx_ext1 = dx_ext2 = dx0 - 1

                if (c & 0x02) == 0:
                    ysv_ext0 = ysv_ext1 = ysv_ext2 = ysb
                    dy_ext0 = dy_ext1 = dy_ext2 = dy0
                    if (c & 0x01) == 0x01:
                        ysv_ext0 -= 1
                        dy_ext0 += 1
                    else:
                        ysv_ext1 -= 1
                        dy_ext1 += 1

                else:
                    ysv_ext0 = ysv_ext1 = ysv_ext2 = ysb + 1
                    dy_ext0 = dy_ext1 = dy_ext2 = dy0 - 1

                if (c & 0x04) == 0:
                    zsv_ext0 = zsv_ext1 = zsv_ext2 = zsb
                    dz_ext0 = dz_ext1 = dz_ext2 = dz0
                    if (c & 0x03) != 0:
                        if (c & 0x03) == 0x03:
                            zsv_ext0 -= 1
                            dz_ext0 += 1
                        else:
                            zsv_ext1 -= 1
                            dz_ext1 += 1

                    else:
                        zsv_ext2 -= 1
                        dz_ext2 += 1

                else:
                    zsv_ext0 = zsv_ext1 = zsv_ext2 = zsb + 1
                    dz_ext0 = dz_ext1 = dz_ext2 = dz0 - 1

                if (c & 0x08) == 0:
                    wsv_ext0 = wsv_ext1 = wsb
                    wsv_ext2 = wsb - 1
                    dw_ext0 = dw_ext1 = dw0
                    dw_ext2 = dw0 + 1
                else:
                    wsv_ext0 = wsv_ext1 = wsv_ext2 = wsb + 1
                    dw_ext0 = dw_ext1 = dw_ext2 = dw0 - 1

            else: # (0,0,0,0) is not one of the closest two pentachoron vertices.
                c = (a_po | b_po) # Our three extra vertices are determined by the closest two.

                if (c & 0x01) == 0:
                    xsv_ext0 = xsv_ext2 = xsb
                    xsv_ext1 = xsb - 1
                    dx_ext0 = dx0 - 2 * SQUISH_CONSTANT_4D
                    dx_ext1 = dx0 + 1 - SQUISH_CONSTANT_4D
                    dx_ext2 = dx0 - SQUISH_CONSTANT_4D
                else:
                    xsv_ext0 = xsv_ext1 = xsv_ext2 = xsb + 1
                    dx_ext0 = dx0 - 1 - 2 * SQUISH_CONSTANT_4D
                    dx_ext1 = dx_ext2 = dx0 - 1 - SQUISH_CONSTANT_4D

                if (c & 0x02) == 0:
                    ysv_ext0 = ysv_ext1 = ysv_ext2 = ysb
                    dy_ext0 = dy0 - 2 * SQUISH_CONSTANT_4D
                    dy_ext1 = dy_ext2 = dy0 - SQUISH_CONSTANT_4D
                    if (c & 0x01) == 0x01:
                        ysv_ext1 -= 1
                        dy_ext1 += 1
                    else:
                        ysv_ext2 -= 1
                        dy_ext2 += 1

                else:
                    ysv_ext0 = ysv_ext1 = ysv_ext2 = ysb + 1
                    dy_ext0 = dy0 - 1 - 2 * SQUISH_CONSTANT_4D
                    dy_ext1 = dy_ext2 = dy0 - 1 - SQUISH_CONSTANT_4D

                if (c & 0x04) == 0:
                    zsv_ext0 = zsv_ext1 = zsv_ext2 = zsb
                    dz_ext0 = dz0 - 2 * SQUISH_CONSTANT_4D
                    dz_ext1 = dz_ext2 = dz0 - SQUISH_CONSTANT_4D
                    if (c & 0x03) == 0x03:
                        zsv_ext1 -= 1
                        dz_ext1 += 1
                    else:
                        zsv_ext2 -= 1
                        dz_ext2 += 1

                else:
                    zsv_ext0 = zsv_ext1 = zsv_ext2 = zsb + 1
                    dz_ext0 = dz0 - 1 - 2 * SQUISH_CONSTANT_4D
                    dz_ext1 = dz_ext2 = dz0 - 1 - SQUISH_CONSTANT_4D

                if (c & 0x08) == 0:
                    wsv_ext0 = wsv_ext1 = wsb
                    wsv_ext2 = wsb - 1
                    dw_ext0 = dw0 - 2 * SQUISH_CONSTANT_4D
                    dw_ext1 = dw0 - SQUISH_CONSTANT_4D
                    dw_ext2 = dw0 + 1 - SQUISH_CONSTANT_4D
                else:
                    wsv_ext0 = wsv_ext1 = wsv_ext2 = wsb + 1
                    dw_ext0 = dw0 - 1 - 2 * SQUISH_CONSTANT_4D
                    dw_ext1 = dw_ext2 = dw0 - 1 - SQUISH_CONSTANT_4D

            # Contribution (0,0,0,0)
            attn0 = 2 - dx0 * dx0 - dy0 * dy0 - dz0 * dz0 - dw0 * dw0
            if attn0 > 0:
                attn0 *= attn0
                value += attn0 * attn0 * extrapolate(xsb + 0, ysb + 0, zsb + 0, wsb + 0, dx0, dy0, dz0, dw0)

            # Contribution (1,0,0,0)
            dx1 = dx0 - 1 - SQUISH_CONSTANT_4D
            dy1 = dy0 - 0 - SQUISH_CONSTANT_4D
            dz1 = dz0 - 0 - SQUISH_CONSTANT_4D
            dw1 = dw0 - 0 - SQUISH_CONSTANT_4D
            attn1 = 2 - dx1 * dx1 - dy1 * dy1 - dz1 * dz1 - dw1 * dw1
            if attn1 > 0:
                attn1 *= attn1
                value += attn1 * attn1 * extrapolate(xsb + 1, ysb + 0, zsb + 0, wsb + 0, dx1, dy1, dz1, dw1)

            # Contribution (0,1,0,0)
            dx2 = dx0 - 0 - SQUISH_CONSTANT_4D
            dy2 = dy0 - 1 - SQUISH_CONSTANT_4D
            dz2 = dz1
            dw2 = dw1
            attn2 = 2 - dx2 * dx2 - dy2 * dy2 - dz2 * dz2 - dw2 * dw2
            if attn2 > 0:
                attn2 *= attn2
                value += attn2 * attn2 * extrapolate(xsb + 0, ysb + 1, zsb + 0, wsb + 0, dx2, dy2, dz2, dw2)

            # Contribution (0,0,1,0)
            dx3 = dx2
            dy3 = dy1
            dz3 = dz0 - 1 - SQUISH_CONSTANT_4D
            dw3 = dw1
            attn3 = 2 - dx3 * dx3 - dy3 * dy3 - dz3 * dz3 - dw3 * dw3
            if attn3 > 0:
                attn3 *= attn3
                value += attn3 * attn3 * extrapolate(xsb + 0, ysb + 0, zsb + 1, wsb + 0, dx3, dy3, dz3, dw3)

            # Contribution (0,0,0,1)
            dx4 = dx2
            dy4 = dy1
            dz4 = dz1
            dw4 = dw0 - 1 - SQUISH_CONSTANT_4D
            attn4 = 2 - dx4 * dx4 - dy4 * dy4 - dz4 * dz4 - dw4 * dw4
            if attn4 > 0:
                attn4 *= attn4
                value += attn4 * attn4 * extrapolate(xsb + 0, ysb + 0, zsb + 0, wsb + 1, dx4, dy4, dz4, dw4)

        elif in_sum >= 3: # We're inside the pentachoron (4-Simplex) at (1,1,1,1)
            # Determine which two of (1,1,1,0), (1,1,0,1), (1,0,1,1), (0,1,1,1) are closest.
            a_po = 0x0E
            a_score = xins
            b_po = 0x0D
            b_score = yins
            if a_score <= b_score and zins < b_score:
                b_score = zins
                b_po = 0x0B
            elif a_score > b_score and zins < a_score:
                a_score = zins
                a_po = 0x0B

            if a_score <= b_score and wins < b_score:
                b_score = wins
                b_po = 0x07
            elif a_score > b_score and wins < a_score:
                a_score = wins
                a_po = 0x07

            # Now we determine the three lattice pos not part of the pentachoron that may contribute.
            # This depends on the closest two pentachoron vertices, including (0,0,0,0)
            uins = 4 - in_sum
            if uins < a_score or uins < b_score: # (1,1,1,1) is one of the closest two pentachoron vertices.
                c = b_po if (b_score < a_score) else a_po # Our other closest vertex is the closest out of a and b.

                if (c & 0x01) != 0:
                    xsv_ext0 = xsb + 2
                    xsv_ext1 = xsv_ext2 = xsb + 1
                    dx_ext0 = dx0 - 2 - 4 * SQUISH_CONSTANT_4D
                    dx_ext1 = dx_ext2 = dx0 - 1 - 4 * SQUISH_CONSTANT_4D
                else:
                    xsv_ext0 = xsv_ext1 = xsv_ext2 = xsb
                    dx_ext0 = dx_ext1 = dx_ext2 = dx0 - 4 * SQUISH_CONSTANT_4D

                if (c & 0x02) != 0:
                    ysv_ext0 = ysv_ext1 = ysv_ext2 = ysb + 1
                    dy_ext0 = dy_ext1 = dy_ext2 = dy0 - 1 - 4 * SQUISH_CONSTANT_4D
                    if (c & 0x01) != 0:
                        ysv_ext1 += 1
                        dy_ext1 -= 1
                    else:
                        ysv_ext0 += 1
                        dy_ext0 -= 1

                else:
                    ysv_ext0 = ysv_ext1 = ysv_ext2 = ysb
                    dy_ext0 = dy_ext1 = dy_ext2 = dy0 - 4 * SQUISH_CONSTANT_4D

                if (c & 0x04) != 0:
                    zsv_ext0 = zsv_ext1 = zsv_ext2 = zsb + 1
                    dz_ext0 = dz_ext1 = dz_ext2 = dz0 - 1 - 4 * SQUISH_CONSTANT_4D
                    if (c & 0x03) != 0x03:
                        if (c & 0x03) == 0:
                            zsv_ext0 += 1
                            dz_ext0 -= 1
                        else:
                            zsv_ext1 += 1
                            dz_ext1 -= 1

                    else:
                        zsv_ext2 += 1
                        dz_ext2 -= 1

                else:
                    zsv_ext0 = zsv_ext1 = zsv_ext2 = zsb
                    dz_ext0 = dz_ext1 = dz_ext2 = dz0 - 4 * SQUISH_CONSTANT_4D

                if (c & 0x08) != 0:
                    wsv_ext0 = wsv_ext1 = wsb + 1
                    wsv_ext2 = wsb + 2
                    dw_ext0 = dw_ext1 = dw0 - 1 - 4 * SQUISH_CONSTANT_4D
                    dw_ext2 = dw0 - 2 - 4 * SQUISH_CONSTANT_4D
                else:
                    wsv_ext0 = wsv_ext1 = wsv_ext2 = wsb
                    dw_ext0 = dw_ext1 = dw_ext2 = dw0 - 4 * SQUISH_CONSTANT_4D

            else: # (1,1,1,1) is not one of the closest two pentachoron vertices.
                c = (a_po & b_po) # Our three extra vertices are determined by the closest two.

                if (c & 0x01) != 0:
                    xsv_ext0 = xsv_ext2 = xsb + 1
                    xsv_ext1 = xsb + 2
                    dx_ext0 = dx0 - 1 - 2 * SQUISH_CONSTANT_4D
                    dx_ext1 = dx0 - 2 - 3 * SQUISH_CONSTANT_4D
                    dx_ext2 = dx0 - 1 - 3 * SQUISH_CONSTANT_4D
                else:
                    xsv_ext0 = xsv_ext1 = xsv_ext2 = xsb
                    dx_ext0 = dx0 - 2 * SQUISH_CONSTANT_4D
                    dx_ext1 = dx_ext2 = dx0 - 3 * SQUISH_CONSTANT_4D

                if (c & 0x02) != 0:
                    ysv_ext0 = ysv_ext1 = ysv_ext2 = ysb + 1
                    dy_ext0 = dy0 - 1 - 2 * SQUISH_CONSTANT_4D
                    dy_ext1 = dy_ext2 = dy0 - 1 - 3 * SQUISH_CONSTANT_4D
                    if (c & 0x01) != 0:
                        ysv_ext2 += 1
                        dy_ext2 -= 1
                    else:
                        ysv_ext1 += 1
                        dy_ext1 -= 1

                else:
                    ysv_ext0 = ysv_ext1 = ysv_ext2 = ysb
                    dy_ext0 = dy0 - 2 * SQUISH_CONSTANT_4D
                    dy_ext1 = dy_ext2 = dy0 - 3 * SQUISH_CONSTANT_4D

                if (c & 0x04) != 0:
                    zsv_ext0 = zsv_ext1 = zsv_ext2 = zsb + 1
                    dz_ext0 = dz0 - 1 - 2 * SQUISH_CONSTANT_4D
                    dz_ext1 = dz_ext2 = dz0 - 1 - 3 * SQUISH_CONSTANT_4D
                    if (c & 0x03) != 0:
                        zsv_ext2 += 1
                        dz_ext2 -= 1
                    else:
                        zsv_ext1 += 1
                        dz_ext1 -= 1

                else:
                    zsv_ext0 = zsv_ext1 = zsv_ext2 = zsb
                    dz_ext0 = dz0 - 2 * SQUISH_CONSTANT_4D
                    dz_ext1 = dz_ext2 = dz0 - 3 * SQUISH_CONSTANT_4D

                if (c & 0x08) != 0:
                    wsv_ext0 = wsv_ext1 = wsb + 1
                    wsv_ext2 = wsb + 2
                    dw_ext0 = dw0 - 1 - 2 * SQUISH_CONSTANT_4D
                    dw_ext1 = dw0 - 1 - 3 * SQUISH_CONSTANT_4D
                    dw_ext2 = dw0 - 2 - 3 * SQUISH_CONSTANT_4D
                else:
                    wsv_ext0 = wsv_ext1 = wsv_ext2 = wsb
                    dw_ext0 = dw0 - 2 * SQUISH_CONSTANT_4D
                    dw_ext1 = dw_ext2 = dw0 - 3 * SQUISH_CONSTANT_4D

            # Contribution (1,1,1,0)
            dx4 = dx0 - 1 - 3 * SQUISH_CONSTANT_4D
            dy4 = dy0 - 1 - 3 * SQUISH_CONSTANT_4D
            dz4 = dz0 - 1 - 3 * SQUISH_CONSTANT_4D
            dw4 = dw0 - 3 * SQUISH_CONSTANT_4D
            attn4 = 2 - dx4 * dx4 - dy4 * dy4 - dz4 * dz4 - dw4 * dw4
            if attn4 > 0:
                attn4 *= attn4
                value += attn4 * attn4 * extrapolate(xsb + 1, ysb + 1, zsb + 1, wsb + 0, dx4, dy4, dz4, dw4)

            # Contribution (1,1,0,1)
            dx3 = dx4
            dy3 = dy4
            dz3 = dz0 - 3 * SQUISH_CONSTANT_4D
            dw3 = dw0 - 1 - 3 * SQUISH_CONSTANT_4D
            attn3 = 2 - dx3 * dx3 - dy3 * dy3 - dz3 * dz3 - dw3 * dw3
            if attn3 > 0:
                attn3 *= attn3
                value += attn3 * attn3 * extrapolate(xsb + 1, ysb + 1, zsb + 0, wsb + 1, dx3, dy3, dz3, dw3)

            # Contribution (1,0,1,1)
            dx2 = dx4
            dy2 = dy0 - 3 * SQUISH_CONSTANT_4D
            dz2 = dz4
            dw2 = dw3
            attn2 = 2 - dx2 * dx2 - dy2 * dy2 - dz2 * dz2 - dw2 * dw2
            if attn2 > 0:
                attn2 *= attn2
                value += attn2 * attn2 * extrapolate(xsb + 1, ysb + 0, zsb + 1, wsb + 1, dx2, dy2, dz2, dw2)

            # Contribution (0,1,1,1)
            dx1 = dx0 - 3 * SQUISH_CONSTANT_4D
            dz1 = dz4
            dy1 = dy4
            dw1 = dw3
            attn1 = 2 - dx1 * dx1 - dy1 * dy1 - dz1 * dz1 - dw1 * dw1
            if attn1 > 0:
                attn1 *= attn1
                value += attn1 * attn1 * extrapolate(xsb + 0, ysb + 1, zsb + 1, wsb + 1, dx1, dy1, dz1, dw1)

            # Contribution (1,1,1,1)
            dx0 = dx0 - 1 - 4 * SQUISH_CONSTANT_4D
            dy0 = dy0 - 1 - 4 * SQUISH_CONSTANT_4D
            dz0 = dz0 - 1 - 4 * SQUISH_CONSTANT_4D
            dw0 = dw0 - 1 - 4 * SQUISH_CONSTANT_4D
            attn0 = 2 - dx0 * dx0 - dy0 * dy0 - dz0 * dz0 - dw0 * dw0
            if attn0 > 0:
                attn0 *= attn0
                value += attn0 * attn0 * extrapolate(xsb + 1, ysb + 1, zsb + 1, wsb + 1, dx0, dy0, dz0, dw0)

        elif in_sum <= 2: # We're inside the first dispentachoron (Rectified 4-Simplex)
            a_is_bigger_side = True
            b_is_bigger_side = True

            # Decide between (1,1,0,0) and (0,0,1,1)
            if xins + yins > zins + wins:
                a_score = xins + yins
                a_po = 0x03
            else:
                a_score = zins + wins
                a_po = 0x0C

            # Decide between (1,0,1,0) and (0,1,0,1)
            if xins + zins > yins + wins:
                b_score = xins + zins
                b_po = 0x05
            else:
                b_score = yins + wins
                b_po = 0x0A

            # Closer between (1,0,0,1) and (0,1,1,0) will replace the further of a and b, if closer.
            if xins + wins > yins + zins:
                score = xins + wins
                if a_score >= b_score and score > b_score:
                    b_score = score
                    b_po = 0x09
                elif a_score < b_score and score > a_score:
                    a_score = score
                    a_po = 0x09

            else:
                score = yins + zins
                if a_score >= b_score and score > b_score:
                    b_score = score
                    b_po = 0x06
                elif a_score < b_score and score > a_score:
                    a_score = score
                    a_po = 0x06

            # Decide if (1,0,0,0) is closer.
            p1 = 2 - in_sum + xins
            if a_score >= b_score and p1 > b_score:
                b_score = p1
                b_po = 0x01
                b_is_bigger_side = False
            elif a_score < b_score and p1 > a_score:
                a_score = p1
                a_po = 0x01
                a_is_bigger_side = False

            # Decide if (0,1,0,0) is closer.
            p2 = 2 - in_sum + yins
            if a_score >= b_score and p2 > b_score:
                b_score = p2
                b_po = 0x02
                b_is_bigger_side = False
            elif a_score < b_score and p2 > a_score:
                a_score = p2
                a_po = 0x02
                a_is_bigger_side = False

            # Decide if (0,0,1,0) is closer.
            p3 = 2 - in_sum + zins
            if a_score >= b_score and p3 > b_score:
                b_score = p3
                b_po = 0x04
                b_is_bigger_side = False
            elif a_score < b_score and p3 > a_score:
                a_score = p3
                a_po = 0x04
                a_is_bigger_side = False

            # Decide if (0,0,0,1) is closer.
            p4 = 2 - in_sum + wins
            if a_score >= b_score and p4 > b_score:
                b_po = 0x08
                b_is_bigger_side = False
            elif a_score < b_score and p4 > a_score:
                a_po = 0x08
                a_is_bigger_side = False

            # Where each of the two closest pos are determines how the extra three vertices are calculated.
            if a_is_bigger_side == b_is_bigger_side:
                if a_is_bigger_side: # Both closest pos on the bigger side
                    c1 = (a_po | b_po)
                    c2 = (a_po & b_po)
                    if (c1 & 0x01) == 0:
                        xsv_ext0 = xsb
                        xsv_ext1 = xsb - 1
                        dx_ext0 = dx0 - 3 * SQUISH_CONSTANT_4D
                        dx_ext1 = dx0 + 1 - 2 * SQUISH_CONSTANT_4D
                    else:
                        xsv_ext0 = xsv_ext1 = xsb + 1
                        dx_ext0 = dx0 - 1 - 3 * SQUISH_CONSTANT_4D
                        dx_ext1 = dx0 - 1 - 2 * SQUISH_CONSTANT_4D

                    if (c1 & 0x02) == 0:
                        ysv_ext0 = ysb
                        ysv_ext1 = ysb - 1
                        dy_ext0 = dy0 - 3 * SQUISH_CONSTANT_4D
                        dy_ext1 = dy0 + 1 - 2 * SQUISH_CONSTANT_4D
                    else:
                        ysv_ext0 = ysv_ext1 = ysb + 1
                        dy_ext0 = dy0 - 1 - 3 * SQUISH_CONSTANT_4D
                        dy_ext1 = dy0 - 1 - 2 * SQUISH_CONSTANT_4D

                    if (c1 & 0x04) == 0:
                        zsv_ext0 = zsb
                        zsv_ext1 = zsb - 1
                        dz_ext0 = dz0 - 3 * SQUISH_CONSTANT_4D
                        dz_ext1 = dz0 + 1 - 2 * SQUISH_CONSTANT_4D
                    else:
                        zsv_ext0 = zsv_ext1 = zsb + 1
                        dz_ext0 = dz0 - 1 - 3 * SQUISH_CONSTANT_4D
                        dz_ext1 = dz0 - 1 - 2 * SQUISH_CONSTANT_4D

                    if (c1 & 0x08) == 0:
                        wsv_ext0 = wsb
                        wsv_ext1 = wsb - 1
                        dw_ext0 = dw0 - 3 * SQUISH_CONSTANT_4D
                        dw_ext1 = dw0 + 1 - 2 * SQUISH_CONSTANT_4D
                    else:
                        wsv_ext0 = wsv_ext1 = wsb + 1
                        dw_ext0 = dw0 - 1 - 3 * SQUISH_CONSTANT_4D
                        dw_ext1 = dw0 - 1 - 2 * SQUISH_CONSTANT_4D

                    # One combination is a _permutation of (0,0,0,2) based on c2
                    xsv_ext2 = xsb
                    ysv_ext2 = ysb
                    zsv_ext2 = zsb
                    wsv_ext2 = wsb
                    dx_ext2 = dx0 - 2 * SQUISH_CONSTANT_4D
                    dy_ext2 = dy0 - 2 * SQUISH_CONSTANT_4D
                    dz_ext2 = dz0 - 2 * SQUISH_CONSTANT_4D
                    dw_ext2 = dw0 - 2 * SQUISH_CONSTANT_4D
                    if (c2 & 0x01) != 0:
                        xsv_ext2 += 2
                        dx_ext2 -= 2
                    elif (c2 & 0x02) != 0:
                        ysv_ext2 += 2
                        dy_ext2 -= 2
                    elif (c2 & 0x04) != 0:
                        zsv_ext2 += 2
                        dz_ext2 -= 2
                    else:
                        wsv_ext2 += 2
                        dw_ext2 -= 2

                else: # Both closest pos on the smaller side
                    # One of the two extra pos is (0,0,0,0)
                    xsv_ext2 = xsb
                    ysv_ext2 = ysb
                    zsv_ext2 = zsb
                    wsv_ext2 = wsb
                    dx_ext2 = dx0
                    dy_ext2 = dy0
                    dz_ext2 = dz0
                    dw_ext2 = dw0

                    # Other two pos are based on the omitted axes.
                    c = (a_po | b_po)

                    if (c & 0x01) == 0:
                        xsv_ext0 = xsb - 1
                        xsv_ext1 = xsb
                        dx_ext0 = dx0 + 1 - SQUISH_CONSTANT_4D
                        dx_ext1 = dx0 - SQUISH_CONSTANT_4D
                    else:
                        xsv_ext0 = xsv_ext1 = xsb + 1
                        dx_ext0 = dx_ext1 = dx0 - 1 - SQUISH_CONSTANT_4D

                    if (c & 0x02) == 0:
                        ysv_ext0 = ysv_ext1 = ysb
                        dy_ext0 = dy_ext1 = dy0 - SQUISH_CONSTANT_4D
                        if (c & 0x01) == 0x01:
                            ysv_ext0 -= 1
                            dy_ext0 += 1
                        else:
                            ysv_ext1 -= 1
                            dy_ext1 += 1

                    else:
                        ysv_ext0 = ysv_ext1 = ysb + 1
                        dy_ext0 = dy_ext1 = dy0 - 1 - SQUISH_CONSTANT_4D

                    if (c & 0x04) == 0:
                        zsv_ext0 = zsv_ext1 = zsb
                        dz_ext0 = dz_ext1 = dz0 - SQUISH_CONSTANT_4D
                        if (c & 0x03) == 0x03:
                            zsv_ext0 -= 1
                            dz_ext0 += 1
                        else:
                            zsv_ext1 -= 1
                            dz_ext1 += 1

                    else:
                        zsv_ext0 = zsv_ext1 = zsb + 1
                        dz_ext0 = dz_ext1 = dz0 - 1 - SQUISH_CONSTANT_4D

                    if (c & 0x08) == 0:
                        wsv_ext0 = wsb
                        wsv_ext1 = wsb - 1
                        dw_ext0 = dw0 - SQUISH_CONSTANT_4D
                        dw_ext1 = dw0 + 1 - SQUISH_CONSTANT_4D
                    else:
                        wsv_ext0 = wsv_ext1 = wsb + 1
                        dw_ext0 = dw_ext1 = dw0 - 1 - SQUISH_CONSTANT_4D

            else: # One po on each "side"
                if a_is_bigger_side:
                    c1 = a_po
                    c2 = b_po
                else:
                    c1 = b_po
                    c2 = a_po

                # Two contributions are the bigger-sided po with each 0 replaced with -1.
                if (c1 & 0x01) == 0:
                    xsv_ext0 = xsb - 1
                    xsv_ext1 = xsb
                    dx_ext0 = dx0 + 1 - SQUISH_CONSTANT_4D
                    dx_ext1 = dx0 - SQUISH_CONSTANT_4D
                else:
                    xsv_ext0 = xsv_ext1 = xsb + 1
                    dx_ext0 = dx_ext1 = dx0 - 1 - SQUISH_CONSTANT_4D

                if (c1 & 0x02) == 0:
                    ysv_ext0 = ysv_ext1 = ysb
                    dy_ext0 = dy_ext1 = dy0 - SQUISH_CONSTANT_4D
                    if (c1 & 0x01) == 0x01:
                        ysv_ext0 -= 1
                        dy_ext0 += 1
                    else:
                        ysv_ext1 -= 1
                        dy_ext1 += 1

                else:
                    ysv_ext0 = ysv_ext1 = ysb + 1
                    dy_ext0 = dy_ext1 = dy0 - 1 - SQUISH_CONSTANT_4D

                if (c1 & 0x04) == 0:
                    zsv_ext0 = zsv_ext1 = zsb
                    dz_ext0 = dz_ext1 = dz0 - SQUISH_CONSTANT_4D
                    if (c1 & 0x03) == 0x03:
                        zsv_ext0 -= 1
                        dz_ext0 += 1
                    else:
                        zsv_ext1 -= 1
                        dz_ext1 += 1

                else:
                    zsv_ext0 = zsv_ext1 = zsb + 1
                    dz_ext0 = dz_ext1 = dz0 - 1 - SQUISH_CONSTANT_4D

                if (c1 & 0x08) == 0:
                    wsv_ext0 = wsb
                    wsv_ext1 = wsb - 1
                    dw_ext0 = dw0 - SQUISH_CONSTANT_4D
                    dw_ext1 = dw0 + 1 - SQUISH_CONSTANT_4D
                else:
                    wsv_ext0 = wsv_ext1 = wsb + 1
                    dw_ext0 = dw_ext1 = dw0 - 1 - SQUISH_CONSTANT_4D

                # One contribution is a _permutation of (0,0,0,2) based on the smaller-sided po
                xsv_ext2 = xsb
                ysv_ext2 = ysb
                zsv_ext2 = zsb
                wsv_ext2 = wsb
                dx_ext2 = dx0 - 2 * SQUISH_CONSTANT_4D
                dy_ext2 = dy0 - 2 * SQUISH_CONSTANT_4D
                dz_ext2 = dz0 - 2 * SQUISH_CONSTANT_4D
                dw_ext2 = dw0 - 2 * SQUISH_CONSTANT_4D
                if (c2 & 0x01) != 0:
                    xsv_ext2 += 2
                    dx_ext2 -= 2
                elif (c2 & 0x02) != 0:
                    ysv_ext2 += 2
                    dy_ext2 -= 2
                elif (c2 & 0x04) != 0:
                    zsv_ext2 += 2
                    dz_ext2 -= 2
                else:
                    wsv_ext2 += 2
                    dw_ext2 -= 2

            # Contribution (1,0,0,0)
            dx1 = dx0 - 1 - SQUISH_CONSTANT_4D
            dy1 = dy0 - 0 - SQUISH_CONSTANT_4D
            dz1 = dz0 - 0 - SQUISH_CONSTANT_4D
            dw1 = dw0 - 0 - SQUISH_CONSTANT_4D
            attn1 = 2 - dx1 * dx1 - dy1 * dy1 - dz1 * dz1 - dw1 * dw1
            if attn1 > 0:
                attn1 *= attn1
                value += attn1 * attn1 * extrapolate(xsb + 1, ysb + 0, zsb + 0, wsb + 0, dx1, dy1, dz1, dw1)

            # Contribution (0,1,0,0)
            dx2 = dx0 - 0 - SQUISH_CONSTANT_4D
            dy2 = dy0 - 1 - SQUISH_CONSTANT_4D
            dz2 = dz1
            dw2 = dw1
            attn2 = 2 - dx2 * dx2 - dy2 * dy2 - dz2 * dz2 - dw2 * dw2
            if attn2 > 0:
                attn2 *= attn2
                value += attn2 * attn2 * extrapolate(xsb + 0, ysb + 1, zsb + 0, wsb + 0, dx2, dy2, dz2, dw2)

            # Contribution (0,0,1,0)
            dx3 = dx2
            dy3 = dy1
            dz3 = dz0 - 1 - SQUISH_CONSTANT_4D
            dw3 = dw1
            attn3 = 2 - dx3 * dx3 - dy3 * dy3 - dz3 * dz3 - dw3 * dw3
            if attn3 > 0:
                attn3 *= attn3
                value += attn3 * attn3 * extrapolate(xsb + 0, ysb + 0, zsb + 1, wsb + 0, dx3, dy3, dz3, dw3)

            # Contribution (0,0,0,1)
            dx4 = dx2
            dy4 = dy1
            dz4 = dz1
            dw4 = dw0 - 1 - SQUISH_CONSTANT_4D
            attn4 = 2 - dx4 * dx4 - dy4 * dy4 - dz4 * dz4 - dw4 * dw4
            if attn4 > 0:
                attn4 *= attn4
                value += attn4 * attn4 * extrapolate(xsb + 0, ysb + 0, zsb + 0, wsb + 1, dx4, dy4, dz4, dw4)

            # Contribution (1,1,0,0)
            dx5 = dx0 - 1 - 2 * SQUISH_CONSTANT_4D
            dy5 = dy0 - 1 - 2 * SQUISH_CONSTANT_4D
            dz5 = dz0 - 0 - 2 * SQUISH_CONSTANT_4D
            dw5 = dw0 - 0 - 2 * SQUISH_CONSTANT_4D
            attn5 = 2 - dx5 * dx5 - dy5 * dy5 - dz5 * dz5 - dw5 * dw5
            if attn5 > 0:
                attn5 *= attn5
                value += attn5 * attn5 * extrapolate(xsb + 1, ysb + 1, zsb + 0, wsb + 0, dx5, dy5, dz5, dw5)

            # Contribution (1,0,1,0)
            dx6 = dx0 - 1 - 2 * SQUISH_CONSTANT_4D
            dy6 = dy0 - 0 - 2 * SQUISH_CONSTANT_4D
            dz6 = dz0 - 1 - 2 * SQUISH_CONSTANT_4D
            dw6 = dw0 - 0 - 2 * SQUISH_CONSTANT_4D
            attn6 = 2 - dx6 * dx6 - dy6 * dy6 - dz6 * dz6 - dw6 * dw6
            if attn6 > 0:
                attn6 *= attn6
                value += attn6 * attn6 * extrapolate(xsb + 1, ysb + 0, zsb + 1, wsb + 0, dx6, dy6, dz6, dw6)

            # Contribution (1,0,0,1)
            dx7 = dx0 - 1 - 2 * SQUISH_CONSTANT_4D
            dy7 = dy0 - 0 - 2 * SQUISH_CONSTANT_4D
            dz7 = dz0 - 0 - 2 * SQUISH_CONSTANT_4D
            dw7 = dw0 - 1 - 2 * SQUISH_CONSTANT_4D
            attn7 = 2 - dx7 * dx7 - dy7 * dy7 - dz7 * dz7 - dw7 * dw7
            if attn7 > 0:
                attn7 *= attn7
                value += attn7 * attn7 * extrapolate(xsb + 1, ysb + 0, zsb + 0, wsb + 1, dx7, dy7, dz7, dw7)

            # Contribution (0,1,1,0)
            dx8 = dx0 - 0 - 2 * SQUISH_CONSTANT_4D
            dy8 = dy0 - 1 - 2 * SQUISH_CONSTANT_4D
            dz8 = dz0 - 1 - 2 * SQUISH_CONSTANT_4D
            dw8 = dw0 - 0 - 2 * SQUISH_CONSTANT_4D
            attn8 = 2 - dx8 * dx8 - dy8 * dy8 - dz8 * dz8 - dw8 * dw8
            if attn8 > 0:
                attn8 *= attn8
                value += attn8 * attn8 * extrapolate(xsb + 0, ysb + 1, zsb + 1, wsb + 0, dx8, dy8, dz8, dw8)

            # Contribution (0,1,0,1)
            dx9 = dx0 - 0 - 2 * SQUISH_CONSTANT_4D
            dy9 = dy0 - 1 - 2 * SQUISH_CONSTANT_4D
            dz9 = dz0 - 0 - 2 * SQUISH_CONSTANT_4D
            dw9 = dw0 - 1 - 2 * SQUISH_CONSTANT_4D
            attn9 = 2 - dx9 * dx9 - dy9 * dy9 - dz9 * dz9 - dw9 * dw9
            if attn9 > 0:
                attn9 *= attn9
                value += attn9 * attn9 * extrapolate(xsb + 0, ysb + 1, zsb + 0, wsb + 1, dx9, dy9, dz9, dw9)

            # Contribution (0,0,1,1)
            dx10 = dx0 - 0 - 2 * SQUISH_CONSTANT_4D
            dy10 = dy0 - 0 - 2 * SQUISH_CONSTANT_4D
            dz10 = dz0 - 1 - 2 * SQUISH_CONSTANT_4D
            dw10 = dw0 - 1 - 2 * SQUISH_CONSTANT_4D
            attn10 = 2 - dx10 * dx10 - dy10 * dy10 - dz10 * dz10 - dw10 * dw10
            if attn10 > 0:
                attn10 *= attn10
                value += attn10 * attn10 * extrapolate(xsb + 0, ysb + 0, zsb + 1, wsb + 1, dx10, dy10, dz10, dw10)

        else: # We're inside the second dispentachoron (Rectified 4-Simplex)
            a_is_bigger_side = True
            b_is_bigger_side = True

            # Decide between (0,0,1,1) and (1,1,0,0)
            if xins + yins < zins + wins:
                a_score = xins + yins
                a_po = 0x0C
            else:
                a_score = zins + wins
                a_po = 0x03

            # Decide between (0,1,0,1) and (1,0,1,0)
            if xins + zins < yins + wins:
                b_score = xins + zins
                b_po = 0x0A
            else:
                b_score = yins + wins
                b_po = 0x05

            # Closer between (0,1,1,0) and (1,0,0,1) will replace the further of a and b, if closer.
            if xins + wins < yins + zins:
                score = xins + wins
                if a_score <= b_score and score < b_score:
                    b_score = score
                    b_po = 0x06
                elif a_score > b_score and score < a_score:
                    a_score = score
                    a_po = 0x06

            else:
                score = yins + zins
                if a_score <= b_score and score < b_score:
                    b_score = score
                    b_po = 0x09
                elif a_score > b_score and score < a_score:
                    a_score = score
                    a_po = 0x09

            # Decide if (0,1,1,1) is closer.
            p1 = 3 - in_sum + xins
            if a_score <= b_score and p1 < b_score:
                b_score = p1
                b_po = 0x0E
                b_is_bigger_side = False
            elif a_score > b_score and p1 < a_score:
                a_score = p1
                a_po = 0x0E
                a_is_bigger_side = False

            # Decide if (1,0,1,1) is closer.
            p2 = 3 - in_sum + yins
            if a_score <= b_score and p2 < b_score:
                b_score = p2
                b_po = 0x0D
                b_is_bigger_side = False
            elif a_score > b_score and p2 < a_score:
                a_score = p2
                a_po = 0x0D
                a_is_bigger_side = False

            # Decide if (1,1,0,1) is closer.
            p3 = 3 - in_sum + zins
            if a_score <= b_score and p3 < b_score:
                b_score = p3
                b_po = 0x0B
                b_is_bigger_side = False
            elif a_score > b_score and p3 < a_score:
                a_score = p3
                a_po = 0x0B
                a_is_bigger_side = False

            # Decide if (1,1,1,0) is closer.
            p4 = 3 - in_sum + wins
            if a_score <= b_score and p4 < b_score:
                b_po = 0x07
                b_is_bigger_side = False
            elif a_score > b_score and p4 < a_score:
                a_po = 0x07
                a_is_bigger_side = False

            # Where each of the two closest pos are determines how the extra three vertices are calculated.
            if a_is_bigger_side == b_is_bigger_side:
                if a_is_bigger_side: # Both closest pos on the bigger side
                    c1 = (a_po & b_po)
                    c2 = (a_po | b_po)

                    # Two contributions are _permutations of (0,0,0,1) and (0,0,0,2) based on c1
                    xsv_ext0 = xsv_ext1 = xsb
                    ysv_ext0 = ysv_ext1 = ysb
                    zsv_ext0 = zsv_ext1 = zsb
                    wsv_ext0 = wsv_ext1 = wsb
                    dx_ext0 = dx0 - SQUISH_CONSTANT_4D
                    dy_ext0 = dy0 - SQUISH_CONSTANT_4D
                    dz_ext0 = dz0 - SQUISH_CONSTANT_4D
                    dw_ext0 = dw0 - SQUISH_CONSTANT_4D
                    dx_ext1 = dx0 - 2 * SQUISH_CONSTANT_4D
                    dy_ext1 = dy0 - 2 * SQUISH_CONSTANT_4D
                    dz_ext1 = dz0 - 2 * SQUISH_CONSTANT_4D
                    dw_ext1 = dw0 - 2 * SQUISH_CONSTANT_4D
                    if (c1 & 0x01) != 0:
                        xsv_ext0 += 1
                        dx_ext0 -= 1
                        xsv_ext1 += 2
                        dx_ext1 -= 2
                    elif (c1 & 0x02) != 0:
                        ysv_ext0 += 1
                        dy_ext0 -= 1
                        ysv_ext1 += 2
                        dy_ext1 -= 2
                    elif (c1 & 0x04) != 0:
                        zsv_ext0 += 1
                        dz_ext0 -= 1
                        zsv_ext1 += 2
                        dz_ext1 -= 2
                    else:
                        wsv_ext0 += 1
                        dw_ext0 -= 1
                        wsv_ext1 += 2
                        dw_ext1 -= 2

                    # One contribution is a _permutation of (1,1,1,-1) based on c2
                    xsv_ext2 = xsb + 1
                    ysv_ext2 = ysb + 1
                    zsv_ext2 = zsb + 1
                    wsv_ext2 = wsb + 1
                    dx_ext2 = dx0 - 1 - 2 * SQUISH_CONSTANT_4D
                    dy_ext2 = dy0 - 1 - 2 * SQUISH_CONSTANT_4D
                    dz_ext2 = dz0 - 1 - 2 * SQUISH_CONSTANT_4D
                    dw_ext2 = dw0 - 1 - 2 * SQUISH_CONSTANT_4D
                    if (c2 & 0x01) == 0:
                        xsv_ext2 -= 2
                        dx_ext2 += 2
                    elif (c2 & 0x02) == 0:
                        ysv_ext2 -= 2
                        dy_ext2 += 2
                    elif (c2 & 0x04) == 0:
                        zsv_ext2 -= 2
                        dz_ext2 += 2
                    else:
                        wsv_ext2 -= 2
                        dw_ext2 += 2

                else: # Both closest pos on the smaller side
                    # One of the two extra pos is (1,1,1,1)
                    xsv_ext2 = xsb + 1
                    ysv_ext2 = ysb + 1
                    zsv_ext2 = zsb + 1
                    wsv_ext2 = wsb + 1
                    dx_ext2 = dx0 - 1 - 4 * SQUISH_CONSTANT_4D
                    dy_ext2 = dy0 - 1 - 4 * SQUISH_CONSTANT_4D
                    dz_ext2 = dz0 - 1 - 4 * SQUISH_CONSTANT_4D
                    dw_ext2 = dw0 - 1 - 4 * SQUISH_CONSTANT_4D

                    # Other two pos are based on the shared axes.
                    c = (a_po & b_po)
                    if (c & 0x01) != 0:
                        xsv_ext0 = xsb + 2
                        xsv_ext1 = xsb + 1
                        dx_ext0 = dx0 - 2 - 3 * SQUISH_CONSTANT_4D
                        dx_ext1 = dx0 - 1 - 3 * SQUISH_CONSTANT_4D
                    else:
                        xsv_ext0 = xsv_ext1 = xsb
                        dx_ext0 = dx_ext1 = dx0 - 3 * SQUISH_CONSTANT_4D

                    if (c & 0x02) != 0:
                        ysv_ext0 = ysv_ext1 = ysb + 1
                        dy_ext0 = dy_ext1 = dy0 - 1 - 3 * SQUISH_CONSTANT_4D
                        if (c & 0x01) == 0:
                            ysv_ext0 += 1
                            dy_ext0 -= 1
                        else:
                            ysv_ext1 += 1
                            dy_ext1 -= 1

                    else:
                        ysv_ext0 = ysv_ext1 = ysb
                        dy_ext0 = dy_ext1 = dy0 - 3 * SQUISH_CONSTANT_4D

                    if (c & 0x04) != 0:
                        zsv_ext0 = zsv_ext1 = zsb + 1
                        dz_ext0 = dz_ext1 = dz0 - 1 - 3 * SQUISH_CONSTANT_4D
                        if (c & 0x03) == 0:
                            zsv_ext0 += 1
                            dz_ext0 -= 1
                        else:
                            zsv_ext1 += 1
                            dz_ext1 -= 1

                    else:
                        zsv_ext0 = zsv_ext1 = zsb
                        dz_ext0 = dz_ext1 = dz0 - 3 * SQUISH_CONSTANT_4D

                    if (c & 0x08) != 0:
                        wsv_ext0 = wsb + 1
                        wsv_ext1 = wsb + 2
                        dw_ext0 = dw0 - 1 - 3 * SQUISH_CONSTANT_4D
                        dw_ext1 = dw0 - 2 - 3 * SQUISH_CONSTANT_4D
                    else:
                        wsv_ext0 = wsv_ext1 = wsb
                        dw_ext0 = dw_ext1 = dw0 - 3 * SQUISH_CONSTANT_4D

            else: # One po on each "side"
                if a_is_bigger_side:
                    c1 = a_po
                    c2 = b_po
                else:
                    c1 = b_po
                    c2 = a_po

                # Two contributions are the bigger-sided po with each 1 replaced with 2.
                if (c1 & 0x01) != 0:
                    xsv_ext0 = xsb + 2
                    xsv_ext1 = xsb + 1
                    dx_ext0 = dx0 - 2 - 3 * SQUISH_CONSTANT_4D
                    dx_ext1 = dx0 - 1 - 3 * SQUISH_CONSTANT_4D
                else:
                    xsv_ext0 = xsv_ext1 = xsb
                    dx_ext0 = dx_ext1 = dx0 - 3 * SQUISH_CONSTANT_4D

                if (c1 & 0x02) != 0:
                    ysv_ext0 = ysv_ext1 = ysb + 1
                    dy_ext0 = dy_ext1 = dy0 - 1 - 3 * SQUISH_CONSTANT_4D
                    if (c1 & 0x01) == 0:
                        ysv_ext0 += 1
                        dy_ext0 -= 1
                    else:
                        ysv_ext1 += 1
                        dy_ext1 -= 1

                else:
                    ysv_ext0 = ysv_ext1 = ysb
                    dy_ext0 = dy_ext1 = dy0 - 3 * SQUISH_CONSTANT_4D

                if (c1 & 0x04) != 0:
                    zsv_ext0 = zsv_ext1 = zsb + 1
                    dz_ext0 = dz_ext1 = dz0 - 1 - 3 * SQUISH_CONSTANT_4D
                    if (c1 & 0x03) == 0:
                        zsv_ext0 += 1
                        dz_ext0 -= 1
                    else:
                        zsv_ext1 += 1
                        dz_ext1 -= 1

                else:
                    zsv_ext0 = zsv_ext1 = zsb
                    dz_ext0 = dz_ext1 = dz0 - 3 * SQUISH_CONSTANT_4D

                if (c1 & 0x08) != 0:
                    wsv_ext0 = wsb + 1
                    wsv_ext1 = wsb + 2
                    dw_ext0 = dw0 - 1 - 3 * SQUISH_CONSTANT_4D
                    dw_ext1 = dw0 - 2 - 3 * SQUISH_CONSTANT_4D
                else:
                    wsv_ext0 = wsv_ext1 = wsb
                    dw_ext0 = dw_ext1 = dw0 - 3 * SQUISH_CONSTANT_4D

                # One contribution is a _permutation of (1,1,1,-1) based on the smaller-sided po
                xsv_ext2 = xsb + 1
                ysv_ext2 = ysb + 1
                zsv_ext2 = zsb + 1
                wsv_ext2 = wsb + 1
                dx_ext2 = dx0 - 1 - 2 * SQUISH_CONSTANT_4D
                dy_ext2 = dy0 - 1 - 2 * SQUISH_CONSTANT_4D
                dz_ext2 = dz0 - 1 - 2 * SQUISH_CONSTANT_4D
                dw_ext2 = dw0 - 1 - 2 * SQUISH_CONSTANT_4D
                if (c2 & 0x01) == 0:
                    xsv_ext2 -= 2
                    dx_ext2 += 2
                elif (c2 & 0x02) == 0:
                    ysv_ext2 -= 2
                    dy_ext2 += 2
                elif (c2 & 0x04) == 0:
                    zsv_ext2 -= 2
                    dz_ext2 += 2
                else:
                    wsv_ext2 -= 2
                    dw_ext2 += 2

            # Contribution (1,1,1,0)
            dx4 = dx0 - 1 - 3 * SQUISH_CONSTANT_4D
            dy4 = dy0 - 1 - 3 * SQUISH_CONSTANT_4D
            dz4 = dz0 - 1 - 3 * SQUISH_CONSTANT_4D
            dw4 = dw0 - 3 * SQUISH_CONSTANT_4D
            attn4 = 2 - dx4 * dx4 - dy4 * dy4 - dz4 * dz4 - dw4 * dw4
            if attn4 > 0:
                attn4 *= attn4
                value += attn4 * attn4 * extrapolate(xsb + 1, ysb + 1, zsb + 1, wsb + 0, dx4, dy4, dz4, dw4)

            # Contribution (1,1,0,1)
            dx3 = dx4
            dy3 = dy4
            dz3 = dz0 - 3 * SQUISH_CONSTANT_4D
            dw3 = dw0 - 1 - 3 * SQUISH_CONSTANT_4D
            attn3 = 2 - dx3 * dx3 - dy3 * dy3 - dz3 * dz3 - dw3 * dw3
            if attn3 > 0:
                attn3 *= attn3
                value += attn3 * attn3 * extrapolate(xsb + 1, ysb + 1, zsb + 0, wsb + 1, dx3, dy3, dz3, dw3)

            # Contribution (1,0,1,1)
            dx2 = dx4
            dy2 = dy0 - 3 * SQUISH_CONSTANT_4D
            dz2 = dz4
            dw2 = dw3
            attn2 = 2 - dx2 * dx2 - dy2 * dy2 - dz2 * dz2 - dw2 * dw2
            if attn2 > 0:
                attn2 *= attn2
                value += attn2 * attn2 * extrapolate(xsb + 1, ysb + 0, zsb + 1, wsb + 1, dx2, dy2, dz2, dw2)

            # Contribution (0,1,1,1)
            dx1 = dx0 - 3 * SQUISH_CONSTANT_4D
            dz1 = dz4
            dy1 = dy4
            dw1 = dw3
            attn1 = 2 - dx1 * dx1 - dy1 * dy1 - dz1 * dz1 - dw1 * dw1
            if attn1 > 0:
                attn1 *= attn1
                value += attn1 * attn1 * extrapolate(xsb + 0, ysb + 1, zsb + 1, wsb + 1, dx1, dy1, dz1, dw1)

            # Contribution (1,1,0,0)
            dx5 = dx0 - 1 - 2 * SQUISH_CONSTANT_4D
            dy5 = dy0 - 1 - 2 * SQUISH_CONSTANT_4D
            dz5 = dz0 - 0 - 2 * SQUISH_CONSTANT_4D
            dw5 = dw0 - 0 - 2 * SQUISH_CONSTANT_4D
            attn5 = 2 - dx5 * dx5 - dy5 * dy5 - dz5 * dz5 - dw5 * dw5
            if attn5 > 0:
                attn5 *= attn5
                value += attn5 * attn5 * extrapolate(xsb + 1, ysb + 1, zsb + 0, wsb + 0, dx5, dy5, dz5, dw5)

            # Contribution (1,0,1,0)
            dx6 = dx0 - 1 - 2 * SQUISH_CONSTANT_4D
            dy6 = dy0 - 0 - 2 * SQUISH_CONSTANT_4D
            dz6 = dz0 - 1 - 2 * SQUISH_CONSTANT_4D
            dw6 = dw0 - 0 - 2 * SQUISH_CONSTANT_4D
            attn6 = 2 - dx6 * dx6 - dy6 * dy6 - dz6 * dz6 - dw6 * dw6
            if attn6 > 0:
                attn6 *= attn6
                value += attn6 * attn6 * extrapolate(xsb + 1, ysb + 0, zsb + 1, wsb + 0, dx6, dy6, dz6, dw6)

            # Contribution (1,0,0,1)
            dx7 = dx0 - 1 - 2 * SQUISH_CONSTANT_4D
            dy7 = dy0 - 0 - 2 * SQUISH_CONSTANT_4D
            dz7 = dz0 - 0 - 2 * SQUISH_CONSTANT_4D
            dw7 = dw0 - 1 - 2 * SQUISH_CONSTANT_4D
            attn7 = 2 - dx7 * dx7 - dy7 * dy7 - dz7 * dz7 - dw7 * dw7
            if attn7 > 0:
                attn7 *= attn7
                value += attn7 * attn7 * extrapolate(xsb + 1, ysb + 0, zsb + 0, wsb + 1, dx7, dy7, dz7, dw7)

            # Contribution (0,1,1,0)
            dx8 = dx0 - 0 - 2 * SQUISH_CONSTANT_4D
            dy8 = dy0 - 1 - 2 * SQUISH_CONSTANT_4D
            dz8 = dz0 - 1 - 2 * SQUISH_CONSTANT_4D
            dw8 = dw0 - 0 - 2 * SQUISH_CONSTANT_4D
            attn8 = 2 - dx8 * dx8 - dy8 * dy8 - dz8 * dz8 - dw8 * dw8
            if attn8 > 0:
                attn8 *= attn8
                value += attn8 * attn8 * extrapolate(xsb + 0, ysb + 1, zsb + 1, wsb + 0, dx8, dy8, dz8, dw8)

            # Contribution (0,1,0,1)
            dx9 = dx0 - 0 - 2 * SQUISH_CONSTANT_4D
            dy9 = dy0 - 1 - 2 * SQUISH_CONSTANT_4D
            dz9 = dz0 - 0 - 2 * SQUISH_CONSTANT_4D
            dw9 = dw0 - 1 - 2 * SQUISH_CONSTANT_4D
            attn9 = 2 - dx9 * dx9 - dy9 * dy9 - dz9 * dz9 - dw9 * dw9
            if attn9 > 0:
                attn9 *= attn9
                value += attn9 * attn9 * extrapolate(xsb + 0, ysb + 1, zsb + 0, wsb + 1, dx9, dy9, dz9, dw9)

            # Contribution (0,0,1,1)
            dx10 = dx0 - 0 - 2 * SQUISH_CONSTANT_4D
            dy10 = dy0 - 0 - 2 * SQUISH_CONSTANT_4D
            dz10 = dz0 - 1 - 2 * SQUISH_CONSTANT_4D
            dw10 = dw0 - 1 - 2 * SQUISH_CONSTANT_4D
            attn10 = 2 - dx10 * dx10 - dy10 * dy10 - dz10 * dz10 - dw10 * dw10
            if attn10 > 0:
                attn10 *= attn10
                value += attn10 * attn10 * extrapolate(xsb + 0, ysb + 0, zsb + 1, wsb + 1, dx10, dy10, dz10, dw10)

        # First extra vertex
        attn_ext0 = 2 - dx_ext0 * dx_ext0 - dy_ext0 * dy_ext0 - dz_ext0 * dz_ext0 - dw_ext0 * dw_ext0
        if attn_ext0 > 0:
            attn_ext0 *= attn_ext0
            value += attn_ext0 * attn_ext0 * extrapolate(xsv_ext0, ysv_ext0, zsv_ext0, wsv_ext0, dx_ext0, dy_ext0, dz_ext0, dw_ext0)

        # Second extra vertex
        attn_ext1 = 2 - dx_ext1 * dx_ext1 - dy_ext1 * dy_ext1 - dz_ext1 * dz_ext1 - dw_ext1 * dw_ext1
        if attn_ext1 > 0:
            attn_ext1 *= attn_ext1
            value += attn_ext1 * attn_ext1 * extrapolate(xsv_ext1, ysv_ext1, zsv_ext1, wsv_ext1, dx_ext1, dy_ext1, dz_ext1, dw_ext1)

        # Third extra vertex
        attn_ext2 = 2 - dx_ext2 * dx_ext2 - dy_ext2 * dy_ext2 - dz_ext2 * dz_ext2 - dw_ext2 * dw_ext2
        if attn_ext2 > 0:
            attn_ext2 *= attn_ext2
            value += attn_ext2 * attn_ext2 * extrapolate(xsv_ext2, ysv_ext2, zsv_ext2, wsv_ext2, dx_ext2, dy_ext2, dz_ext2, dw_ext2)

        return value / NORM_CONSTANT_4D

Response: Generate 4D OpenSimplex noise from X Y Z W coordinates.


Instruction:
Implement a function in Python 3 to
adjust the contrast of the current image by scaling each pixel value to 255 and scaling each pixel value to gamma.

Response:
def adjust_contrast_gamma(arr, gamma):
    """
    Adjust contrast by scaling each pixel value to ``255 * ((I_ij/255)**gamma)``.

    dtype support::

        * ``uint8``: yes; fully tested (1) (2) (3)
        * ``uint16``: yes; tested (2) (3)
        * ``uint32``: yes; tested (2) (3)
        * ``uint64``: yes; tested (2) (3) (4)
        * ``int8``: limited; tested (2) (3) (5)
        * ``int16``: limited; tested (2) (3) (5)
        * ``int32``: limited; tested (2) (3) (5)
        * ``int64``: limited; tested (2) (3) (4) (5)
        * ``float16``: limited; tested (5)
        * ``float32``: limited; tested (5)
        * ``float64``: limited; tested (5)
        * ``float128``: no (6)
        * ``bool``: no (7)

        - (1) Handled by ``cv2``. Other dtypes are handled by ``skimage``.
        - (2) Normalization is done as ``I_ij/max``, where ``max`` is the maximum value of the
              dtype, e.g. 255 for ``uint8``. The normalization is reversed afterwards,
              e.g. ``result*255`` for ``uint8``.
        - (3) Integer-like values are not rounded after applying the contrast adjustment equation
              (before inverting the normalization to 0.0-1.0 space), i.e. projection from continuous
              space to discrete happens according to floor function.
        - (4) Note that scikit-image doc says that integers are converted to ``float64`` values before
              applying the contrast normalization method. This might lead to inaccuracies for large
              64bit integer values. Tests showed no indication of that happening though.
        - (5) Must not contain negative values. Values >=0 are fully supported.
        - (6) Leads to error in scikit-image.
        - (7) Does not make sense for contrast adjustments.

    Parameters
    ----------
    arr : numpy.ndarray
        Array for which to adjust the contrast. Dtype ``uint8`` is fastest.

    gamma : number
        Exponent for the contrast adjustment. Higher values darken the image.

    Returns
    -------
    numpy.ndarray
        Array with adjusted contrast.

    """
    # int8 is also possible according to docs
    # https://docs.opencv.org/3.0-beta/modules/core/doc/operations_on_arrays.html#cv2.LUT , but here it seemed
    # like `d` was 0 for CV_8S, causing that to fail
    if arr.dtype.name == "uint8":
        min_value, _center_value, max_value = iadt.get_value_range_of_dtype(arr.dtype)
        dynamic_range = max_value - min_value

        value_range = np.linspace(0, 1.0, num=dynamic_range+1, dtype=np.float32)
        # 255 * ((I_ij/255)**gamma)
        # using np.float32(.) here still works when the input is a numpy array of size 1
        table = (min_value + (value_range ** np.float32(gamma)) * dynamic_range)
        arr_aug = cv2.LUT(arr, np.clip(table, min_value, max_value).astype(arr.dtype))
        if arr.ndim == 3 and arr_aug.ndim == 2:
            return arr_aug[..., np.newaxis]
        return arr_aug
    else:
        return ski_exposure.adjust_gamma(arr, gamma)


Instruction:
How would you explain what the following Python 3 function does
def adjust_contrast_sigmoid(arr, gain, cutoff):
    # int8 is also possible according to docs
    # https://docs.opencv.org/3.0-beta/modules/core/doc/operations_on_arrays.html#cv2.LUT , but here it seemed
    # like `d` was 0 for CV_8S, causing that to fail
    if arr.dtype.name == "uint8":
        min_value, _center_value, max_value = iadt.get_value_range_of_dtype(arr.dtype)
        dynamic_range = max_value - min_value

        value_range = np.linspace(0, 1.0, num=dynamic_range+1, dtype=np.float32)
        # 255 * 1/(1 + exp(gain*(cutoff - I_ij/255)))
        # using np.float32(.) here still works when the input is a numpy array of size 1
        gain = np.float32(gain)
        cutoff = np.float32(cutoff)
        table = min_value + dynamic_range * 1/(1 + np.exp(gain * (cutoff - value_range)))
        arr_aug = cv2.LUT(arr, np.clip(table, min_value, max_value).astype(arr.dtype))
        if arr.ndim == 3 and arr_aug.ndim == 2:
            return arr_aug[..., np.newaxis]
        return arr_aug
    else:
        return ski_exposure.adjust_sigmoid(arr, cutoff=cutoff, gain=gain)

Response: Adjusts the contrast of the current image by scaling each pixel value to 1 - exp ( gain * cutoff - I_ij


Instruction:
Can you write a function in Python 3 where it
adjusts the contrast of the current image by scaling each pixel value to gain log_2.

Response:
def adjust_contrast_log(arr, gain):
    """
    Adjust contrast by scaling each pixel value to ``255 * gain * log_2(1 + I_ij/255)``.

    dtype support::

        * ``uint8``: yes; fully tested (1) (2) (3)
        * ``uint16``: yes; tested (2) (3)
        * ``uint32``: yes; tested (2) (3)
        * ``uint64``: yes; tested (2) (3) (4)
        * ``int8``: limited; tested (2) (3) (5)
        * ``int16``: limited; tested (2) (3) (5)
        * ``int32``: limited; tested (2) (3) (5)
        * ``int64``: limited; tested (2) (3) (4) (5)
        * ``float16``: limited; tested (5)
        * ``float32``: limited; tested (5)
        * ``float64``: limited; tested (5)
        * ``float128``: no (6)
        * ``bool``: no (7)

        - (1) Handled by ``cv2``. Other dtypes are handled by ``skimage``.
        - (2) Normalization is done as ``I_ij/max``, where ``max`` is the maximum value of the
              dtype, e.g. 255 for ``uint8``. The normalization is reversed afterwards,
              e.g. ``result*255`` for ``uint8``.
        - (3) Integer-like values are not rounded after applying the contrast adjustment equation
              (before inverting the normalization to 0.0-1.0 space), i.e. projection from continuous
              space to discrete happens according to floor function.
        - (4) Note that scikit-image doc says that integers are converted to ``float64`` values before
              applying the contrast normalization method. This might lead to inaccuracies for large
              64bit integer values. Tests showed no indication of that happening though.
        - (5) Must not contain negative values. Values >=0 are fully supported.
        - (6) Leads to error in scikit-image.
        - (7) Does not make sense for contrast adjustments.

    Parameters
    ----------
    arr : numpy.ndarray
        Array for which to adjust the contrast. Dtype ``uint8`` is fastest.

    gain : number
        Multiplier for the logarithm result. Values around 1.0 lead to a contrast-adjusted
        images. Values above 1.0 quickly lead to partially broken images due to exceeding the
        datatype's value range.

    Returns
    -------
    numpy.ndarray
        Array with adjusted contrast.

    """
    # int8 is also possible according to docs
    # https://docs.opencv.org/3.0-beta/modules/core/doc/operations_on_arrays.html#cv2.LUT , but here it seemed
    # like `d` was 0 for CV_8S, causing that to fail
    if arr.dtype.name == "uint8":
        min_value, _center_value, max_value = iadt.get_value_range_of_dtype(arr.dtype)
        dynamic_range = max_value - min_value

        value_range = np.linspace(0, 1.0, num=dynamic_range+1, dtype=np.float32)
        # 255 * 1/(1 + exp(gain*(cutoff - I_ij/255)))
        # using np.float32(.) here still works when the input is a numpy array of size 1
        gain = np.float32(gain)
        table = min_value + dynamic_range * gain * np.log2(1 + value_range)
        arr_aug = cv2.LUT(arr, np.clip(table, min_value, max_value).astype(arr.dtype))
        if arr.ndim == 3 and arr_aug.ndim == 2:
            return arr_aug[..., np.newaxis]
        return arr_aug
    else:
        return ski_exposure.adjust_log(arr, gain=gain)


Instruction:
Implement a function in Python 3 to
adjust the contrast of a set of images in a new node.

Response:
def adjust_contrast_linear(arr, alpha):
    """Adjust contrast by scaling each pixel value to ``127 + alpha*(I_ij-127)``.

    dtype support::

        * ``uint8``: yes; fully tested (1) (2)
        * ``uint16``: yes; tested (2)
        * ``uint32``: yes; tested (2)
        * ``uint64``: no (3)
        * ``int8``: yes; tested (2)
        * ``int16``: yes; tested (2)
        * ``int32``: yes; tested (2)
        * ``int64``: no (2)
        * ``float16``: yes; tested (2)
        * ``float32``: yes; tested (2)
        * ``float64``: yes; tested (2)
        * ``float128``: no (2)
        * ``bool``: no (4)

        - (1) Handled by ``cv2``. Other dtypes are handled by raw ``numpy``.
        - (2) Only tested for reasonable alphas with up to a value of around 100.
        - (3) Conversion to ``float64`` is done during augmentation, hence ``uint64``, ``int64``,
              and ``float128`` support cannot be guaranteed.
        - (4) Does not make sense for contrast adjustments.

    Parameters
    ----------
    arr : numpy.ndarray
        Array for which to adjust the contrast. Dtype ``uint8`` is fastest.

    alpha : number
        Multiplier to linearly pronounce (>1.0), dampen (0.0 to 1.0) or invert (<0.0) the
        difference between each pixel value and the center value, e.g. ``127`` for ``uint8``.

    Returns
    -------
    numpy.ndarray
        Array with adjusted contrast.

    """
    # int8 is also possible according to docs
    # https://docs.opencv.org/3.0-beta/modules/core/doc/operations_on_arrays.html#cv2.LUT , but here it seemed
    # like `d` was 0 for CV_8S, causing that to fail
    if arr.dtype.name == "uint8":
        min_value, center_value, max_value = iadt.get_value_range_of_dtype(arr.dtype)

        value_range = np.arange(0, 256, dtype=np.float32)
        # 127 + alpha*(I_ij-127)
        # using np.float32(.) here still works when the input is a numpy array of size 1
        alpha = np.float32(alpha)
        table = center_value + alpha * (value_range - center_value)
        arr_aug = cv2.LUT(arr, np.clip(table, min_value, max_value).astype(arr.dtype))
        if arr.ndim == 3 and arr_aug.ndim == 2:
            return arr_aug[..., np.newaxis]
        return arr_aug
    else:
        input_dtype = arr.dtype
        _min_value, center_value, _max_value = iadt.get_value_range_of_dtype(input_dtype)
        if input_dtype.kind in ["u", "i"]:
            center_value = int(center_value)
        image_aug = center_value + alpha * (arr.astype(np.float64)-center_value)
        image_aug = iadt.restore_dtypes_(image_aug, input_dtype)
        return image_aug


Instruction:
Create a Python 3 function to
adjust contrast by scaling each pixel value to ``255 * ((I_ij/255)**gamma)``. Values in the range ``gamma=(0.5, 2.0)`` seem to be sensible. dtype support:: See :func:`imgaug.augmenters.contrast.adjust_contrast_gamma`. Parameters ---------- gamma : number or tuple of number or list of number or imgaug.parameters.StochasticParameter, optional Exponent for the contrast adjustment. Higher values darken the image. * If a number, then that value will be used for all images. * If a tuple ``(a, b)``, then a value from the range ``[a, b]`` will be used per image. * If a list, then a random value will be sampled from that list per image. * If a StochasticParameter, then a value will be sampled per image from that parameter. per_channel : bool or float, optional Whether to use the same value for all channels (False) or to sample a new value for each channel (True). If this value is a float ``p``, then for ``p`` percent of all images `per_channel` will be treated as True, otherwise as False. name : None or str, optional See :func:`imgaug.augmenters.meta.Augmenter.__init__`. deterministic : bool, optional See :func:`imgaug.augmenters.meta.Augmenter.__init__`. random_state : None or int or numpy.random.RandomState, optional See :func:`imgaug.augmenters.meta.Augmenter.__init__`. Returns ------- _ContrastFuncWrapper Augmenter to perform gamma contrast adjustment.

Response:
def GammaContrast(gamma=1, per_channel=False, name=None, deterministic=False, random_state=None):
    """
    Adjust contrast by scaling each pixel value to ``255 * ((I_ij/255)**gamma)``.

    Values in the range ``gamma=(0.5, 2.0)`` seem to be sensible.

    dtype support::

        See :func:`imgaug.augmenters.contrast.adjust_contrast_gamma`.

    Parameters
    ----------
    gamma : number or tuple of number or list of number or imgaug.parameters.StochasticParameter, optional
        Exponent for the contrast adjustment. Higher values darken the image.

            * If a number, then that value will be used for all images.
            * If a tuple ``(a, b)``, then a value from the range ``[a, b]`` will be used per image.
            * If a list, then a random value will be sampled from that list per image.
            * If a StochasticParameter, then a value will be sampled per image from that parameter.

    per_channel :  bool or float, optional
        Whether to use the same value for all channels (False) or to sample a new value for each
        channel (True). If this value is a float ``p``, then for ``p`` percent of all images `per_channel`
        will be treated as True, otherwise as False.

    name : None or str, optional
        See :func:`imgaug.augmenters.meta.Augmenter.__init__`.

    deterministic : bool, optional
        See :func:`imgaug.augmenters.meta.Augmenter.__init__`.

    random_state : None or int or numpy.random.RandomState, optional
        See :func:`imgaug.augmenters.meta.Augmenter.__init__`.

    Returns
    -------
    _ContrastFuncWrapper
        Augmenter to perform gamma contrast adjustment.

    """
    params1d = [iap.handle_continuous_param(gamma, "gamma", value_range=None, tuple_to_uniform=True,
                                            list_to_choice=True)]
    func = adjust_contrast_gamma
    return _ContrastFuncWrapper(
        func, params1d, per_channel,
        dtypes_allowed=["uint8", "uint16", "uint32", "uint64",
                        "int8", "int16", "int32", "int64",
                        "float16", "float32", "float64"],
        dtypes_disallowed=["float96", "float128", "float256", "bool"],
        name=name if name is not None else ia.caller_name(),
        deterministic=deterministic,
        random_state=random_state
    )


Instruction:
Implement a Python 3 function for
returning a new structure of the sigmoid contrast for the given set of images.

Response:
def SigmoidContrast(gain=10, cutoff=0.5, per_channel=False, name=None, deterministic=False, random_state=None):
    """
    Adjust contrast by scaling each pixel value to ``255 * 1/(1 + exp(gain*(cutoff - I_ij/255)))``.

    Values in the range ``gain=(5, 20)`` and ``cutoff=(0.25, 0.75)`` seem to be sensible.

    dtype support::

        See :func:`imgaug.augmenters.contrast.adjust_contrast_sigmoid`.

    Parameters
    ----------
    gain : number or tuple of number or list of number or imgaug.parameters.StochasticParameter, optional
        Multiplier for the sigmoid function's output.
        Higher values lead to quicker changes from dark to light pixels.

            * If a number, then that value will be used for all images.
            * If a tuple ``(a, b)``, then a value from the range ``[a, b]`` will be used per image.
            * If a list, then a random value will be sampled from that list per image.
            * If a StochasticParameter, then a value will be sampled per image from that parameter.

    cutoff : number or tuple of number or list of number or imgaug.parameters.StochasticParameter, optional
        Cutoff that shifts the sigmoid function in horizontal direction.
        Higher values mean that the switch from dark to light pixels happens later, i.e.
        the pixels will remain darker.

            * If a number, then that value will be used for all images.
            * If a tuple ``(a, b)``, then a value from the range ``[a, b]`` will be used per image.
            * If a list, then a random value will be sampled from that list per image.
            * If a StochasticParameter, then a value will be sampled per image from that parameter.

    per_channel :  bool or float, optional
        Whether to use the same value for all channels (False) or to sample a new value for each
        channel (True). If this value is a float ``p``, then for ``p`` percent of all images `per_channel`
        will be treated as True, otherwise as False.

    name : None or str, optional
        See :func:`imgaug.augmenters.meta.Augmenter.__init__`.

    deterministic : bool, optional
        See :func:`imgaug.augmenters.meta.Augmenter.__init__`.

    random_state : None or int or numpy.random.RandomState, optional
        See :func:`imgaug.augmenters.meta.Augmenter.__init__`.

    Returns
    -------
    _ContrastFuncWrapper
        Augmenter to perform sigmoid contrast adjustment.

    """
    # TODO add inv parameter?
    params1d = [
        iap.handle_continuous_param(gain, "gain", value_range=(0, None), tuple_to_uniform=True, list_to_choice=True),
        iap.handle_continuous_param(cutoff, "cutoff", value_range=(0, 1.0), tuple_to_uniform=True, list_to_choice=True)
    ]
    func = adjust_contrast_sigmoid
    return _ContrastFuncWrapper(
        func, params1d, per_channel,
        dtypes_allowed=["uint8", "uint16", "uint32", "uint64",
                        "int8", "int16", "int32", "int64",
                        "float16", "float32", "float64"],
        dtypes_disallowed=["float96", "float128", "float256", "bool"],
        name=name if name is not None else ia.caller_name(),
        deterministic=deterministic,
        random_state=random_state
    )


Instruction:
Create a Python 3 function for
adjusting contrast by scaling each pixel value to ``255 * gain * log_2(1 + I_ij/255)``. dtype support:: See :func:`imgaug.augmenters.contrast.adjust_contrast_log`. Parameters ---------- gain : number or tuple of number or list of number or imgaug.parameters.StochasticParameter, optional Multiplier for the logarithm result. Values around 1.0 lead to a contrast-adjusted images. Values above 1.0 quickly lead to partially broken images due to exceeding the datatype's value range. * If a number, then that value will be used for all images. * If a tuple ``(a, b)``, then a value from the range ``[a, b]`` will be used per image. * If a list, then a random value will be sampled from that list per image. * If a StochasticParameter, then a value will be sampled per image from that parameter. per_channel : bool or float, optional Whether to use the same value for all channels (False) or to sample a new value for each channel (True). If this value is a float ``p``, then for ``p`` percent of all images `per_channel` will be treated as True, otherwise as False. name : None or str, optional See :func:`imgaug.augmenters.meta.Augmenter.__init__`. deterministic : bool, optional See :func:`imgaug.augmenters.meta.Augmenter.__init__`. random_state : None or int or numpy.random.RandomState, optional See :func:`imgaug.augmenters.meta.Augmenter.__init__`. Returns ------- _ContrastFuncWrapper Augmenter to perform logarithmic contrast adjustment.

Response:
def LogContrast(gain=1, per_channel=False, name=None, deterministic=False, random_state=None):
    """
    Adjust contrast by scaling each pixel value to ``255 * gain * log_2(1 + I_ij/255)``.

    dtype support::

        See :func:`imgaug.augmenters.contrast.adjust_contrast_log`.

    Parameters
    ----------
    gain : number or tuple of number or list of number or imgaug.parameters.StochasticParameter, optional
        Multiplier for the logarithm result. Values around 1.0 lead to a contrast-adjusted
        images. Values above 1.0 quickly lead to partially broken images due to exceeding the
        datatype's value range.

            * If a number, then that value will be used for all images.
            * If a tuple ``(a, b)``, then a value from the range ``[a, b]`` will be used per image.
            * If a list, then a random value will be sampled from that list per image.
            * If a StochasticParameter, then a value will be sampled per image from that parameter.

    per_channel :  bool or float, optional
        Whether to use the same value for all channels (False) or to sample a new value for each
        channel (True). If this value is a float ``p``, then for ``p`` percent of all images `per_channel`
        will be treated as True, otherwise as False.

    name : None or str, optional
        See :func:`imgaug.augmenters.meta.Augmenter.__init__`.

    deterministic : bool, optional
        See :func:`imgaug.augmenters.meta.Augmenter.__init__`.

    random_state : None or int or numpy.random.RandomState, optional
        See :func:`imgaug.augmenters.meta.Augmenter.__init__`.

    Returns
    -------
    _ContrastFuncWrapper
        Augmenter to perform logarithmic contrast adjustment.

    """
    # TODO add inv parameter?
    params1d = [iap.handle_continuous_param(gain, "gain", value_range=(0, None), tuple_to_uniform=True,
                                            list_to_choice=True)]
    func = adjust_contrast_log
    return _ContrastFuncWrapper(
        func, params1d, per_channel,
        dtypes_allowed=["uint8", "uint16", "uint32", "uint64",
                        "int8", "int16", "int32", "int64",
                        "float16", "float32", "float64"],
        dtypes_disallowed=["float96", "float128", "float256", "bool"],
        name=name if name is not None else ia.caller_name(),
        deterministic=deterministic,
        random_state=random_state
    )


Instruction:
Write a Python 3 script for
adjusting contrast by scaling each pixel value to ``127 + alpha*(I_ij-127)``. dtype support:: See :func:`imgaug.augmenters.contrast.adjust_contrast_linear`. Parameters ---------- alpha : number or tuple of number or list of number or imgaug.parameters.StochasticParameter, optional Multiplier to linearly pronounce (>1.0), dampen (0.0 to 1.0) or invert (<0.0) the difference between each pixel value and the center value, e.g. ``127`` for ``uint8``. * If a number, then that value will be used for all images. * If a tuple ``(a, b)``, then a value from the range ``[a, b]`` will be used per image. * If a list, then a random value will be sampled from that list per image. * If a StochasticParameter, then a value will be sampled per image from that parameter. per_channel : bool or float, optional Whether to use the same value for all channels (False) or to sample a new value for each channel (True). If this value is a float ``p``, then for ``p`` percent of all images `per_channel` will be treated as True, otherwise as False. name : None or str, optional See :func:`imgaug.augmenters.meta.Augmenter.__init__`. deterministic : bool, optional See :func:`imgaug.augmenters.meta.Augmenter.__init__`. random_state : None or int or numpy.random.RandomState, optional See :func:`imgaug.augmenters.meta.Augmenter.__init__`. Returns ------- _ContrastFuncWrapper Augmenter to perform contrast adjustment by linearly scaling the distance to 128.

Response:
def LinearContrast(alpha=1, per_channel=False, name=None, deterministic=False, random_state=None):
    """Adjust contrast by scaling each pixel value to ``127 + alpha*(I_ij-127)``.

    dtype support::

        See :func:`imgaug.augmenters.contrast.adjust_contrast_linear`.

    Parameters
    ----------
    alpha : number or tuple of number or list of number or imgaug.parameters.StochasticParameter, optional
        Multiplier to linearly pronounce (>1.0), dampen (0.0 to 1.0) or invert (<0.0) the
        difference between each pixel value and the center value, e.g. ``127`` for ``uint8``.

            * If a number, then that value will be used for all images.
            * If a tuple ``(a, b)``, then a value from the range ``[a, b]`` will be used per image.
            * If a list, then a random value will be sampled from that list per image.
            * If a StochasticParameter, then a value will be sampled per image from that parameter.

    per_channel :  bool or float, optional
        Whether to use the same value for all channels (False) or to sample a new value for each
        channel (True). If this value is a float ``p``, then for ``p`` percent of all images `per_channel`
        will be treated as True, otherwise as False.

    name : None or str, optional
        See :func:`imgaug.augmenters.meta.Augmenter.__init__`.

    deterministic : bool, optional
        See :func:`imgaug.augmenters.meta.Augmenter.__init__`.

    random_state : None or int or numpy.random.RandomState, optional
        See :func:`imgaug.augmenters.meta.Augmenter.__init__`.

    Returns
    -------
    _ContrastFuncWrapper
        Augmenter to perform contrast adjustment by linearly scaling the distance to 128.

    """
    params1d = [
        iap.handle_continuous_param(alpha, "alpha", value_range=None, tuple_to_uniform=True, list_to_choice=True)
    ]
    func = adjust_contrast_linear
    return _ContrastFuncWrapper(
        func, params1d, per_channel,
        dtypes_allowed=["uint8", "uint16", "uint32",
                        "int8", "int16", "int32",
                        "float16", "float32", "float64"],
        dtypes_disallowed=["uint64", "int64", "float96", "float128", "float256", "bool"],
        name=name if name is not None else ia.caller_name(),
        deterministic=deterministic,
        random_state=random_state
    )


Instruction:
Can you write a function in Python 3 where it
converts images to another colorspace.

Response:
def InColorspace(to_colorspace, from_colorspace="RGB", children=None, name=None, deterministic=False,
                 random_state=None):
    """Convert images to another colorspace."""
    return WithColorspace(to_colorspace, from_colorspace, children, name, deterministic, random_state)


Instruction:
Write a Python 3 function that can
get the height of a bounding box encapsulating the line.

Response:
def height(self):
        """Get the height of a bounding box encapsulating the line."""
        if len(self.coords) <= 1:
            return 0
        return np.max(self.yy) - np.min(self.yy)


Instruction:
Can you generate a brief explanation for the following Python 3 code
def width(self):
        if len(self.coords) <= 1:
            return 0
        return np.max(self.xx) - np.min(self.xx)

Response: Get the width of a bounding box encapsulating the line.


Instruction:
How would you explain what the following Python 3 function does
def get_pointwise_inside_image_mask(self, image):
        if len(self.coords) == 0:
            return np.zeros((0,), dtype=bool)
        shape = normalize_shape(image)
        height, width = shape[0:2]
        x_within = np.logical_and(0 <= self.xx, self.xx < width)
        y_within = np.logical_and(0 <= self.yy, self.yy < height)
        return np.logical_and(x_within, y_within)

Response: Returns a boolean array with one value per point indicating whether the point is inside of the image plane.


Instruction:
Explain what the following Python 3 code does
def compute_neighbour_distances(self):
        if len(self.coords) <= 1:
            return np.zeros((0,), dtype=np.float32)
        return np.sqrt(
            np.sum(
                (self.coords[:-1, :] - self.coords[1:, :]) ** 2,
                axis=1
            )
        )

Response: Compute the euclidean distance between each two consecutive point and each other point.


Instruction:
Implement a Python 3 function for
computing the minimal distance between each point on self and other.

Response:
def compute_pointwise_distances(self, other, default=None):
        """
        Compute the minimal distance between each point on self and other.

        Parameters
        ----------
        other : tuple of number \
                or imgaug.augmentables.kps.Keypoint \
                or imgaug.augmentables.LineString
            Other object to which to compute the distances.

        default
            Value to return if `other` contains no points.

        Returns
        -------
        list of float
            Distances to `other` or `default` if not distance could be computed.

        """
        import shapely.geometry
        from .kps import Keypoint

        if isinstance(other, Keypoint):
            other = shapely.geometry.Point((other.x, other.y))
        elif isinstance(other, LineString):
            if len(other.coords) == 0:
                return default
            elif len(other.coords) == 1:
                other = shapely.geometry.Point(other.coords[0, :])
            else:
                other = shapely.geometry.LineString(other.coords)
        elif isinstance(other, tuple):
            assert len(other) == 2
            other = shapely.geometry.Point(other)
        else:
            raise ValueError(
                ("Expected Keypoint or LineString or tuple (x,y), "
                 + "got type %s.") % (type(other),))

        return [shapely.geometry.Point(point).distance(other)
                for point in self.coords]


Instruction:
Write a Python 3 function for
computing the minimal distance between this line string and other.

Response:
def compute_distance(self, other, default=None):
        """
        Compute the minimal distance between the line string and `other`.

        Parameters
        ----------
        other : tuple of number \
                or imgaug.augmentables.kps.Keypoint \
                or imgaug.augmentables.LineString
            Other object to which to compute the distance.

        default
            Value to return if this line string or `other` contain no points.

        Returns
        -------
        float
            Distance to `other` or `default` if not distance could be computed.

        """
        # FIXME this computes distance pointwise, does not have to be identical
        #       with the actual min distance (e.g. edge center to other's point)
        distances = self.compute_pointwise_distances(other, default=[])
        if len(distances) == 0:
            return default
        return min(distances)


Instruction:
Implement a function in Python 3 to
return True if the bounding box contains the point other.

Response:
def contains(self, other, max_distance=1e-4):
        """
        Estimate whether the bounding box contains a point.

        Parameters
        ----------
        other : tuple of number or imgaug.augmentables.kps.Keypoint
            Point to check for.

        max_distance : float
            Maximum allowed euclidean distance between the point and the
            closest point on the line. If the threshold is exceeded, the point
            is not considered to be contained in the line.

        Returns
        -------
        bool
            True if the point is contained in the line string, False otherwise.
            It is contained if its distance to the line or any of its points
            is below a threshold.

        """
        return self.compute_distance(other, default=np.inf) < max_distance


Instruction:
Make a summary of the following Python 3 code
def project(self, from_shape, to_shape):
        coords_proj = project_coords(self.coords, from_shape, to_shape)
        return self.copy(coords=coords_proj)

Response: Project the line string onto a differently shaped image.


Instruction:
Can you generate a brief explanation for the following Python 3 code
def is_fully_within_image(self, image, default=False):
        if len(self.coords) == 0:
            return default
        return np.all(self.get_pointwise_inside_image_mask(image))

Response: Return True if the line string is fully inside the image area.


Instruction:
Explain what the following Python 3 code does
def is_partly_within_image(self, image, default=False):
        if len(self.coords) == 0:
            return default
        # check mask first to avoid costly computation of intersection points
        # whenever possible
        mask = self.get_pointwise_inside_image_mask(image)
        if np.any(mask):
            return True
        return len(self.clip_out_of_image(image)) > 0

Response: Return True if the line string is at least partially inside the image area.


Instruction:
Given the following Python 3 function, write the documentation
def is_out_of_image(self, image, fully=True, partly=False, default=True):
        if len(self.coords) == 0:
            return default

        if self.is_fully_within_image(image):
            return False
        elif self.is_partly_within_image(image):
            return partly
        else:
            return fully

Response: Return True if the line is partially outside of the image area.


Instruction:
Can you tell what is the following Python 3 function doing
def clip_out_of_image(self, image):
        if len(self.coords) == 0:
            return []

        inside_image_mask = self.get_pointwise_inside_image_mask(image)
        ooi_mask = ~inside_image_mask

        if len(self.coords) == 1:
            if not np.any(inside_image_mask):
                return []
            return [self.copy()]

        if np.all(inside_image_mask):
            return [self.copy()]

        # top, right, bottom, left image edges
        # we subtract eps here, because intersection() works inclusively,
        # i.e. not subtracting eps would be equivalent to 0<=x<=C for C being
        # height or width
        # don't set the eps too low, otherwise points at height/width seem
        # to get rounded to height/width by shapely, which can cause problems
        # when first clipping and then calling is_fully_within_image()
        # returning false
        height, width = normalize_shape(image)[0:2]
        eps = 1e-3
        edges = [
            LineString([(0.0, 0.0), (width - eps, 0.0)]),
            LineString([(width - eps, 0.0), (width - eps, height - eps)]),
            LineString([(width - eps, height - eps), (0.0, height - eps)]),
            LineString([(0.0, height - eps), (0.0, 0.0)])
        ]
        intersections = self.find_intersections_with(edges)

        points = []
        gen = enumerate(zip(self.coords[:-1], self.coords[1:],
                            ooi_mask[:-1], ooi_mask[1:],
                            intersections))
        for i, (line_start, line_end, ooi_start, ooi_end, inter_line) in gen:
            points.append((line_start, False, ooi_start))
            for p_inter in inter_line:
                points.append((p_inter, True, False))

            is_last = (i == len(self.coords) - 2)
            if is_last and not ooi_end:
                points.append((line_end, False, ooi_end))

        lines = []
        line = []
        for i, (coord, was_added, ooi) in enumerate(points):
            # remove any point that is outside of the image,
            # also start a new line once such a point is detected
            if ooi:
                if len(line) > 0:
                    lines.append(line)
                    line = []
                continue

            if not was_added:
                # add all points that were part of the original line string
                # AND that are inside the image plane
                line.append(coord)
            else:
                is_last_point = (i == len(points)-1)
                # ooi is a numpy.bool_, hence the bool(.)
                is_next_ooi = (not is_last_point
                               and bool(points[i+1][2]) is True)

                # Add all points that were new (i.e. intersections), so
                # long that they aren't essentially identical to other point.
                # This prevents adding overlapping intersections multiple times.
                # (E.g. when a line intersects with a corner of the image plane
                # and also with one of its edges.)
                p_prev = line[-1] if len(line) > 0 else None
                # ignore next point if end reached or next point is out of image
                p_next = None
                if not is_last_point and not is_next_ooi:
                    p_next = points[i+1][0]
                dist_prev = None
                dist_next = None
                if p_prev is not None:
                    dist_prev = np.linalg.norm(
                        np.float32(coord) - np.float32(p_prev))
                if p_next is not None:
                    dist_next = np.linalg.norm(
                        np.float32(coord) - np.float32(p_next))

                dist_prev_ok = (dist_prev is None or dist_prev > 1e-2)
                dist_next_ok = (dist_next is None or dist_next > 1e-2)
                if dist_prev_ok and dist_next_ok:
                    line.append(coord)

        if len(line) > 0:
            lines.append(line)

        lines = [line for line in lines if len(line) > 0]
        return [self.deepcopy(coords=line) for line in lines]

Response: Clip off all parts of the line_string that are outside of the image.


Instruction:
Can you tell what is the following Python 3 function doing
def find_intersections_with(self, other):
        import shapely.geometry

        geom = _convert_var_to_shapely_geometry(other)

        result = []
        for p_start, p_end in zip(self.coords[:-1], self.coords[1:]):
            ls = shapely.geometry.LineString([p_start, p_end])
            intersections = ls.intersection(geom)
            intersections = list(_flatten_shapely_collection(intersections))

            intersections_points = []
            for inter in intersections:
                if isinstance(inter, shapely.geometry.linestring.LineString):
                    inter_start = (inter.coords[0][0], inter.coords[0][1])
                    inter_end = (inter.coords[-1][0], inter.coords[-1][1])
                    intersections_points.extend([inter_start, inter_end])
                else:
                    assert isinstance(inter, shapely.geometry.point.Point), (
                        "Expected to find shapely.geometry.point.Point or "
                        "shapely.geometry.linestring.LineString intersection, "
                        "actually found %s." % (type(inter),))
                    intersections_points.append((inter.x, inter.y))

            # sort by distance to start point, this makes it later on easier
            # to remove duplicate points
            inter_sorted = sorted(
                intersections_points,
                key=lambda p: np.linalg.norm(np.float32(p) - p_start)
            )

            result.append(inter_sorted)
        return result

Response: Find all intersection points between the line string and other.


Instruction:
How would you explain what the following Python 3 function does
def shift(self, top=None, right=None, bottom=None, left=None):
        top = top if top is not None else 0
        right = right if right is not None else 0
        bottom = bottom if bottom is not None else 0
        left = left if left is not None else 0
        coords = np.copy(self.coords)
        coords[:, 0] += left - right
        coords[:, 1] += top - bottom
        return self.copy(coords=coords)

Response: Shift the line string from one or more image sides.


Instruction:
Explain what the following Python 3 code does
def draw_mask(self, image_shape, size_lines=1, size_points=0,
                  raise_if_out_of_image=False):
        """
        Draw this line segment as a binary image mask.

        Parameters
        ----------
        image_shape : tuple of int
            The shape of the image onto which to draw the line mask.

        size_lines : int, optional
            Thickness of the line segments.

        size_points : int, optional
            Size of the points in pixels.

        raise_if_out_of_image : bool, optional
            Whether to raise an error if the line string is fully
            outside of the image. If set to False, no error will be raised and
            only the parts inside the image will be drawn.

        Returns
        -------
        ndarray
            Boolean line mask of shape `image_shape` (no channel axis).

        """
        heatmap = self.draw_heatmap_array(
            image_shape,
            alpha_lines=1.0, alpha_points=1.0,
            size_lines=size_lines, size_points=size_points,
            antialiased=False,
            raise_if_out_of_image=raise_if_out_of_image)
        return heatmap > 0.5

Response: Draw this line segment as a binary image mask.


Instruction:
Make a summary of the following Python 3 code
def draw_lines_heatmap_array(self, image_shape, alpha=1.0,
                                 size=1, antialiased=True,
                                 raise_if_out_of_image=False):
        """
        Draw the line segments of the line string as a heatmap array.

        Parameters
        ----------
        image_shape : tuple of int
            The shape of the image onto which to draw the line mask.

        alpha : float, optional
            Opacity of the line string. Higher values denote a more visible
            line string.

        size : int, optional
            Thickness of the line segments.

        antialiased : bool, optional
            Whether to draw the line with anti-aliasing activated.

        raise_if_out_of_image : bool, optional
            Whether to raise an error if the line string is fully
            outside of the image. If set to False, no error will be raised and
            only the parts inside the image will be drawn.

        Returns
        -------
        ndarray
            Float array of shape `image_shape` (no channel axis) with drawn
            line string. All values are in the interval ``[0.0, 1.0]``.

        """
        assert len(image_shape) == 2 or (
            len(image_shape) == 3 and image_shape[-1] == 1), (
            "Expected (H,W) or (H,W,1) as image_shape, got %s." % (
                image_shape,))

        arr = self.draw_lines_on_image(
            np.zeros(image_shape, dtype=np.uint8),
            color=255, alpha=alpha, size=size,
            antialiased=antialiased,
            raise_if_out_of_image=raise_if_out_of_image
        )
        return arr.astype(np.float32) / 255.0

Response: Draw the lines of the line string on the image.


Instruction:
How would you explain what the following Python 3 function does
def draw_points_heatmap_array(self, image_shape, alpha=1.0,
                                  size=1, raise_if_out_of_image=False):
        """
        Draw the points of the line string as a heatmap array.

        Parameters
        ----------
        image_shape : tuple of int
            The shape of the image onto which to draw the point mask.

        alpha : float, optional
            Opacity of the line string points. Higher values denote a more
            visible points.

        size : int, optional
            Size of the points in pixels.

        raise_if_out_of_image : bool, optional
            Whether to raise an error if the line string is fully
            outside of the image. If set to False, no error will be raised and
            only the parts inside the image will be drawn.

        Returns
        -------
        ndarray
            Float array of shape `image_shape` (no channel axis) with drawn
            line string points. All values are in the interval ``[0.0, 1.0]``.

        """
        assert len(image_shape) == 2 or (
            len(image_shape) == 3 and image_shape[-1] == 1), (
            "Expected (H,W) or (H,W,1) as image_shape, got %s." % (
                image_shape,))

        arr = self.draw_points_on_image(
            np.zeros(image_shape, dtype=np.uint8),
            color=255, alpha=alpha, size=size,
            raise_if_out_of_image=raise_if_out_of_image
        )
        return arr.astype(np.float32) / 255.0

Response: Draw the points of the line string as a heatmap array.


Instruction:
Can you tell what is the following Python 3 function doing
def draw_heatmap_array(self, image_shape, alpha_lines=1.0, alpha_points=1.0,
                           size_lines=1, size_points=0, antialiased=True,
                           raise_if_out_of_image=False):
        """
        Draw the line segments and points of the line string as a heatmap array.

        Parameters
        ----------
        image_shape : tuple of int
            The shape of the image onto which to draw the line mask.

        alpha_lines : float, optional
            Opacity of the line string. Higher values denote a more visible
            line string.

        alpha_points : float, optional
            Opacity of the line string points. Higher values denote a more
            visible points.

        size_lines : int, optional
            Thickness of the line segments.

        size_points : int, optional
            Size of the points in pixels.

        antialiased : bool, optional
            Whether to draw the line with anti-aliasing activated.

        raise_if_out_of_image : bool, optional
            Whether to raise an error if the line string is fully
            outside of the image. If set to False, no error will be raised and
            only the parts inside the image will be drawn.

        Returns
        -------
        ndarray
            Float array of shape `image_shape` (no channel axis) with drawn
            line segments and points. All values are in the
            interval ``[0.0, 1.0]``.

        """
        heatmap_lines = self.draw_lines_heatmap_array(
            image_shape,
            alpha=alpha_lines,
            size=size_lines,
            antialiased=antialiased,
            raise_if_out_of_image=raise_if_out_of_image)
        if size_points <= 0:
            return heatmap_lines

        heatmap_points = self.draw_points_heatmap_array(
            image_shape,
            alpha=alpha_points,
            size=size_points,
            raise_if_out_of_image=raise_if_out_of_image)

        heatmap = np.dstack([heatmap_lines, heatmap_points])
        return np.max(heatmap, axis=2)

Response: Draw the line segments and points of the line string as a heatmap array.