public static double HandStrength(string pocketquery, string board, int NOpponnents, double duration)
{
double win = 0.0, count = 0.0;
double starttime = CurrentTime;
ulong[] list = PocketHands.Query(pocketquery);
ulong boardmask = ParseHand(board);
Random rand = new Random();
#if DEBUG
if (!PocketHands.ValidateQuery(pocketquery, Hand.ParseHand(board)))
throw new ArgumentException("pocketquery and/or board is invalid");
if (BitCount(boardmask) > 5)
throw new ArgumentException("board must have 5 or less cards");
if (NOpponnents < 1 || NOpponnents > 9)
throw new ArgumentException("may only select 1-9 opponents");
#endif
switch (NOpponnents)
{
case 1:
while ((CurrentTime - starttime) < duration)
{
ulong pocketmask = RandomHand(rand, list, 0UL, 2);
uint ourrank = Evaluate(pocketmask | boardmask);
ulong oppcards = Hand.RandomHand(rand, 0UL, pocketmask | boardmask, 2);
uint opprank = Evaluate(oppcards | boardmask);
if (ourrank > opprank)
{
win += 1.0;
}
else if (ourrank == opprank)
{
win += 0.5;
}
count += 1.0;
}
break;
case 2:
while ((CurrentTime - starttime) < duration)
{
ulong pocketmask = RandomHand(rand, list, 0UL, 2);
uint ourrank = Evaluate(pocketmask | boardmask);
ulong opp1cards = Hand.RandomHand(rand, 0UL, pocketmask | boardmask, 2);
ulong opp2cards = Hand.RandomHand(rand, 0UL, pocketmask | boardmask | opp1cards, 2);
uint opp1rank = Evaluate(opp1cards | boardmask);
uint opp2rank = Evaluate(opp2cards | boardmask);
if (ourrank > opp1rank && ourrank > opp2rank)
{
win += 1.0;
}
else if (ourrank >= opp1rank && ourrank >= opp2rank)
{
win += 0.5;
}
count += 1.0;
}
break;
case 3:
while ((CurrentTime - starttime) < duration)
{
ulong pocketmask = RandomHand(rand, list, 0UL, 2);
uint ourrank = Evaluate(pocketmask | boardmask);
ulong opp1cards = Hand.RandomHand(rand, 0UL, pocketmask | boardmask, 2);
ulong opp2cards = Hand.RandomHand(rand, 0UL, pocketmask | boardmask | opp1cards, 2);
ulong opp3cards = Hand.RandomHand(rand, 0UL, pocketmask | boardmask | opp1cards | opp2cards, 2);
uint opp1rank = Evaluate(opp1cards | boardmask);
uint opp2rank = Evaluate(opp2cards | boardmask);
uint opp3rank = Evaluate(opp3cards | boardmask);
if (ourrank > opp1rank && ourrank > opp2rank && ourrank > opp3rank)
{
win += 1.0;
}
else if (ourrank >= opp1rank && ourrank >= opp2rank && ourrank >= opp3rank)
{
win += 0.5;
}
count += 1.0;
}
break;
case 4:
while ((CurrentTime - starttime) < duration)
{
ulong pocketmask = RandomHand(rand, list, 0UL, 2);
uint ourrank = Evaluate(pocketmask | boardmask);
ulong opp1cards = Hand.RandomHand(rand, 0UL, pocketmask | boardmask, 2);
ulong opp2cards = Hand.RandomHand(rand, 0UL, pocketmask | boardmask | opp1cards, 2);
ulong opp3cards = Hand.RandomHand(rand, 0UL, pocketmask | boardmask | opp1cards | opp2cards, 2);
ulong opp4cards = Hand.RandomHand(rand, 0UL, pocketmask | boardmask | opp1cards | opp2cards | opp3cards, 2);
uint opp1rank = Evaluate(opp1cards | boardmask);
uint opp2rank = Evaluate(opp2cards | boardmask);
uint opp3rank = Evaluate(opp3cards | boardmask);
uint opp4rank = Evaluate(opp4cards | boardmask);
if (ourrank > opp1rank && ourrank > opp2rank &&
ourrank > opp3rank && ourrank > opp4rank)
{
win += 1.0;
}
else if (ourrank >= opp1rank && ourrank >= opp2rank &&
ourrank >= opp3rank && ourrank >= opp4rank)
{
win += 0.5;
}
count += 1.0;
}
break;
case 5:
while ((CurrentTime - starttime) < duration)
{
ulong pocketmask = RandomHand(rand, list, 0UL, 2);
uint ourrank = Evaluate(pocketmask | boardmask);
ulong opp1cards = Hand.RandomHand(rand, 0UL, pocketmask | boardmask, 2);
ulong opp2cards = Hand.RandomHand(rand, 0UL, pocketmask | boardmask | opp1cards, 2);
ulong opp3cards = Hand.RandomHand(rand, 0UL, pocketmask | boardmask | opp1cards | opp2cards, 2);
ulong opp4cards = Hand.RandomHand(rand, 0UL, pocketmask | boardmask | opp1cards | opp2cards | opp3cards, 2);
ulong opp5cards = Hand.RandomHand(rand, 0UL, pocketmask | boardmask | opp1cards | opp2cards | opp3cards | opp4cards, 2);
uint opp1rank = Evaluate(opp1cards | boardmask);
uint opp2rank = Evaluate(opp2cards | boardmask);
uint opp3rank = Evaluate(opp3cards | boardmask);
uint opp4rank = Evaluate(opp4cards | boardmask);
uint opp5rank = Evaluate(opp5cards | boardmask);
if (ourrank > opp1rank && ourrank > opp2rank &&
ourrank > opp3rank && ourrank > opp4rank &&
ourrank > opp5rank)
{
win += 1.0;
}
else if (ourrank >= opp1rank && ourrank >= opp2rank &&
ourrank >= opp3rank && ourrank >= opp4rank &&
ourrank >= opp5rank)
{
win += 0.5;
}
count += 1.0;
}
break;
case 6:
while ((CurrentTime - starttime) < duration)
{
ulong pocketmask = RandomHand(rand, list, 0UL, 2);
uint ourrank = Evaluate(pocketmask | boardmask);
ulong opp1cards = Hand.RandomHand(rand, 0UL, pocketmask | boardmask, 2);
ulong opp2cards = Hand.RandomHand(rand, 0UL, pocketmask | boardmask | opp1cards, 2);
ulong opp3cards = Hand.RandomHand(rand, 0UL, pocketmask | boardmask | opp1cards | opp2cards, 2);
ulong opp4cards = Hand.RandomHand(rand, 0UL, pocketmask | boardmask | opp1cards | opp2cards | opp3cards, 2);
ulong opp5cards = Hand.RandomHand(rand, 0UL, pocketmask | boardmask | opp1cards | opp2cards | opp3cards | opp4cards, 2);
ulong opp6cards = Hand.RandomHand(rand, 0UL, pocketmask | boardmask | opp1cards | opp2cards | opp3cards | opp4cards | opp5cards, 2);
uint opp1rank = Evaluate(opp1cards | boardmask);
uint opp2rank = Evaluate(opp2cards | boardmask);
uint opp3rank = Evaluate(opp3cards | boardmask);
uint opp4rank = Evaluate(opp4cards | boardmask);
uint opp5rank = Evaluate(opp5cards | boardmask);
uint opp6rank = Evaluate(opp6cards | boardmask);
if (ourrank > opp1rank && ourrank > opp2rank &&
ourrank > opp3rank && ourrank > opp4rank &&
ourrank > opp5rank && ourrank > opp6rank)
{
win += 1.0;
}
else if (ourrank >= opp1rank && ourrank >= opp2rank &&
ourrank >= opp3rank && ourrank >= opp4rank &&
ourrank >= opp5rank && ourrank >= opp6rank)
{
win += 0.5;
}
count += 1.0;
}
break;
case 7:
while ((CurrentTime - starttime) < duration)
{
ulong pocketmask = RandomHand(rand, list, 0UL, 2);
uint ourrank = Evaluate(pocketmask | boardmask);
ulong opp1cards = Hand.RandomHand(rand, 0UL, pocketmask | boardmask, 2);
ulong opp2cards = Hand.RandomHand(rand, 0UL, pocketmask | boardmask | opp1cards, 2);
ulong opp3cards = Hand.RandomHand(rand, 0UL, pocketmask | boardmask | opp1cards | opp2cards, 2);
ulong opp4cards = Hand.RandomHand(rand, 0UL, pocketmask | boardmask | opp1cards | opp2cards | opp3cards, 2);
ulong opp5cards = Hand.RandomHand(rand, 0UL, pocketmask | boardmask | opp1cards | opp2cards | opp3cards | opp4cards, 2);
ulong opp6cards = Hand.RandomHand(rand, 0UL, pocketmask | boardmask | opp1cards | opp2cards | opp3cards | opp4cards | opp5cards, 2);
ulong opp7cards = Hand.RandomHand(rand, 0UL, pocketmask | boardmask | opp1cards | opp2cards | opp3cards | opp4cards | opp5cards | opp6cards, 2);
uint opp1rank = Evaluate(opp1cards | boardmask);
uint opp2rank = Evaluate(opp2cards | boardmask);
uint opp3rank = Evaluate(opp3cards | boardmask);
uint opp4rank = Evaluate(opp4cards | boardmask);
uint opp5rank = Evaluate(opp5cards | boardmask);
uint opp6rank = Evaluate(opp6cards | boardmask);
uint opp7rank = Evaluate(opp7cards | boardmask);
if (ourrank > opp1rank && ourrank > opp2rank &&
ourrank > opp3rank && ourrank > opp4rank &&
ourrank > opp5rank && ourrank > opp6rank &&
ourrank > opp7rank)
{
win += 1.0;
}
else if (ourrank >= opp1rank && ourrank >= opp2rank &&
ourrank >= opp3rank && ourrank >= opp4rank &&
ourrank >= opp5rank && ourrank >= opp6rank &&
ourrank >= opp7rank)
{
win += 0.5;
}
count += 1.0;
}
break;
case 8:
while ((CurrentTime - starttime) < duration)
{
ulong pocketmask = RandomHand(rand, list, 0UL, 2);
uint ourrank = Evaluate(pocketmask | boardmask);
ulong opp1cards = Hand.RandomHand(rand, 0UL, pocketmask | boardmask, 2);
ulong opp2cards = Hand.RandomHand(rand, 0UL, pocketmask | boardmask | opp1cards, 2);
ulong opp3cards = Hand.RandomHand(rand, 0UL, pocketmask | boardmask | opp1cards | opp2cards, 2);
ulong opp4cards = Hand.RandomHand(rand, 0UL, pocketmask | boardmask | opp1cards | opp2cards | opp3cards, 2);
ulong opp5cards = Hand.RandomHand(rand, 0UL, pocketmask | boardmask | opp1cards | opp2cards | opp3cards | opp4cards, 2);
ulong opp6cards = Hand.RandomHand(rand, 0UL, pocketmask | boardmask | opp1cards | opp2cards | opp3cards | opp4cards | opp5cards, 2);
ulong opp7cards = Hand.RandomHand(rand, 0UL, pocketmask | boardmask | opp1cards | opp2cards | opp3cards | opp4cards | opp5cards | opp6cards, 2);
ulong opp8cards = Hand.RandomHand(rand, 0UL, pocketmask | boardmask | opp1cards | opp2cards | opp3cards | opp4cards | opp5cards | opp6cards | opp7cards, 2);
uint opp1rank = Evaluate(opp1cards | boardmask);
uint opp2rank = Evaluate(opp2cards | boardmask);
uint opp3rank = Evaluate(opp3cards | boardmask);
uint opp4rank = Evaluate(opp4cards | boardmask);
uint opp5rank = Evaluate(opp5cards | boardmask);
uint opp6rank = Evaluate(opp6cards | boardmask);
uint opp7rank = Evaluate(opp7cards | boardmask);
uint opp8rank = Evaluate(opp8cards | boardmask);
if (ourrank > opp1rank && ourrank > opp2rank &&
ourrank > opp3rank && ourrank > opp4rank &&
ourrank > opp5rank && ourrank > opp6rank &&
ourrank > opp7rank && ourrank > opp8rank)
{
win += 1.0;
}
else if (ourrank >= opp1rank && ourrank >= opp2rank &&
ourrank >= opp3rank && ourrank >= opp4rank &&
ourrank >= opp5rank && ourrank >= opp6rank &&
ourrank >= opp7rank && ourrank >= opp8rank)
{
win += 0.5;
}
count += 1.0;
}
break;
case 9:
while ((CurrentTime - starttime) < duration)
{
ulong pocketmask = RandomHand(rand, list, 0UL, 2);
uint ourrank = Evaluate(pocketmask | boardmask);
ulong opp1cards = Hand.RandomHand(rand, 0UL, pocketmask | boardmask, 2);
ulong opp2cards = Hand.RandomHand(rand, 0UL, pocketmask | boardmask | opp1cards, 2);
ulong opp3cards = Hand.RandomHand(rand, 0UL, pocketmask | boardmask | opp1cards | opp2cards, 2);
ulong opp4cards = Hand.RandomHand(rand, 0UL, pocketmask | boardmask | opp1cards | opp2cards | opp3cards, 2);
ulong opp5cards = Hand.RandomHand(rand, 0UL, pocketmask | boardmask | opp1cards | opp2cards | opp3cards | opp4cards, 2);
ulong opp6cards = Hand.RandomHand(rand, 0UL, pocketmask | boardmask | opp1cards | opp2cards | opp3cards | opp4cards | opp5cards, 2);
ulong opp7cards = Hand.RandomHand(rand, 0UL, pocketmask | boardmask | opp1cards | opp2cards | opp3cards | opp4cards | opp5cards | opp6cards, 2);
ulong opp8cards = Hand.RandomHand(rand, 0UL, pocketmask | boardmask | opp1cards | opp2cards | opp3cards | opp4cards | opp5cards | opp6cards | opp7cards, 2);
ulong opp9cards = Hand.RandomHand(rand, 0UL, pocketmask | boardmask | opp1cards | opp2cards | opp3cards | opp4cards | opp5cards | opp6cards | opp7cards | opp8cards, 2);
uint opp1rank = Evaluate(opp1cards | boardmask);
uint opp2rank = Evaluate(opp2cards | boardmask);
uint opp3rank = Evaluate(opp3cards | boardmask);
uint opp4rank = Evaluate(opp4cards | boardmask);
uint opp5rank = Evaluate(opp5cards | boardmask);
uint opp6rank = Evaluate(opp6cards | boardmask);
uint opp7rank = Evaluate(opp7cards | boardmask);
uint opp8rank = Evaluate(opp8cards | boardmask);
uint opp9rank = Evaluate(opp9cards | boardmask);
if (ourrank > opp1rank && ourrank > opp2rank &&
ourrank > opp3rank && ourrank > opp4rank &&
ourrank > opp5rank && ourrank > opp6rank &&
ourrank > opp7rank && ourrank > opp8rank &&
ourrank > opp9rank)
{
win += 1.0;
}
else if (ourrank >= opp1rank && ourrank >= opp2rank &&
ourrank >= opp3rank && ourrank >= opp4rank &&
ourrank >= opp5rank && ourrank >= opp6rank &&
ourrank >= opp7rank && ourrank >= opp8rank &&
ourrank >= opp9rank)
{
win += 0.5;
}
count += 1.0;
}
break;
}
return win / count;
}