class Individual:
        def __init__(self, ttl_torsions = 0, \
                     lo_grid = Axis3(), hi_grid = Axis3(), \
                     rng = None):
            self.translation_gene = Axis3()
            self.rotation_gene = Quaternion()
            self.torsions_gene = []
            
            self.random_translation(lo_grid, hi_grid, rng)
            self.random_rotation(rng)
            self.random_torsions(ttl_torsions, rng)

        def random_translation(self, lo_grid, hi_grid, rng):
            lo_x, lo_y, lo_z = lo_grid.xyz
            hi_x, hi_y, hi_z = hi_grid.xyz
            self.translation_gene.x = lo_x + (rng.zero_to_one() * (hi_x - lo_x))
            self.translation_gene.y = lo_y + (rng.zero_to_one() * (hi_y - lo_y))
            self.translation_gene.z = lo_z + (rng.zero_to_one() * (hi_z - lo_z))

        def random_rotation(self, rng):
            self.rotation_gene.uniform(rng)

        def random_torsions(self, ttl_torsions, rng):
            self.torsions_gene = []
            for i in xrange(ttl_torsions):
                self.torsions_gene.append(rng.neg_pi_to_pi())
    def testUniform(self):
        exp_q = ["Quaternion: -0.5105 + -0.7011i + 0.0180j + 0.4976k",
                 "Quaternion: 0.1267 + -0.5028i + -0.7474j + -0.4153k",
                 "Quaternion: 0.1504 + 0.0998i + -0.3025j + 0.9359k",
                 "Quaternion: 0.6418 + -0.5843i + 0.2151j + -0.4476k",
                 "Quaternion: 0.9726 + -0.0334i + 0.2176j + -0.0742k",
                 "Quaternion: 0.0096 + 0.0015i + -0.0778j + 0.9969k",
                 "Quaternion: -0.4398 + 0.5669i + -0.2332j + -0.6564k",
                 "Quaternion: 0.2429 + 0.2133i + -0.3556j + 0.8769k",
                 "Quaternion: -0.0521 + -0.3024i + -0.8972j + 0.3175k"]
                 
        exp_angle = [-2.0702,
                     2.8876,
                     2.8396,
                     1.7478,
                     0.4689,
                     3.1225,
                     -2.2309,
                     2.6510,
                     -3.0374]

        exp_axis = ["Axis3: -0.8153, 0.0209, 0.5787",
                    "Axis3: -0.5069, -0.7535, -0.4187",
                    "Axis3: 0.1009, -0.3059, 0.9467",
                    "Axis3: -0.7619, 0.2806, -0.5837",
                    "Axis3: -0.1437, 0.9367, -0.3193",
                    "Axis3: 0.0015, -0.0778, 0.9970",
                    "Axis3: 0.6312, -0.2597, -0.7309",
                    "Axis3: 0.2199, -0.3666, 0.9040",
                    "Axis3: -0.3028, -0.8985, 0.3179"]

        rng = LFSR(lfsr = 1070, bit_len = 16)
        q = Quaternion()
        for i in xrange(9):
            q.uniform(rng)
            angle, axis = q.get_angle_axis()
            self.assertEquals(str(q), exp_q[i])
            self.assertLessEqual(angle - exp_angle[i], 0.0001)
            self.assertGreaterEqual(angle - exp_angle[i], -0.0001)
            self.assertEquals(str(axis), exp_axis[i])