// // $Source: /cvsroot/gambit/gambit/sources/tools/liap/liap.cc,v $ // $Date: 2006/08/12 20:19:50 $ // $Revision: 1.4 $ // // DESCRIPTION: // Compute Nash equilibria by minimizing Liapunov function // // This file is part of Gambit // Copyright (c) 2002, The Gambit Project // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // #include #include #include "libgambit/libgambit.h" void PrintBanner(std::ostream &p_stream) { p_stream << "Compute Nash equilibria by minimizing the Lyapunov function\n"; p_stream << "Gambit version " VERSION ", Copyright (C) 2005, The Gambit Project\n"; p_stream << "This is free software, distributed under the GNU GPL\n\n"; } void PrintHelp(char *progname) { PrintBanner(std::cerr); std::cerr << "Usage: " << progname << " [OPTIONS]\n"; std::cerr << "Accepts game on standard input.\n"; std::cerr << "With no options, attempts to compute one equilibrium starting at centroid.\n"; std::cerr << "Options:\n"; std::cerr << " -d DECIMALS print probabilities with DECIMALS digits\n"; std::cerr << " -h print this help message\n"; std::cerr << " -n COUNT number of starting points to generate\n"; std::cerr << " -s FILE file containing starting points\n"; std::cerr << " -q quiet mode (suppresses banner)\n"; std::cerr << " -v verbose mode (shows intermediate output)\n"; std::cerr << " (default is to only show equilibria)\n"; exit(1); } extern void SolveStrategic(const Gambit::Game &); extern void SolveExtensive(const Gambit::Game &); int m_stopAfter = 0; int m_numTries = 10; int m_maxits1 = 100; int m_maxitsN = 20; double m_tol1 = 2.0e-10; double m_tolN = 1.0e-10; std::string startFile = ""; bool useRandom = false; int g_numDecimals = 6; bool verbose = false; int main(int argc, char *argv[]) { opterr = 0; bool quiet = false, useStrategic = false; int c; while ((c = getopt(argc, argv, "d:n:s:hqvS")) != -1) { switch (c) { case 'd': g_numDecimals = atoi(optarg); break; case 'n': m_numTries = atoi(optarg); break; case 's': startFile = optarg; break; case 'h': PrintHelp(argv[0]); break; case 'S': useStrategic = true; break; case 'q': quiet = true; break; case 'v': verbose = true; break; case '?': if (isprint(optopt)) { std::cerr << argv[0] << ": Unknown option `-" << ((char) optopt) << "'.\n"; } else { std::cerr << argv[0] << ": Unknown option character `\\x" << optopt << "`.\n"; } return 1; default: abort(); } } if (!quiet) { PrintBanner(std::cerr); } try { Gambit::Game game = Gambit::ReadGame(std::cin); if (!game->IsTree() || useStrategic) { game->BuildComputedValues(); SolveStrategic(game); } else { SolveExtensive(game); } return 0; } catch (Gambit::InvalidFileException) { std::cerr << "Error: Game not in a recognized format.\n"; return 1; } catch (...) { std::cerr << "Error: An internal error occurred.\n"; return 1; } }