def draw_interpolation(generator, num_steps):
    cuda = True if torch.cuda.is_available() else False
    if cuda:
        generator.cuda()
    Tensor = torch.cuda.FloatTensor if cuda else torch.FloatTensor

    p1 = np.random.normal(0, 1, opt.latent_dim)
    p2 = np.random.normal(0, 1, opt.latent_dim)
    batch = get_interpolation(num_steps, p1, p2)

    batch = Variable(Tensor(batch).transpose_(0, 1))
    ecgs_fake_varied = generator(batch).detach().cpu().numpy()
    some_num = random.randint(0, 1111)
    save_ecgs_varied_one_plot(ecgs_fake_varied, "INTERPOL" + str(some_num))
    save_ecgs_varied_several_plots(ecgs_fake_varied,
                                   "INTERPOL" + str(some_num))
    def get_same_class_codei_vary(self, class_id, code_i, steps):
        # батч длиной steps
        # класс фиксирован
        # переменная ci (i-тая по счету среди непрерывных) пробегает диапазон
        # остальные c равны нулю
        z = np.random.normal(0, 1, (steps, self.latent_dim))
        label = to_categorical(np.array([class_id]), self.n_classes)
        labels_one_hot = np.repeat(label, steps, axis=0)

        p1 = np.array([0 for _ in range(self.code_dim)])
        p1[code_i] = -1
        p2 = np.array([0 for _ in range(self.code_dim)])
        p2[code_i] = 1
        code_input = get_interpolation(steps, p1, p2)
        code_input = code_input.transpose((1, 0))
        return z, code_input, labels_one_hot