code: def generate_phase_2(phase_1, dim = 40):
    
    phase_2 = []
    for i in range(dim):
      indices = [numpy.random.randint(0, dim) for i in range(4)]
      phase_2.append(numpy.prod([phase_1[i] for i in indices]))
    return phase_2
docs: The second step in creating datapoints in the Poirazi & Mel model.
    This takes a phase 1 vector, and creates a phase 2 vector where each point
    is the product of four elements of the phase 1 vector, randomly drawn with
    replacement.