def get_training_image_group(train_in, train_out): image = MNistMobject(train_in) image.scale_to_fit_height(1) arrow = Vector(RIGHT, color=BLUE, buff=0) output = np.argmax(train_out) output_tex = TexMobject(str(output)).scale(1.5) result = Group(image, arrow, output_tex) result.arrange_submobjects(RIGHT) result.to_edge(UP) return result
def construct(self): #self.force_skipping() self.fruit_num = 101 apples = Group(*(Apple() for _ in xrange(self.fruit_num))) apples.arrange_submobjects(buff=0.5) apples.to_edge(LEFT, buff=2.5) pears = Group(*(Pear() for _ in xrange(self.fruit_num))) for apple, pear in zip(apples, pears): pear.move_to(apple) apples.shift(1.5 * UP) pears.shift(1.5 * DOWN) apple_numbers = number_submobjects(apples, direction=UP) pear_numbers = number_submobjects(pears, direction=DOWN) self.play(ShowCreation(apples), Write(apple_numbers)) self.play(ShowCreation(pears), Write(pear_numbers)) #self.dither() apples.submobjects.reverse() pears.submobjects.reverse() apple_numbers.submobjects.reverse() pear_numbers.submobjects.reverse() apples_ori = apples.copy() pears_ori = pears.copy() apple_numbers_ori = apple_numbers.copy() pear_numbers_ori = pear_numbers.copy() apples_persp = apples.copy() pears_persp = pears.copy() apple_numbers_persp = apple_numbers.copy() pear_numbers_persp = pear_numbers.copy() self.camera_distance = 12.0 self.camera_point = apples[-1].get_center() * X_MASK vanishing_point = self.camera_point + self.camera_distance * RIGHT self.darken(apples_persp) self.darken(pears_persp) self.darken(apple_numbers_persp) self.darken(pear_numbers_persp) # perspective shift of numbers self.apply_perspective(apples_persp, objectwise=True) self.apply_perspective(pears_persp, objectwise=True) self.apply_perspective(apple_numbers_persp, objectwise=False) self.apply_perspective(pear_numbers_persp, objectwise=False) self.play( ReplacementTransform(apples, apples_persp), ReplacementTransform(pears, pears_persp), ReplacementTransform(apple_numbers, apple_numbers_persp), ReplacementTransform(pear_numbers, pear_numbers_persp), ) apples = apples_persp pears = pears_persp apple_numbers = apple_numbers_persp pear_numbers = pear_numbers_persp #self.dither() matching = make_ordinal_matching( Ordinal(*apples[1:]), Ordinal(*pears[1:]), ) self.darken(matching) self.play(ShowCreation(matching)) self.dither() matching_straight = matching.copy() # Extra apple self.show_extra_fruit(apples, apples_ori, apple_numbers, apple_numbers_ori, matching, apples[:-1], pears[1:], matching_straight) # Extra pear self.show_extra_fruit(pears, pears_ori, pear_numbers, pear_numbers_ori, matching, apples[1:], pears[:-1], matching_straight) self.dither() self.play(Transform(matching, matching_straight)) definition = TextMobject("Definition:", "$|A| = |B|$") definition.to_edge(UP) self.play(Write(definition[0])) apple_box, apple_label = self.pack_into_box(apples, apple_numbers, UP, 'A', RED, matching, apples, pears) #self.dither() pear_box, pear_label = self.pack_into_box(pears, pear_numbers, DOWN, 'B', YELLOW, matching, apples, pears) #self.dither() self.move_labels_to_definition(apple_label, pear_label, definition[1]) finite_pears = VGroup(*pears_ori[-3:]) finite_pears.move_to(pear_box) pears_dest = VGroup(*[pears[0].copy() for _ in range(len(pears) - 3)]) pears_dest.fade(0) pears_dest.add(*finite_pears.submobjects) self.play( Uncreate(matching), FadeOut(definition[1]), ) self.play(Transform(pears, pears_dest), ) self.remove(pears) self.add(finite_pears) finite_pears.submobjects.reverse() pears = finite_pears #self.dither() def attempt(i0, i1, i2, remove=True): apple_indices = i0, i1, i2 matching = get_matching( pears, Group(*(apples.submobjects[-1 - i] for i in apple_indices))) self.play(ShowCreation(matching), submobject_mode="all_at_once") #self.dither() if remove: self.remove(matching) else: return matching attempt(5, 8, 12) attempt(0, 10, 19) matching = attempt(7, 1, 0, remove=False) def2 = TextMobject(":", "$|A|>|B|$") def2.shift(definition[0][-1].get_center() - def2[0].get_center()) self.move_labels_to_definition(apple_label, pear_label, def2[1]) self.dither()