# Codeblock 3 class TimeEmbedding(nn.Module): def forward(self): time = torch.arange(NUM_TIMESTEPS, device=DEVICE).reshape(NUM_TIMESTEPS, 1) #(1) print(f"time\t\t: {time.shape}") i = torch.arange(0, TIME_EMBED_DIM, 2, device=DEVICE) denominator = torch.pow(10000, i/TIME_EMBED_DIM) print(f"denominator\t: {denominator.shape}") even_time_embed = torch.sin(time/denominator) #(1) odd_time_embed = torch.cos(time/denominator) #(2) print(f"even_time_embed\t: {even_time_embed.shape}") print(f"odd_time_embed\t: {odd_time_embed.shape}") stacked = torch.stack([even_time_embed, odd_time_embed], dim=2) #(3) print(f"stacked\t\t: {stacked.shape}") time_embed = torch.flatten(stacked, start_dim=1, end_dim=2) #(4) print(f"time_embed\t: {time_embed.shape}") return time_embed