#samples = einet.sample(num_samples=25).cpu().numpy()
#samples = samples.reshape((-1, 28, 28))
# irfft2 by @yu
samples = einet.sample(num_samples=25)
samples = samples.reshape((-1, 28, 30))
samples = samples[:, :, :15] + samples[:, :, 15:] * 1j
# filtering high freqs
samples[:, :, 10:] = 0
samples[:, 10:20, :] = 0
samples = torch.fft.irfft2(samples, norm="forward").cpu().numpy()
samples[samples > 0.5] = 0.5
samples[samples < -0.5] = -0.5

utils.save_image_stack(samples,
                       5,
                       5,
                       os.path.join(samples_dir, "samples.png"),
                       margin_gray_val=0.)
0 / 0
# Draw conditional samples for reconstruction
image_scope = np.array(range(height * width)).reshape(height, width)
marginalize_idx = list(image_scope[0:round(height / 2), :].reshape(-1))
keep_idx = [i for i in range(width * height) if i not in marginalize_idx]
einet.set_marginalization_idx(marginalize_idx)

num_samples = 10
samples = None
for k in range(num_samples):
    if samples is None:
        samples = einet.sample(x=test_x[0:25, :]).cpu().numpy()
    else:
p = p / p.sum()

einets = []
for k in range(num_clusters):
    print("Load model for cluster {}".format(k))
    model_file = os.path.join(einet_path, 'cluster_{}'.format(k), 'einet.mdl')
    einets.append(torch.load(model_file).to(device))

mixture = EinetMixture(p, einets)

L = 7
samples = mixture.sample(L**2, std_correction=0.0)
utils.save_image_stack(samples.reshape(-1, height, width, 3),
                       L,
                       L,
                       os.path.join(sample_path, 'einet_samples.png'),
                       margin=2,
                       margin_gray_val=0.,
                       frame=2,
                       frame_gray_val=0.0)
print("Saved samples to {}".format(
    os.path.join(sample_path, 'einet_samples.png')))

num_reconstructions = 10

rp = np.random.permutation(test_x_all.shape[0])
test_x = test_x_all[rp[0:num_reconstructions], ...]

# Make covered images -- Top
test_x_covered_top = np.reshape(test_x.clone().cpu().numpy(),
                                (num_reconstructions, height, width, 3))
test_x_covered_top[:, 0:round(height / 2), ...] = 0.0