public HatAssignment DeepCopyHatAssignment()
			{
				var newMembers = new IndividualAssignment[this.Assignment.Length];
				for (int i = 0; i < this.Assignment.Length; i++)
				{
					newMembers[i] = new IndividualAssignment { CitizenId = this.Assignment[i].CitizenId , HatColor = this.Assignment[i].HatColor };
				}
				return new HatAssignment { Assignment = newMembers };
			}
		public bool VerifySolution(Code code, int numPeople, int numHats)
		{
			var possibleCombinationsOfHats = this.GenerateAllPossibleHatAssignments(
				numPeople, 
				numHats,
				1);

			var numPeopleInSmallerLine = code.Code1.OneWaySignals.First().Signal.Assignment.Length;
			var numPeopleInLargerLine = code.Code2.OneWaySignals.First().Signal.Assignment.Length;

			foreach (var combination in possibleCombinationsOfHats)
			{
				var signalFromSmallerLineMembers = new IndividualAssignment[numPeopleInSmallerLine];
				var signalFromLargerLineMembers = new IndividualAssignment[numPeopleInLargerLine];
				for(int i=0; i< numPeopleInSmallerLine; i++)
				{
					signalFromSmallerLineMembers[i] = new IndividualAssignment { 
						CitizenId = combination.Assignment[i].CitizenId, 
						HatColor = combination.Assignment[i].HatColor 
					};
				}
				for(int i=0; i<numPeopleInLargerLine; i++)
				{
					signalFromLargerLineMembers[i] = new IndividualAssignment
					{
						CitizenId = combination.Assignment[i + numPeopleInSmallerLine].CitizenId,
						HatColor = combination.Assignment[i + numPeopleInSmallerLine].HatColor
					}; 
				}
				var signalFromSmallerLine = new HatAssignment { Assignment = signalFromSmallerLineMembers };
				var signalFromLargerLine = new HatAssignment { Assignment = signalFromLargerLineMembers };

				var responseFromSmallerLine = code.Code2.OneWaySignals.Single(c => c.Signal.Equals(signalFromLargerLine)).Response;
				var responseFromLargerLine = code.Code1.OneWaySignals.Single(c => c.Signal.Equals(signalFromSmallerLine)).Response;

				if(!(this.PairContainsAtLeastOneMatchingHat(signalFromSmallerLine, responseFromSmallerLine)
					|| this.PairContainsAtLeastOneMatchingHat(signalFromLargerLine, responseFromLargerLine)))
				{
					return false;
				}
			}
			return true;
		}