diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..f4a8bab --- /dev/null +++ b/.gitignore @@ -0,0 +1,8 @@ +!.gitignore +*.o +*.a +*.dll +*.obj +*.exe +*.def +[Mm]akefile diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..bbe41f1 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "dds"] + path = dds + url = https://github.com/dds-bridge/dds diff --git a/Makefile b/Makefile deleted file mode 100644 index d1a1694..0000000 --- a/Makefile +++ /dev/null @@ -1,48 +0,0 @@ -# HOW TO COMPILE AND LINK THIS WITH THE LATEST VERSION OF DDS -# -# The following is suggested: -# -# - obtain the latest .cpp and dll.h file for version 1.0x -# of Bo Haglund's DDS -# - rename them to dds10x.cpp and dds10x.h and copy them into this directory -# - change the include below to reflect the version dds10x.h -# -# Linux: compile and link as follows: -# g++ -O2 -Wall -o ./ddd ddd.cpp dds10x.cpp defs.cpp timer.cpp giblib.cpp rng.cpp -# -# Windows: compile and link as follows: -# g++ -O2 -Wall -o ddd.exe ddd.cpp dds10x.cpp defs.cpp timer.cpp giblib.cpp rng.cpp -# -# for debugging change the switch '-O2' to '-g' -# -# Note: on MingW you must have _WIN32 defined to compile code in timer.cpp -# -# Using the Makefile: -# There is a Makefile supplied, edit it for the correct version of dds10x. -# Run 'make' (or 'mingw32-make') to produce the executable, -# note that the executable is written to ../exe/ddd. -# To make the debug executable run 'make debug', -# the debug executable is written to ../exe/dddd. -# -# The Makefile creates separate directories ../objr and ../objd for -# compiled object files, apart from the directory ../exe for executables. - -CXX=g++ -CXXFLAGS=-g -Wall -O2 -LDFLAGS=-L.. -LIBS=-ldds -OBJ=ddd.o defs.o timer.o giblib.o rng.o -PREFIX=/usr/local - -ddd: dds11x.h $(OBJ) - g++ $(LDFLAGS) -o $@ $^ $(LIBS) - -dds11x.h: - ln -s ../dll.h $@ - -install: - install -d $(DESTDIR)$(PREFIX)/games - install ddd $(DESTDIR)$(PREFIX)/games/dds - -clean: - rm -f $(OBJ) ddd dds11x.h diff --git a/Makefiles/Makefile_Mac_clang b/Makefiles/Makefile_Mac_clang new file mode 100644 index 0000000..84ab102 --- /dev/null +++ b/Makefiles/Makefile_Mac_clang @@ -0,0 +1,83 @@ +# This is a Makefile for the ddd program, +# for Mac and the clang compiler. + +# It does assume a Unix-like setup for some commands, +# but if you only want to call "make" with the default target, +# you should be OK. + +# The test program itself does not use multi-threading, +# but the DLL might, depending on how it was compiled. + +# If your compiler name is not given here, change it. +CC = g++ + +# Use this one to get single-threading +CC_FLAGS = -O3 -flto -mtune=generic + +# These flags are not turned on by default, but DDS should pass them. +# Turn them on below. +WARN_FLAGS = \ + -Wshadow \ + -Wsign-conversion \ + -pedantic -Wall -Wextra \ + -Wcast-align -Wcast-qual \ + -Wctor-dtor-privacy \ + -Wdisabled-optimization \ + -Winit-self \ + -Wmissing-declarations \ + -Wmissing-include-dirs \ + -Wcomment \ + -Wold-style-cast \ + -Woverloaded-virtual \ + -Wredundant-decls \ + -Wsign-promo \ + -Wstrict-overflow=1 \ + -Wswitch-default -Wundef \ + -Werror \ + -Wno-unused \ + -Wno-unknown-pragmas \ + -Wno-long-long \ + -Wno-format + +# Here you can turn on warnings. +# CC_FULL_FLAGS = $(CC_FLAGS) +CC_FULL_FLAGS = $(CC_FLAGS) $(WARN_FLAGS) + +DTEST = ddd + +DLLBASE = dds +STATIC_LIB = lib$(DLLBASE).a + +# This is in addition to $(DTEST).cpp +TEST_SOURCE_FILES = \ + ddd.cpp \ + defs.cpp \ + giblib.cpp \ + rng.cpp \ + timer.cpp + +LIB_FLAGS = -L. -l$(DLLBASE) + +TEST_OBJ_FILES = $(subst .cpp,.o,$(TEST_SOURCE_FILES)) + +ddd: $(TEST_OBJ_FILES) + $(CC) $(CC_FULL_FLAGS) $(TEST_OBJ_FILES) $(LD_FLAGS) $(LIB_FLAGS) -o $(DTEST) + +%.o: %.cpp + $(CC) $(CC_FULL_FLAGS) -c $< -o $*.o + +depend: + makedepend -Y -- $(TEST_SOURCE_FILES) $(DTEST).cpp + +clean: + rm -f $(TEST_OBJ_FILES) $(DTEST) $(STATIC_LIB) + + +# DO NOT DELETE + +ddd.o: dds/include/dll.h portab_DDD.h giblib.h defs.h rng.h timer.h +defs.o: defs.h portab_DDD.h +giblib.o: giblib.h defs.h rng.h +rng.o: portab_DDD.h rng.h +timer.o: portab_DDD.h timer.h +ddd.o: dds/include/dll.h portab_DDD.h giblib.h defs.h rng.h timer.h diff --git a/Makefiles/Makefile_Mac_gcc b/Makefiles/Makefile_Mac_gcc new file mode 100644 index 0000000..7b301df --- /dev/null +++ b/Makefiles/Makefile_Mac_gcc @@ -0,0 +1,119 @@ +# This is a Makefile for the dtest test program, +# for Mac and the GNU g++ compiler. + +# It does assume a Unix-like setup for some commands, +# but if you only want to call "make" with the default target, +# you should be OK. + +# The test program itself does not use multi-threading, +# but the DLL might, depending on how it was compiled. + +# The Makefile also allows an "un-official" and ugly, but +# sometimes practical compilation of a directly integrated +# executable (i.e. not using the DLL). For this the Makefile +# uses the source and object files in the src directory... +# Use "make itest" at your own risk. + + +# If your compiler name is not given here, change it. +CC = gcc-4.9 + +# Use this one to get single-threading +# CC_FLAGS = -O3 -flto -mtune=generic +# Use this one to get OpenMP multi-threading +CC_FLAGS = -O3 -flto -fopenmp -mtune=generic + +# These flags are not turned on by default, but DDS should pass them. +# Turn them on below. +WARN_FLAGS = \ + -Wshadow \ + -Wsign-conversion \ + -pedantic -Wall -Wextra \ + -Wcast-align -Wcast-qual \ + -Wctor-dtor-privacy \ + -Wdisabled-optimization \ + -Winit-self \ + -Wlogical-op \ + -Wmissing-declarations \ + -Wmissing-include-dirs \ + -Wnoexcept \ + -Wold-style-cast \ + -Woverloaded-virtual \ + -Wredundant-decls \ + -Wsign-promo \ + -Wstrict-null-sentinel \ + -Wstrict-overflow=1 \ + -Wswitch-default -Wundef \ + -Werror \ + -Wno-unused \ + -Wno-unknown-pragmas \ + -Wno-long-long \ + -Wno-format + +# Here you can turn on warnings. +# CC_FULL_FLAGS = $(CC_FLAGS) +CC_FULL_FLAGS = $(CC_FLAGS) $(WARN_FLAGS) + +DTEST = dtest +ITEST = itest + +DLLBASE = dds +STATIC_LIB = lib$(DLLBASE).a +DLIB = $(DLLBASE).lib + +# This is in addition to $(DTEST).cpp +DTEST_SOURCE_FILES = \ + testcommon.cpp \ + testStats.cpp + +LIB_FLAGS = -L. -l$(DLLBASE) +LD_FLAGS = -lgomp -lstdc++ + +DTEST_OBJ_FILES = $(subst .cpp,.o,$(DTEST_SOURCE_FILES)) $(DTEST).o + +# These are the files that we steal from the src directory. +SRC = ../src +STOLEN_SOURCE_FILES = \ + $(SRC)/dds.cpp \ + $(SRC)/ABsearch.cpp \ + $(SRC)/ABstats.cpp \ + $(SRC)/CalcTables.cpp \ + $(SRC)/DealerPar.cpp \ + $(SRC)/Init.cpp \ + $(SRC)/LaterTricks.cpp \ + $(SRC)/Moves.cpp \ + $(SRC)/Par.cpp \ + $(SRC)/PlayAnalyser.cpp \ + $(SRC)/PBN.cpp \ + $(SRC)/QuickTricks.cpp \ + $(SRC)/Scheduler.cpp \ + $(SRC)/SolveBoard.cpp \ + $(SRC)/SolverIF.cpp \ + $(SRC)/Stats.cpp \ + $(SRC)/Timer.cpp \ + $(SRC)/TransTable.cpp + +ITEST_SOURCE_FILES = \ + $(STOLEN_SOURCE_FILES) \ + $(DTEST_SOURCE_FILES) \ + itest.cpp + +ITEST_OBJ_FILES = $(subst .cpp,.o,$(ITEST_SOURCE_FILES)) + +dtest: $(DTEST_OBJ_FILES) + $(CC) $(CC_FULL_FLAGS) $(DTEST_OBJ_FILES) $(LIB_FLAGS) $(LD_FLAGS) -o $(DTEST) + +itest: $(ITEST_OBJ_FILES) + $(CC) $(CC_FULL_FLAGS) $(ITEST_OBJ_FILES) $(LD_FLAGS) -o $(ITEST) + +%.o: %.cpp + $(CC) $(CC_FULL_FLAGS) -c $< -o $*.o + +depend: + makedepend -Y -- $(ITEST_SOURCE_FILES) $(DTEST).cpp + +clean: + rm -f $(ITEST_OBJ_FILES) $(DTEST).o $(DTEST) $(ITEST) $(STATIC_LIB) + + +# DO NOT DELETE diff --git a/Makefiles/Makefile_Visual b/Makefiles/Makefile_Visual new file mode 100644 index 0000000..f8c4d7e --- /dev/null +++ b/Makefiles/Makefile_Visual @@ -0,0 +1,71 @@ +# This is a Makefile for the ddd test program, +# for Windows and the Microsoft Visual C++ compiler. + +# It does assume a Unix-like setup for some commands, +# but if you only want to call "make" with the default target, +# you should be OK. + +# The test program itself does not use multi-threading, +# but the DLL might, depending on how it was compiled. + +# If your Microsoft compiler is not called cl, change it here. +CC = cl +CC_FLAGS = /O2 /Oi /Ot /Oy /GL +LINK_FLAGS = /LTCG + +# These flags are not turned on by default, but DDS should pass them. +# Turn them on below. +WARN_FLAGS = \ + /Wall \ + /wd4127 \ + /wd4514 \ + /wd4555 \ + /wd4668 \ + /wd4711 \ + /wd4820 \ + /wd4996 \ + /WX + +# Here you can turn on warnings. +# CC_FULL_FLAGS = $(CC_FLAGS) +CC_FULL_FLAGS = $(CC_FLAGS) $(WARN_FLAGS) + +DTEST = ddd + +DLLBASE = dds +DLL = $(DLLBASE).dll +DLIB = $(DLLBASE).lib +EXPORTER = Exports.def + +TEST_SOURCE_FILES = \ + ddd.cpp \ + defs.cpp \ + giblib.cpp \ + rng.cpp \ + timer.cpp + + +TEST_OBJ_FILES = $(subst .cpp,.obj,$(TEST_SOURCE_FILES)) + + +ddd: $(TEST_OBJ_FILES) + link $(TEST_OBJ_FILES) $(DLIB) /LTCG /out:$(DTEST).exe + +%.obj: %.cpp + $(CC) $(CC_FULL_FLAGS) /c $< /Fo$*.obj + +depend: + makedepend -Y -o.obj -- $(TEST_SOURCE_FILES) $(DTEST).cpp + +clean: + rm -f $(TEST_OBJ_FILES) $(DTEST).{obj,exe} $(DLL) $(DLIB) + + +# DO NOT DELETE + +ddd.obj: dds/include/dll.h portab_DDD.h giblib.h defs.h rng.h timer.h +defs.obj: defs.h portab_DDD.h +giblib.obj: giblib.h defs.h rng.h +rng.obj: portab_DDD.h rng.h +timer.obj: portab_DDD.h timer.h +ddd.obj: dds/include/dll.h portab_DDD.h giblib.h defs.h rng.h timer.h diff --git a/Makefiles/Makefile_cygwin b/Makefiles/Makefile_cygwin new file mode 100644 index 0000000..261bdbe --- /dev/null +++ b/Makefiles/Makefile_cygwin @@ -0,0 +1,99 @@ +# This is a Makefile for the ddd test program, +# for Cygwin under Windows and the GNU g++ compiler. + +# It does assume a Unix-like setup for some commands, +# but if you only want to call "make" with the default target, +# you should be OK. + +# The test program itself does not use multi-threading, +# but the DLL might, depending on how it was compiled. + +# If your compiler name is not given here, change it. +CC = g++ + +# Use this one to get Windows multi-threading +# CC_FLAGS = -O3 -flto -mtune=generic -fno-use-linker-plugin +# Use this one to get OpenMP multi-threading +CC_FLAGS = -O3 -flto -fopenmp -mtune=generic -fno-use-linker-plugin + +# These flags are not turned on by default, but DDS should pass them. +# Turn them on below. +WARN_FLAGS = \ + -Wshadow \ + -Wsign-conversion \ + -pedantic -Wall -Wextra \ + -Wcast-align -Wcast-qual \ + -Wctor-dtor-privacy \ + -Wdisabled-optimization \ + -Wformat=2 \ + -Winit-self \ + -Wlogical-op \ + -Wmissing-declarations \ + -Wmissing-include-dirs \ + -Wnoexcept \ + -Wold-style-cast \ + -Woverloaded-virtual \ + -Wredundant-decls \ + -Wsign-promo \ + -Wstrict-null-sentinel \ + -Wstrict-overflow=1 \ + -Wswitch-default -Wundef \ + -Werror \ + -Wno-unused \ + -Wno-unknown-pragmas \ + -Wno-long-long + +# Here you can turn on warnings. +# CC_FULL_FLAGS = $(CC_FLAGS) +CC_FULL_FLAGS = $(CC_FLAGS) $(WARN_FLAGS) + +DTEST = ddd + +DLLBASE = dds +DLL = $(DLLBASE).dll +DLIB = $(DLLBASE).lib +EXPORTER = Exports.def + +TEST_SOURCE_FILES = \ + ddd.cpp \ + defs.cpp \ + giblib.cpp \ + rng.cpp \ + timer.cpp + + +TEST_OBJ_FILES = $(subst .cpp,.o,$(TEST_SOURCE_FILES)) + +LD_FLAGS = \ + -Wl,--subsystem,windows \ + -Wl,--output-def,$(DLLBASE).def \ + -Wl,--dynamicbase \ + -Wl,--nxcompat \ + -Wl,--no-seh \ + -Wl,--enable-stdcall-fixup + +LIB_FLAGS = -L. -l$(DLLBASE) + + +ddd: $(TEST_OBJ_FILES) + $(CC) $(CC_FULL_FLAGS) $(TEST_OBJ_FILES) $(LD_FLAGS) $(LIB_FLAGS) -o $(DTEST) + + +%.o: %.cpp + $(CC) $(CC_FULL_FLAGS) -c $< -o $*.o + +depend: + makedepend -Y -- $(TEST_SOURCE_FILES) $(DTEST).cpp + +clean: + rm -f $(TEST_OBJ_FILES) $(DTEST).{o,exe} $(DLL) $(DLLBASE).def + + +# DO NOT DELETE + +ddd.o: dds/include/dll.h portab_DDD.h giblib.h defs.h rng.h timer.h +defs.o: defs.h portab_DDD.h +giblib.o: giblib.h defs.h rng.h +rng.o: portab_DDD.h rng.h +timer.o: portab_DDD.h timer.h +ddd.o: dds/include/dll.h portab_DDD.h giblib.h defs.h rng.h timer.h diff --git a/Makefiles/Makefile_linux b/Makefiles/Makefile_linux new file mode 100644 index 0000000..299bd94 --- /dev/null +++ b/Makefiles/Makefile_linux @@ -0,0 +1,87 @@ +# This is a Makefile for the ddd program, +# for Linux and the GNU g++ compiler. + +# It does assume a Unix-like setup for some commands, +# but if you only want to call "make" with the default target, +# you should be OK. + +# The test program itself does not use multi-threading, +# but the DLL might, depending on how it was compiled. + +# If your compiler name is not given here, change it. +CC = g++ + +# Use this one to get single-threading +# CC_FLAGS = -O3 -flto -mtune=generic +# Use this one to get OpenMP multi-threading +CC_FLAGS = -O3 -flto -fopenmp -mtune=generic + +# These flags are not turned on by default, but DDS should pass them. +# Turn them on below. +WARN_FLAGS = \ + -Wshadow \ + -Wsign-conversion \ + -pedantic -Wall -Wextra \ + -Wcast-align -Wcast-qual \ + -Wctor-dtor-privacy \ + -Wdisabled-optimization \ + -Winit-self \ + -Wlogical-op \ + -Wmissing-declarations \ + -Wmissing-include-dirs \ + -Wnoexcept \ + -Wold-style-cast \ + -Woverloaded-virtual \ + -Wredundant-decls \ + -Wsign-promo \ + -Wstrict-null-sentinel \ + -Wstrict-overflow=1 \ + -Wswitch-default -Wundef \ + -Werror \ + -Wno-unused \ + -Wno-unknown-pragmas \ + -Wno-long-long \ + -Wno-format + +# Here you can turn on warnings. +# CC_FULL_FLAGS = $(CC_FLAGS) +CC_FULL_FLAGS = $(CC_FLAGS) $(WARN_FLAGS) + +DTEST = ddd + +DLLBASE = dds +STATIC_LIB = lib$(DLLBASE).a + +# This is in addition to $(DTEST).cpp +TEST_SOURCE_FILES = \ + ddd.cpp \ + defs.cpp \ + giblib.cpp \ + rng.cpp \ + timer.cpp + +LIB_FLAGS = -L. -l$(DLLBASE) + +TEST_OBJ_FILES = $(subst .cpp,.o,$(TEST_SOURCE_FILES)) + +ddd: $(TEST_OBJ_FILES) + $(CC) $(CC_FULL_FLAGS) $(TEST_OBJ_FILES) $(LD_FLAGS) $(LIB_FLAGS) -o $(DTEST) + +%.o: %.cpp + $(CC) $(CC_FULL_FLAGS) -c $< -o $*.o + +depend: + makedepend -Y -- $(TEST_SOURCE_FILES) $(DTEST).cpp + +clean: + rm -f $(TEST_OBJ_FILES) $(DTEST) $(STATIC_LIB) + + +# DO NOT DELETE + +ddd.o: dds/include/dll.h portab_DDD.h giblib.h defs.h rng.h timer.h +defs.o: defs.h portab_DDD.h +giblib.o: giblib.h defs.h rng.h +rng.o: portab_DDD.h rng.h +timer.o: portab_DDD.h timer.h +ddd.o: dds/include/dll.h portab_DDD.h giblib.h defs.h rng.h timer.h diff --git a/Makefiles/Makefile_mingw b/Makefiles/Makefile_mingw new file mode 100644 index 0000000..4374fb3 --- /dev/null +++ b/Makefiles/Makefile_mingw @@ -0,0 +1,100 @@ +# This is a Makefile for the ddd test program, +# for Windows and the minGW compiler. + +# It does assume a Unix-like setup for some commands, +# but if you only want to call "make" with the default target, +# you should be OK. + +# The test program itself does not use multi-threading, +# but the DLL might, depending on how it was compiled. + +# If your exact compiler name is not given here, change it. +# CC = mingw32-g++ +CC = i686-w64-mingw32-g++ + +# Use this one to get Windows multi-threading +# CC_FLAGS = -O3 -flto -mtune=generic +# Use this one to get OpenMP multi-threading +CC_FLAGS = -O3 -flto -fopenmp -mtune=generic + +# These flags are not turned on by default, but DDS should pass them. +# Turn them on below. +WARN_FLAGS = \ + -Wshadow \ + -Wsign-conversion \ + -pedantic -Wall -Wextra \ + -Wcast-align -Wcast-qual \ + -Wctor-dtor-privacy \ + -Wdisabled-optimization \ + -Winit-self \ + -Wlogical-op \ + -Wmissing-declarations \ + -Wmissing-include-dirs \ + -Wnoexcept \ + -Wold-style-cast \ + -Woverloaded-virtual \ + -Wredundant-decls \ + -Wsign-promo \ + -Wstrict-null-sentinel \ + -Wstrict-overflow=1 \ + -Wswitch-default -Wundef \ + -Werror \ + -Wno-unused \ + -Wno-unknown-pragmas \ + -Wno-long-long \ + -Wno-format + +# Here you can turn on warnings. +# CC_FULL_FLAGS = $(CC_FLAGS) +CC_FULL_FLAGS = $(CC_FLAGS) $(WARN_FLAGS) + +DTEST = ddd + +DLLBASE = dds +DLL = $(DLLBASE).dll +DLIB = $(DLLBASE).lib +EXPORTER = Exports.def + +TEST_SOURCE_FILES = \ + ddd.cpp \ + defs.cpp \ + giblib.cpp \ + rng.cpp \ + timer.cpp + + +TEST_OBJ_FILES = $(subst .cpp,.o,$(TEST_SOURCE_FILES)) + +LD_FLAGS = \ + -Wl,--subsystem,windows \ + -Wl,--output-def,$(DLLBASE).def \ + -Wl,--dynamicbase \ + -Wl,--nxcompat \ + -Wl,--no-seh \ + -Wl,--enable-stdcall-fixup + +LIB_FLAGS = -L. -l$(DLLBASE) + + +ddd: $(TEST_OBJ_FILES) + $(CC) $(CC_FULL_FLAGS) $(TEST_OBJ_FILES) $(LD_FLAGS) $(LIB_FLAGS) -o $(DTEST) + + +%.o: %.cpp + $(CC) $(CC_FULL_FLAGS) -c $< -o $*.o + +depend: + makedepend -Y -- $(TEST_SOURCE_FILES) $(DTEST).cpp + +clean: + rm -f $(TEST_OBJ_FILES) $(DTEST).{o,exe} $(DLL) $(DLIB) + + +# DO NOT DELETE + +ddd.o: dds/include/dll.h portab_DDD.h giblib.h defs.h rng.h timer.h +defs.o: defs.h portab_DDD.h +giblib.o: giblib.h defs.h rng.h +rng.o: portab_DDD.h rng.h +timer.o: portab_DDD.h timer.h +ddd.o: dds/include/dll.h portab_DDD.h giblib.h defs.h rng.h timer.h diff --git a/README.md b/README.md new file mode 100644 index 0000000..604ca9c --- /dev/null +++ b/README.md @@ -0,0 +1,21 @@ +DDD is a driver for Bo Haglund's [Double Dummy Solver (DDS)](https://github.com/dds-bridge/dds/), written by PM Cronje and relased under the GPL. + +DDD had not really been touched since 2007, and the last readme notes were dated 2006. Those notes are available in the file [readme2006.txt](https://github.com/dds-bridge/ddd/blob/v1.1.0/readme2006.txt). + +This is a light modification in November 2014 to fit with the current structure of DDS, as of v2.8. It expects the DDS 2.8 distribution to be in the `dds/` subdirectory. For convenience it is now on GitHub and includes DDS as a [Git "submodule"](http://git-scm.com/book/en/v2/Git-Tools-Submodules). It should automatically pull down the proper version of DDS if you clone the repository (using `--recurse`). + +Change Summary +============== + +* The code has been modified slightly to compile with the same compilers in the same way as the main DDS library. The set-up with Makefiles in a directory is the same. The code is now compiled against the DLL and is not linked directly with the DDS code. + +* Note that DDD only calls `SolveBoard()` and no other DDS functions. Especially for calculating the DD table for all 20 combinations of declarer and strain, there are now much better functions available. + +* DDD does not make use of the batch processing capability in DDS *(as it probably didn't exist with DDD was written)*. + +* DDD enables the user to walk the DD "tree" interactively. At least when walking "downwards" towards fewer cards, the +`AnalysePlay()` functions can be used. There are excellent visualization tools available, including [DDS Captain](http://www.bridge-captain.com/downloadDD.html), that do this in a graphical way. + +Overall, the code would need a fair amount of work to be a good demonstrator of DDS as of v2.8. For some example programs that show all the new individual functions in DDS, see [DDS's examples directory](https://github.com/dds-bridge/dds/tree/v2.8.0/examples). + +Soren Hein, November 2014 diff --git a/ddd.cpp b/ddd.cpp index 7f5b49f..f0f362a 100644 --- a/ddd.cpp +++ b/ddd.cpp @@ -1,2176 +1,2219 @@ -/* ************************************************************************** - ddd.cpp bridge double dummy driver - PM Cronje June 2006 - - Copyright 2006 P.M.Cronje - - This file is part of the Double Dummer Driver (DDD). - - DDD is a driver for the double dummy solver DDS, - released separately under the GPL by Bo Haglund. - - DDD 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. - - DDD 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 DDD; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - ************************************************************************** */ - -#include -#include -#include -#include -#include -#include - -// ----------------------------------------------------------------------------- - -// HOW TO COMPILE AND LINK THIS WITH THE LATEST VERSION OF DDS -// -// The following is suggested: -// -// - obtain the latest dds11x.cpp and dds11x.h file for version 1.1x -// of Bo Haglund's DDS and copy them into this directory -// -// Linux: compile and link as follows: -// g++ -O2 -Wall -o ./ddd ddd.cpp dds11x.cpp defs.cpp timer.cpp giblib.cpp rng.cpp -// -// Windows: compile and link as follows: -// g++ -O2 -Wall -o ddd.exe ddd.cpp dds11x.cpp defs.cpp timer.cpp giblib.cpp rng.cpp -// -// for debugging change the switch '-O2' to '-g' -// -// Note: on MingW you must have _WIN32 defined to compile code in timer.cpp -// -// ----------------------------------------------------------------------------- - -#include "dds11x.h" -#include "giblib.h" -#include "timer.h" - -#define szVERSION "1.05" -#define szVERSION_DATE "25-Jan-2007" - -/* v1.03 10-Jul-2006 add set tricks to -giblib option - add -tricks option - v1.04 12-Jul-2006 changed giblib to C++ class cGIBLib - (not struct sGIBLIb anymore) - 13-jul-2006 add generateDeal(. ..) in class cGibLib - 14-Jul-2006 add optional flag 'all' for option - -giblib=d1-d2[-all] - changes to szTricks etc. in class cGibLib - 15-Jul-2006 fix 0 elapsed times for -gen - 25-Jan-2007 changes to use dds11x -*/ -// ----------------------------------------------------------------------------- -// solve board status -// ----------------------------------------------------------------------------- - -// solve board status -struct sbstatus -{ int Code; - char szCode[32]; -}; - -#define SBSTATUS_NUM 15 -#define SBSTATUS_MIN -11 -#define SBSTATUS_NOFAULT 12 -#define SBSTATUS_CANCELLED 2 -struct sbstatus szSBStatus[SBSTATUS_NUM] - = { { -11, "invalid status (less than -10)"}, - { -10, "too many cards (more than 52)"}, - { -9, "solutions > 3"}, - { -8, "solutions < 1"}, - { -7, "target > 13"}, - { -6, "invalid status 6"}, - { -5, "target < -1"}, - { -4, "duplicate cards"}, - { -3, "target > number of tricks left"}, - { -2, "number of cards 0"}, - { -1, "unknown fault"}, - { 0, "invalid status 0"}, - { 1, "no fault"}, - { 2, "cancelled 2"}, - { 3, "invalid status > 1"} - }; - -// ----------------------------------------------------------------------------- -// prototypes defined in this file -// ----------------------------------------------------------------------------- - -void cleanSB(); -void getSBScore(const struct futureTricks &fut, int *pmaxscore, - bool bscore[14], ushort m[14][4]); -bool generate(int gen, unsigned int genseed, int gencards, int gentricks); -bool giblib(char *pszfile, int target, int sol, int mode, char *pszgiblib); -FILE *openFile(char *pszfile); -void playDD(cGIBLib *pgib, int target, int sol, int trumps, int leader); -void printSBScore(int target, int solutions, struct futureTricks *pfut, - double elapsed); -void printSBScore(bool bscore[14], ushort m[14][4]); -bool setDDS(cGIBLib *pgib, struct deal *pdl); -bool testSBCode(int sbcode); -bool timeAll(char *pszfile, int trumps, int leader); -bool timeg(char *pszfile, int target, int sol, int mode, - char *pszxcn, int leader, bool bverbose); -bool tricks(cGIBLib *pgib, int ideal, int target, int sol, int mode); - -// ----------------------------------------------------------------------------- -// macros to convert to/from DDS players/cards -// ----------------------------------------------------------------------------- - -#define PLAYER2DDS(pl) ((pl-1)&3) -#define CARD2DDS(card) (14-card) - -#define DDS2PLAYER(ddspl) ((ddspl+1)&3) -#define DDS2CARD(ddscard) (14-ddscard) - -#define szGENFILE "gen.txt" - -// ***************************************************************************** -// DDD definitions -// ***************************************************************************** - -int main(int argc, char *argv[]) -{ - cGIBLib gib; - char *pszfile=0, *pszname=0, *pszxcn=0, *pszgiblib=0; - int iarg, target=-1, solutions=3, mode=1, deal=1, trumps=-1, leader=-1; - int sbcode; - bool bok=false, btimeall=false, bplaydd=false, bverbose=false, btricks=false; - int gen=0, gencards=52, gentricks=1; - unsigned int genseed=0; - FILE *fp; - cTimer timer; - - struct deal dl; - struct futureTricks fut; - - printf("\nDouble Dummy Driver (DDD) version %s (%s)\n", - szVERSION,szVERSION_DATE); - - if(argc < 2) - { printf( - "\n" - "DDD usage:\n" - " ddd_executable file [opts]\n" - "where:\n" - " file : path for 'giblib' input file \n" - "optional arguments [opts] are one or more of: \n" - " -v : verbose where applicable \n" - " -target=d : (default -1), see dll reference \n" - " -sol=d : solution 1/2/3 (default 3), see dll reference \n" - " -mode=d : 0/1 (default 1), see dll reference \n" - " -trumps=t : s/h/d/c/n, this overrides the file (default=n) \n" - " -leader=l : w/n/e/s, this overrides the file (default=w) \n" - " but used only when no cards have been played \n" - " -deal=d : 1/2/... deal number in giblib file \n" - " only one of -deal or -name should be specified \n" - " -name=str : deal with 'name=str' in giblib file \n" - " only one of -deal or -name should be specified \n" - " -playdd : play deal choosing between DDS alternatives \n" - " -timeall : time all deals in file for sol=1/2/3, print stats \n" - " -timeg=xcn : x - hex digit, total tricks by n-s \n" - " c - contract s/h/d/c/n \n" - " n - number of deals \n" - " time the first n deals in the giblib file, \n" - " having total tricks x at contract c, \n" - " for target=-1 sol=1 mode=1 \n" - " and for the specified/default leader,\n" - " each deal is validated \n" - " -giblib=d1-d2[-all] : validate all deals from d1 to d2 in giblib file \n" - " for target=-1 sol=1 mode=1 \n" - " 1. if '-all' is given, this is done for all of \n" - " the 20 trick values even if some of them are '-' \n" - " 2. if '-all' is not given, this is done only for \n" - " those trick values which are not '-' \n" - " -tricks : like -giblib, but for single deal specified \n" - " by -name=str -deal=d or option \n" - " generate deals: \n" - " -gen=n : (required) n=number of deals to generate \n" - " output is written to a file (see below) \n" - " -genseed=s : (default 0) seed for random generator \n" - " -gencards=c : (default=52) number of cards generated per deal,\n" - " must be multiple of 4 \n" - " -gentricks=t : 0,1,...,20 (default 1), number of tricks values \n" - " to set randomly \n" - " generate output is written to a file: \n" - " gen-'genseed'-'ndeal'-'gencards'-'gentricks'.txt \n" - "\n" - ); - return -1; - } - for(iarg=1; iarg 0) - { generate(gen,genseed,gencards,gentricks); - goto cleanup; - } - if(btimeall) - { timeAll(pszfile,trumps,leader); - goto cleanup; - } - else if(pszxcn) - { timeg(pszfile,-1,1,1,pszxcn,(leader==-1?0:leader),bverbose); - goto cleanup; - } - else if(pszgiblib) - { giblib(pszfile,-1,1,1,pszgiblib); - goto cleanup; - } - - // open file - fp = openFile(pszfile); - if(fp == 0) - return -1; - - // read giblib deal - bok = gib.readFile(deal-1,pszname,fp); - fclose(fp); - if(!bok) - { printf("%s",gib.szErrMsg); - return -1; - } - - if(btricks) - { tricks(&gib,deal,-1,1,1); - goto cleanup; - } - - // if overridden from command line, set trumps/leader - if(trumps != -1) - gib.Trumps = trumps; - if((gib.nPlayed == 0) && (leader != -1)) - { // override leader/player only when no cards have been played - gib.Leader = gib.Player = leader; - } - - if(bplaydd) - { playDD(&gib,target,solutions,trumps,leader); - goto cleanup; - } - - // set up dds10 - if(setDDS(&gib,&dl) == false) - return -1; - - printf("\n"); - gib.print(); - printf("\n"); - gib.printHands(); - gib.printInfo(); - printf("\n"); - fflush(stdout); - - timer.start(); - InitStart(); - sbcode = SolveBoard(dl,target,solutions,mode,&fut); - timer.check(); - if(testSBCode(sbcode) == false) - exit(-1); - printSBScore(target,solutions,&fut,timer.dblElapsed()); - - cleanup: - cleanSB(); - - return 0; - -} // main -// ***************************************************************************** - -void cleanSB() -{ - // this is the detach code from DDS - - if(bestMove) - free(bestMove); - bestMove = 0; - if(nodeCards) - free(nodeCards); - nodeCards = 0; - if(winCards) - free(winCards); - winCards = 0; - if(ttStore) - free(ttStore); - ttStore = 0; - if(rel) - free(rel); - rel = 0; - -} // cleanSB -// ***************************************************************************** - -bool generate(int gen, unsigned int genseed, int gencards, int gentricks) -{ - // generate deals - // write giblib extended format to specified file - - cGIBLib gib; - int ntrick, sbcode, ideal, trickpos, trumps, leader; - int settrick[20], setpos[20], nsettrick, itrick; - int maxscore, nerror, score, ntotal; - bool bscore[14]; - ushort m[14][4]; - - FILE *fp; - cTimer timer; - struct deal dl; - struct futureTricks fut; - - double elapsed, totalelapsed; - unsigned long long nodes, totalnodes; - char sz1[32], szfile[256]; - - int target=-1, sol=1, mode=1; - - // check arguments - sprintf(szfile,"gen-%u-%d-%d-%d.txt",genseed,gen,gencards,gentricks); - // if existing file, warn the user - if(access(szfile,F_OK) == 0) - { printf("\n*** WARNING: generate deals\n" - " the file '%s' is an existing file\n" - " and it may be overwritten\n" - "do you want to continue? (y/n)):",szfile); - fflush(stdout); - char buf[80], *pch; - pch = fgets(buf,255,stdin); - if(pch == 0) - return false; - if(tolower(*pch) != 'y') - return false; - } - - if(gen < 0) - { printf("*** error: gen=%d invalid number of deals to generate\n",gen); - return false; - } - if((gencards < 4) || (gencards > 52)) - { printf("*** error: gencards=%d must be >=4 and <=52\n",gencards); - return false; - } - if((gencards % 4) != 0) - { printf("*** error: gencards=%d not a multiple ofg 4\n",gencards); - return false; - } - if((gentricks < 0) || (gentricks > 20)) - { printf("*** error: gentricks=%d must be >=0 and <=20\n",gentricks); - return false; - } - - fp = fopen(szfile,"w"); - if(fp == 0) - { printf("*** error: %s: cannot open gen file %s for writing\n", - strerror(errno),szfile); - return false; - } - - printf("\ngenerate: seed=%u deals=%d cards=%d tricks=%d file=%s\n", - genseed,gen,gencards,gentricks,szfile); - fflush(stdout); - - gib.setRNGSeed(genseed); - - timer.start(); - - nerror = ntotal = 0; - elapsed = totalelapsed = 0; - nodes = totalnodes = 0; - - for(ideal=0; ideal 0) - { - // initialize trick positions - for(trickpos=0; trickpos<20; trickpos++) - settrick[trickpos] = trickpos; - nsettrick = 20; - - // get sorted trick positions - for(itrick=0; itrickrandomUint(nsettrick); - setpos[itrick] = settrick[trickpos]; - if(trickpos < nsettrick-1) - memmove(settrick+trickpos,settrick+trickpos+1, - (nsettrick-1-trickpos)*sizeof(int)); - nsettrick--; - } - - // compute trick values - for(itrick=0; itrick= 0) - score = ((gib.Leader & 1) ? score: gib.numCard()/4-score); - - timer.check(); - nodes = (unsigned long long)fut.nodes; - totalnodes += nodes; - elapsed = timer.dblDeltaElapsed(); - - printf(" deal=%d leader=%c %d%c nodes=%s elapsed=%0.2lf\n", - ideal+1,chPLAYER[gib.Leader],score,(trumps==4)?'N':chSUIT[trumps], - format64(nodes,sz1),elapsed); - - if(score < 10) - gib.szTricks[trickpos] = (score + '0'); - else - gib.szTricks[trickpos] = (score -10 + 'A'); - } - } - - // write the deal to file - fprintf(fp,"%s:%s\n",gib.szDeal,gib.szTricks); - // flush file, so that cancel does not lose data - fflush(fp); - - // print the deal - printf("%d %s:%s\n",ideal+1,gib.szDeal,gib.szTricks); - } - - timer.check(); - totalelapsed = timer.dElapsed; - printf("deals=%d nodes=%s elapsed=%0.2lf\n" - "output written to file %s\n", - gen,format64(totalnodes,sz1), - totalelapsed,szfile); - - fclose(fp); - return true; - -} // generate -// ***************************************************************************** - -void getSBScore(const struct futureTricks &fut, int *pmaxscore, - bool bscore[14], ushort m[14][4]) -{ - // get DDS 'score' after SolveBoard(..) has been run - - int iscore, suit, alt; - - for(iscore=0; iscore<14; iscore++) - bscore[iscore] = false; - memset(m,0,14*4*sizeof(ushort)); - *pmaxscore = -1; - - for(alt=0; alt ideal2) - { printf("*** error: giblib=%s ideal1 > ideal2\n",pszgiblib); - return false; - } - ball = false; - pch = strchr(pch,'-'); - if(pch) - { if(strcmp(pch,"-all") != 0) - { printf("*** error: giblib=%s expected '-all' after ideal2\n",pszgiblib); - return false; - } - ball = true; - } - - fp = openFile(pszfile); - if(fp == 0) - return false; - - printf("\n" - "giblib=%s target=%d sol=%d mode=%d\n",pszgiblib,target,sol,mode); - fflush(stdout); - - timer.start(); - - nerror = ntotal = 0; - elapsed = totalelapsed = 0; - nodes = totalnodes = 0; - - // skip to startdeal - for(ideal=1; ideal= 0) - score = ((gib.Leader & 1) ? score: gib.numCard()/4-score); - - nodes = (unsigned long long)fut.nodes; - dealnodes += nodes; - totalnodes += nodes; - elapsed = timer.dblDeltaElapsed(); - dealelapsed += elapsed; - totalelapsed += elapsed; - - if(gib.szTricks[trickpos] != '-') - { printf(" deal=%d leader=%c %d%c score=%d nodes=%s elapsed=%0.2lf\n", - ideal,chPLAYER[gib.Leader],tricks,(trumps==4)?'N':chSUIT[trumps], - score,format64(nodes,sz1),elapsed); - bok = true; - - // test that tricks and score agree - if((score < 0) || score != tricks) - { nerror++; - bok = false; - printf(" error: deal=%d leader=%c %d%c score=%d\n", - ideal,chPLAYER[gib.Leader],tricks,(trumps==4)?'N':chSUIT[trumps], - score); - } - } - else - { printf(" deal=%d leader=%c %d%c nodes=%s elapsed=%0.2lf\n", - ideal,chPLAYER[gib.Leader],score,(trumps==4)?'N':chSUIT[trumps], - format64(nodes,sz1),elapsed); - bok = false; - } - if(bok == false) - { if(score < 10) - gib.szTricks[trickpos] = (char)(score + (int)'0'); - else - gib.szTricks[trickpos] = (char)(score - 10 + (int)'A'); - } - ntotal++; - } - - printf(" deal=%d nodes=%s elapsed=%0.2lf totalelapsed=%0.2lf\n" - " ", - ideal,format64(dealnodes,sz1),dealelapsed,totalelapsed); - if(strlen(gib.pszName)) - printf("name=%s ",gib.pszName); - printf("tricks=%s (max=%d)\n", - gib.szTricks,gib.numCard()/4); - } - - printf("deals=%s nodes=%s avg=%s elapsed=%0.2lf avg=%.02lf\n", - pszgiblib,format64(totalnodes,sz1), - ntotal?format64(totalnodes/ntotal,sz2):format64(totalnodes,sz2), - totalelapsed,ntotal?totalelapsed/(double)ntotal:totalelapsed); - if(nerror) - printf("*** ERROR: nerror=%d, tricks and score different\n",nerror); - printf("\n"); - - fclose(fp); - - return true; - -} // giblib -// ***************************************************************************** - -FILE *openFile(char *pszfile) -{ - if(pszfile == 0) - { printf("*** error: no 'giblib' file specified\n"); - return 0; - } - if(access(pszfile,F_OK) != 0) - { printf("*** error: non-existing file %s\n",pszfile); - return 0; - } - FILE *fp = fopen(pszfile,"r"); - if(fp == 0) - { printf("*** error: %s: cannot open file %s for reading\n", - strerror(errno),pszfile); - return 0; - } - - return fp; - -} // openFile -// ***************************************************************************** - -void playDD(cGIBLib *pgib, int target, int sol, int trumps, int leader) -{ - cTimer timer; - double elapsed=0; - struct deal dl; - struct futureTricks fut; - int sbcode, suit, card, ntotalcard; - char *pch, *pchend, buf[80]; - bool bhelp=false, bcompute=true; - char *szplayer[4] = {"west","north","east","south"}; - - printf("\n"); - pgib->print(); - printf("\n"); - - timer.start(); - for(;;) - { - pgib->printHands(); - pgib->printInfo(); - printf("\n"); - fflush(stdout); - - ntotalcard = pgib->numCard(); - if(ntotalcard) - { // DDS only when there are cards left to play - if(bcompute) - { // set up dds10 - if(setDDS(pgib,&dl) == false) - return; - - timer.check(); - InitStart(); - sbcode = SolveBoard(dl,target,sol,1,&fut); - timer.check(); - if(testSBCode(sbcode) == false) - exit(-1); - elapsed += timer.dblDeltaElapsed(); - } - printSBScore(target,sol,&fut,elapsed); - } - - if(bhelp) - { printf("help for options:\n" - " 'q' - quit \n" - " 'h' - print this help \n" - " 'u' - unplay previous card (if available) \n" - " 'sc' - card/suit to play, e.g. dq/ht/s3\n" - " must be valid for current player \n" - ); - bhelp = false; - } - - bcompute = false; - if(ntotalcard > 0) - printf("enter options for %s ",szplayer[pgib->Player]); - else - printf("enter options "); - if(ntotalcard <= 0) - printf("(q/h/u): "); - else if(pgib->nPlayed > 0) - printf("(q/h/u/sc): "); - else - printf("(q/h/sc): "); - fflush(stdout); - pch = fgets(buf,255,stdin); - if(pch == 0) - continue; - pchend = strchr(buf,'\n'); - if(pchend) - *pchend = '\0'; - pchend = strchr(buf,'\r'); - if(pchend) - *pch = '\0'; - while(*pch == ' ') - pch++; - if(*pch == '\0') - continue; - if(*pch == 'q') - break; - else if((pch[0] == 'h') && ((pch[1] == ' ') || (pch[1] == '\0'))) - { bhelp = true; - continue; - } - else if((pgib->nPlayed > 0) && (*pch == 'u')) - { if(pgib->unplayCard()) - bcompute = true; - } - else if(ntotalcard) - { if(tolower(pch[0]) == 's') suit = 0; - else if(tolower(pch[0]) == 'h') suit = 1; - else if(tolower(pch[0]) == 'd') suit = 2; - else if(tolower(pch[0]) == 'c') suit = 3; - else - continue; - pch++; - card = (int)cGIBLib::getCard(pch[0]); - if(card == eCARD_NONE) - continue; - - // play the card - pgib->SuitPlayed[pgib->nPlayed] = suit; - pgib->CardPlayed[pgib->nPlayed] = card; - if(pgib->playCard(suit,card)) - bcompute = true; - } - } - -} // playDD -// ***************************************************************************** - -void printSBScore(int target, int solutions, struct futureTricks *pfut, - double elapsed) -{ - // print DDS 'score' after SolveBoard(..) has been run - - char sz1[32]; - bool bscore[14]; - ushort m[14][4]; - int maxscore; - - printf("-- sb completed: nodes=%s tgt=%d sol=%d alt=%d elapsed=%0.2lf\n", - format(pfut->nodes,sz1),target,solutions,pfut->cards,elapsed); - getSBScore(*pfut,&maxscore,bscore,m); - printSBScore(bscore,m); - -} // printSBScore -// ***************************************************************************** - -void printSBScore(bool bscore[14], ushort m[14][4]) -{ - int iscore, suit, nscore=0; - - for(iscore=0; iscore<14; iscore++) - { if(bscore[iscore]) - { nscore++; - printf(" %2d: ",iscore); - for(suit=0; suit<4; suit++) - { if(m[iscore][suit]) - { printf("%c ",chSUIT[suit]); - while(m[iscore][suit]) - { int c = leastSignificant1Bit(m[iscore][suit]); - clearBit(m[iscore][suit],c); - printf("%c",chCARD[c]); - } - printf(" "); - } - } - printf("\n"); - } - } - - if(nscore == 0) - printf(" none\n"); - -} // printSBScore -// ***************************************************************************** - -bool setDDS(cGIBLib *pgib, struct deal *pdl) -{ - // setup deal structure for DDS - - int pl, suit, ntrick, ntrickcard; - int lastsuit, lastcard, card; - - pdl->trump = pgib->Trumps; // s=0,h=1,d=2,c=3,nt=4 - - // remaining cards from partial trick - ntrick = (pgib->nPlayed / 4); - ntrickcard = (pgib->nPlayed - 4 * ntrick); - memset(pdl->currentTrickSuit,0,3*sizeof(int)); - memset(pdl->currentTrickRank,0,3*sizeof(int)); - if(ntrickcard > 0) - { for(pl=0; plSuitPlayed[4*ntrick+pl]; - lastcard = pgib->CardPlayed[4*ntrick+pl]; - pdl->currentTrickSuit[pl] = lastsuit; - pdl->currentTrickRank[pl] = CARD2DDS(lastcard); - } - } - - // DDS leader - pdl->first = PLAYER2DDS(pgib->Leader); // n=0,e=1,s=2,w=3 - - // DDS remaining cards - for(pl=0; pl<4; pl++) - { int ddspl = PLAYER2DDS(pl); - for(suit=0; suit<4; suit++) - { ushort m=0, mp=pgib->mPlayerSuit[pl][suit]; - while(mp) - { card = leastSignificant1Bit(mp); - clearBit(mp,card); - setBit(m,CARD2DDS(card)); - } - pdl->remainCards[ddspl][suit] = (unsigned int)m; - } - } - - return true; - -} // setDDDS -// ***************************************************************************** - -bool testSBCode(int sbcode) -{ - // test DDS return code after SolveBoard(..) has been run - - if(sbcode < SBSTATUS_MIN) - sbcode = SBSTATUS_MIN; - else if(sbcode >= SBSTATUS_MIN+SBSTATUS_NUM) - sbcode = SBSTATUS_MIN + SBSTATUS_NUM - 1; - sbcode -= SBSTATUS_MIN; - if(sbcode != SBSTATUS_NOFAULT) - { printf("*** error: %s\n",szSBStatus[0].szCode); - return false; - } - - return true; - -} // testSBCode -// ***************************************************************************** - -bool timeAll(char *pszfile, int trumps, int leader) -{ - // run all deals in giblib file for sol=1/2/3, - // collect and print the stats - - cGIBLib gib; - int sbcode, ideal; - bool bok=false; - FILE *fp; - cTimer timer; - struct deal dl; - struct futureTricks fut; - - double totalelapsed=0.0, elapsed[3]={0.0,0.0,0.0}; - unsigned long long totalnodes=0, nodes[3]={0,0,0}; - - #define LEN_RESULTNAME 15 - struct sResult - { int nNode[3]; - double Elapsed[3]; - char szName[LEN_RESULTNAME+1]; - }; - - #define MAX_RESULT 10 - int sol, target=-1, mode=1, ndealalloc=0, ndeal, nresult=0; - struct sResult *presult=0; - - for(sol=1; sol<=3; sol++) - { ndeal = 0; - for(;;) - { // loop over deals in file - - // open file - fp = openFile(pszfile); - if(fp == 0) - return false; - - // read giblib deal - bok = gib.readFile(ndeal,0,fp); - fclose(fp); - if(!bok) - break; - - if(trumps != -1) - gib.Trumps = trumps; - if(leader != -1) - gib.Leader = leader; - - printf("\n"); - gib.print(); - printf("\n"); - gib.printHands(); - gib.printInfo(); - printf("\n"); - fflush(stdout); - - // set up dds10 - if(setDDS(&gib,&dl) == false) - return false; - - timer.start(); - InitStart(); - sbcode = SolveBoard(dl,target,sol,mode,&fut); - timer.check(); - if(testSBCode(sbcode) == false) - return false; - printSBScore(target,sol,&fut,timer.dblElapsed()); - - if(ndeal >= ndealalloc) - { presult = (struct sResult*)realloc(presult, - (ndealalloc+25)*sizeof(struct sResult)); - if(presult == 0) - { printf("*** error: cannot allocate result array\n"); - return false; - } - ndealalloc += 25; - } - - presult[ndeal].nNode[sol-1] = fut.nodes; - presult[ndeal].Elapsed[sol-1] = timer.dblElapsed(); - strncpy(presult[ndeal].szName,gib.pszName,LEN_RESULTNAME); - presult[ndeal].szName[LEN_RESULTNAME] = '\0'; - ndeal++; - if(nresult < ndeal) - nresult = ndeal; - - totalnodes += (unsigned long long)fut.nodes; - nodes[sol-1] += (unsigned long long)fut.nodes; - totalelapsed += timer.dblElapsed(); - elapsed[sol-1] += timer.dblElapsed(); - } - } - - // print the results - printf("\n" - "test sol=1 sol=2 sol=3\n" - "--------- ---------------- ---------------- ---------------\n" - ); - for(ideal=0; ideal=3\n",pszxcn); - return false; - } - optx = pszxcn[0]; - if(!isxdigit(optx)) - { printf("*** error: timeg optionX=%c is not hex digit 3\n",optx); - return false; - } - if((tolower(optx)=='e') || (tolower(optx)=='f')) - { printf("*** error: timeg optionX=%c more than 13 tricks\n",optx); - return false; - } - optx = tolower(optx); - tricks = ((int)optx - (int)'0'); - if((tricks < 0) || (tricks > 9)) - tricks = ((int)optx - (int)'a' + 10); - - if(pszxcn[1] == 's') contract = 0; - else if(pszxcn[1] == 'h') contract = 1; - else if(pszxcn[1] == 'd') contract = 2; - else if(pszxcn[1] == 'c') contract = 3; - else if(pszxcn[1] == 'n') contract = 4; - else - { printf("*** error: timeg contract=%c is not s/h/d/c/n\n",pszxcn[1]); - return false; - } - ndeal = atol(pszxcn+2); - if(ndeal <= 0) - { printf("*** error: timeg ndeal=%d is not >= 0\n",ndeal); - return false; - } - - if(contract == 4) - trickpos = 0; // nt - else - trickpos = 4 + 4 * contract; // s/h/d/c - // giblib leader goes s/e/n/w - // our leader goes w/n/e/s - trickpos += (3 - leader); - - fp = openFile(pszfile); - if(fp == 0) - return false; - - printf("\n" - "timeg tricks=%d contract=%c deals=%d target=%d sol=%d mode=%d leader=%c\n", - tricks,"shdcn"[contract],ndeal,target,sol,mode,chPLAYER[leader]); - fflush(stdout); - - timer.start(); - - ideal = currentdeal = nerror = 0; - for(;;) - { // loop over deals in file - - // read giblib deal - bok = gib.readDeal(fp); - if(!bok) - break; - if(gib.setDeal() == false) - break; - - currentdeal++; - - if(optx != tolower(gib.szTricks[trickpos])) - continue; - - ideal++; - // set up dds10 - gib.Trumps = contract; - if(leader != -1) - gib.Leader = leader; - if(setDDS(&gib,&dl) == false) - return false; - - InitStart(); - sbcode = SolveBoard(dl,target,sol,mode,&fut); - timer.check(); - if(testSBCode(sbcode) == false) - return false; - - getSBScore(fut,&maxscore,bscore,m); - if(maxscore < 0) - { nerror++; - printf("\r --- error: deal=%d ndeal=%d no score\n", - currentdeal,ideal); - } - else - { score = maxscore; - if(score >= 0) - //score = ((leader & 1) ? gib.numCard()/4-score : score); - score = ((leader & 1) ? score: gib.numCard()/4-score); - if((score < 0) || score != tricks) - { nerror++; - printf("\r --- error: deal=%d ndeal=%d tricks=%d score=%d\n", - currentdeal,ideal,tricks,score); - } - } - - if(!bverbose) - printf("\r"); - printf(" deal=%d ndeal=%d nodes=%s elapsed=%0.2lf", - currentdeal,ideal,format64(fut.nodes,sz1),timer.deltaElapsed); - if(!bverbose) - printf(" "); - else - printf("\n"); - fflush(stdout); - - nodes += (unsigned long long)fut.nodes; - elapsed += timer.dblDeltaElapsed(); - - if(minnode > fut.nodes) - minnode = fut.nodes; - if(maxnode < fut.nodes) - maxnode = fut.nodes; - - if(minelapsed > timer.deltaElapsed) - minelapsed = timer.deltaElapsed; - if(maxelapsed < timer.deltaElapsed) - maxelapsed = timer.deltaElapsed; - - if(ideal >= ndeal) - break; - } - if(ideal <= 0) - printf("no deals found\n"); - else - { printf("\rdeals=%d nodes=%s elapsed=%0.2lf \n", - ndeal,format64(nodes,sz1),elapsed); - printf("min_node=%s max_node=%s avg=%s\n", - format(minnode,sz1),format(maxnode,sz2), - format((ideal>0)?nodes/ideal:nodes,sz3)); - printf("min_elapsed=%0.2lf max_elapsed=%0.2lf avg=%0.2lf\n", - minelapsed,maxelapsed,(elapsed>0.0)?elapsed/(double)ideal:elapsed); - } - if(nerror) - printf("*** ERROR: nerror=%d, incorrect maximum tricks\n",nerror); - else - printf("errors=0\n"); - printf("\n"); - - fclose(fp); - - return true; - -} // timeg -// ***************************************************************************** - -bool tricks(cGIBLib *pgib, int ideal, int target, int sol, int mode) -{ - // run deal in giblib file for all possible tricks, - // collect and print the stats - - int sbcode, trickpos, trumps; - int maxscore, score; - bool bscore[14]; - ushort m[14][4]; - - cTimer timer; - struct deal dl; - struct futureTricks fut; - - double elapsed, dealelapsed, totalelapsed; - unsigned long long nodes, dealnodes, totalnodes; - char sz1[32]; - - if(pgib->pszName && strlen(pgib->pszName)) - printf("\nname=%s",pgib->pszName); - else - printf("\ndeal=%d",ideal); - printf(" target=%d sol=%d mode=%d\n",target,sol,mode); - fflush(stdout); - - timer.start(); - - elapsed = totalelapsed = 0; - nodes = totalnodes = 0; - - dealnodes = 0; - dealelapsed = 0.0; - - memset(pgib->szTricks,'-',20); - pgib->szTricks[20] = '\0'; - - for(trickpos=0; trickpos<20; trickpos++) - { - if(trickpos < 4) - trumps = 4; - else - trumps = (trickpos - 4) / 4; - - // set up dds10 - pgib->Trumps = trumps; - pgib->Leader = 3 - (trickpos % 4); - if(setDDS(pgib,&dl) == false) - return false; - - InitStart(); - sbcode = SolveBoard(dl,target,sol,mode,&fut); - timer.check(); - if(testSBCode(sbcode) == false) - return false; - - getSBScore(fut,&maxscore,bscore,m); - if(maxscore < 0) - { printf("*** error: leader=%c no score\n", - chPLAYER[pgib->Leader]); - return false; - } - score = maxscore; - if(score >= 0) - score = ((pgib->Leader & 1) ? score: pgib->numCard()/4-score); - - nodes = (unsigned long long)fut.nodes; - dealnodes += nodes; - totalnodes += nodes; - elapsed = timer.dblDeltaElapsed(); - dealelapsed += elapsed; - totalelapsed += elapsed; - - printf(" leader=%c %d%c nodes=%s elapsed=%0.2lf\n", - chPLAYER[pgib->Leader],score,(trumps==4)?'N':chSUIT[trumps], - format64(nodes,sz1),elapsed); - - if(score < 10) - pgib->szTricks[trickpos] = (char)(score + (int)'0'); - else - pgib->szTricks[trickpos] = (char)(score - 10 + (int)'A'); - } - printf("nodes=%s elapsed=%0.2lf totalelapsed=%0.2lf\n", - format64(dealnodes,sz1),dealelapsed,totalelapsed); - - printf("\n"); - pgib->printHands(); - printf("\n"); - if(pgib->pszName && strlen(pgib->pszName)) - printf("name=%s",pgib->pszName); - else - printf("deal=%d",ideal); - printf(" tricks(leader=senw):"); - for(trickpos=0; trickpos<20; trickpos++) - { if((trickpos%4) == 0) - { if(trickpos == 0) - printf(" n="); - else if(trickpos == 4) - printf(" s="); - else if(trickpos == 8) - printf(" h="); - else if(trickpos == 12) - printf(" d="); - else if(trickpos == 16) - printf(" c="); - } - printf("%c",pgib->szTricks[trickpos]); - } - printf(" (max=%d)\n\n",pgib->numCard()/4); - - return true; - -} // tricks -// ***************************************************************************** -/* -================================================================================ -output for: test.gib -timeall -================================================================================ - -test sol=1 sol=2 sol=3 ---------- ---------------- ---------------- --------------- -gib2 13 0.02 17 0.02 17 0.02 -gib3 55 0.02 74 0.03 74 0.02 -gib4 144 0.02 239 0.02 290 0.02 -gib5 283 0.02 828 0.03 1,321 0.02 -gib10 24,616 0.05 56,172 0.09 73,522 0.10 -gin 17,372 0.05 330,860 0.37 836,869 0.96 -dbldum1 1,806 0.03 3,052 0.03 3,084 0.03 -dbldum2 272,365 0.25 767,339 0.71 767,339 0.69 -devil1 94,935 0.12 179,691 0.21 336,969 0.34 -callahan 502,044 0.60 1,303,934 1.99 1,679,319 2.33 -g410-scc 121,233 0.15 140,942 0.20 464,298 0.45 -giblibno1 4,026,572 5.01 6,887,233 9.50 8,470,777 11.83 -giblibno2 469,241 0.48 586,377 0.61 586,377 0.60 -bo17 578,078 0.69 1,342,200 1.64 1,813,889 2.06 -bo21 2,614,869 3.65 3,229,875 4.45 6,668,155 9.07 -giblib1 70,093 0.10 158,829 0.20 158,829 0.18 -giblib2 1,362,230 1.34 1,698,895 1.68 7,052,520 6.82 -giblib3 178,884 0.18 477,891 0.38 477,899 0.39 -giblib4 148,267 0.16 345,545 0.35 1,523,658 1.43 -giblib5 997,945 1.00 3,119,281 3.24 3,119,281 3.24 -giblib6 1,634,670 1.60 3,446,862 3.70 3,805,367 3.85 -giblib7 116,215 0.16 575,832 0.67 606,341 0.64 -giblib8 188,369 0.20 1,115,375 1.08 1,115,375 1.06 -giblib9 1,287,045 1.33 2,542,975 2.88 4,461,078 5.17 -giblib10 141,894 0.41 440,351 0.49 872,148 0.91 - - nodes: total=88,494,703 sol-1=14,849,238 sol-2=28,750,669 sol-3=44,894,796 -elapsed: total=104.43 sol-1=17.65 sol-2=34.56 sol-3=52.23 - -================================================================================ -output for: ../giblib -sol=1 -v -timeg=9n10 -================================================================================ - -timeg tricks=9 contract=n deals=10 target=-1 sol=1 mode=1 leader=W - deal=4 ndeal=1 nodes=148,267 elapsed=0.17 - deal=5 ndeal=2 nodes=997,945 elapsed=1.02 - deal=8 ndeal=3 nodes=188,369 elapsed=0.20 - deal=56 ndeal=4 nodes=2,496,093 elapsed=2.88 - deal=68 ndeal=5 nodes=1,942,886 elapsed=2.07 - deal=81 ndeal=6 nodes=595,946 elapsed=0.57 - deal=94 ndeal=7 nodes=910,639 elapsed=1.07 - deal=99 ndeal=8 nodes=2,916,346 elapsed=3.54 - deal=103 ndeal=9 nodes=247,399 elapsed=0.26 - deal=116 ndeal=10 nodes=353,807 elapsed=0.38 -deals=10 nodes=10,797,697 elapsed=12.16 -min_node=148,267 max_node=2,916,346 avg=1,079,769 -min_elapsed=0.17 max_elapsed=3.54 avg=1.22 -errors=0 - -================================================================================ -output for: ../giblib -giblib=1-1 -================================================================================ - -giblib=1-1 target=-1 sol=1 mode=1 - deal=1 leader=S 8N score=8 nodes=76,507 elapsed=0.10 - deal=1 leader=E 8N score=8 nodes=73,856 elapsed=0.10 - deal=1 leader=N 8N score=8 nodes=66,062 elapsed=0.09 - deal=1 leader=W 8N score=8 nodes=70,093 elapsed=0.10 - deal=1 leader=S 7S score=7 nodes=633,804 elapsed=0.77 - deal=1 leader=E 7S score=7 nodes=227,684 elapsed=0.26 - deal=1 leader=N 7S score=7 nodes=617,829 elapsed=0.78 - deal=1 leader=W 7S score=7 nodes=239,070 elapsed=0.28 - deal=1 leader=S 10H score=10 nodes=44,135 elapsed=0.07 - deal=1 leader=E 9H score=9 nodes=64,593 elapsed=0.10 - deal=1 leader=N 10H score=10 nodes=25,802 elapsed=0.05 - deal=1 leader=W 9H score=9 nodes=66,538 elapsed=0.10 - deal=1 leader=S 7D score=7 nodes=710,876 elapsed=0.95 - deal=1 leader=E 7D score=7 nodes=129,917 elapsed=0.17 - deal=1 leader=N 7D score=7 nodes=740,822 elapsed=1.00 - deal=1 leader=W 7D score=7 nodes=156,316 elapsed=0.20 - deal=1 leader=S 8C score=8 nodes=287,964 elapsed=0.31 - deal=1 leader=E 8C score=8 nodes=234,815 elapsed=0.26 - deal=1 leader=N 8C score=8 nodes=367,526 elapsed=0.39 - deal=1 leader=W 8C score=8 nodes=128,382 elapsed=0.16 - deal=1 nodes=4,962,591 elapsed=6.25 totalelapsed=6.25 - tricks=88887777A9A977778888 (max=13) -deals=1-1 nodes=4,962,591 avg=248,129 elapsed=6.25 avg=0.31 - -================================================================================ -output for: test.gib -tricks -name=gin -================================================================================ - -name=gin target=-1 sol=1 mode=1 - leader=S 9N nodes=252,521 elapsed=0.32 - leader=E 9N nodes=538,589 elapsed=0.59 - leader=N 9N nodes=276,076 elapsed=0.35 - leader=W 8N nodes=17,372 elapsed=0.05 - leader=S 9S nodes=1,268,000 elapsed=2.08 - leader=E 8S nodes=1,726,949 elapsed=2.50 - leader=N 9S nodes=695,799 elapsed=0.96 - leader=W 8S nodes=1,656,521 elapsed=2.83 - leader=S 9H nodes=476,674 elapsed=0.59 - leader=E 9H nodes=531,859 elapsed=0.61 - leader=N 9H nodes=437,013 elapsed=0.53 - leader=W 9H nodes=298,225 elapsed=0.33 - leader=S 6D nodes=474,565 elapsed=0.57 - leader=E 6D nodes=238,345 elapsed=0.29 - leader=N 6D nodes=370,831 elapsed=0.44 - leader=W 6D nodes=60,061 elapsed=0.09 - leader=S 7C nodes=1,118,923 elapsed=1.46 - leader=E 7C nodes=1,074,097 elapsed=1.27 - leader=N 7C nodes=1,267,293 elapsed=1.70 - leader=W 7C nodes=587,523 elapsed=0.62 -nodes=13,367,236 elapsed=18.18 totalelapsed=18.18 - - K Q 9 - A Q J - 9 6 4 3 2 - 8 6 - T 6 8 7 3 2 - T 9 2 7 5 3 - T A K Q J 8 5 - A J T 9 5 3 2 - - A J 5 4 - K 8 6 4 - 7 - K Q 7 4 - -name=gin tricks(leader=senw): n=9998 s=9898 h=9999 d=6666 c=7777 (max=13) - -dds/jack database format: -------------------------- -deal: A873.QJ8.T832.42 T52.965.J76.JT86 KJ96.K7.AQ.A9753 Q4.AT432.K954.KQ - -sol=3 -contract:hearts play:W - 6: D T - 7: S A873 H QJ8 D 832 C 42 -contract:hearts play:N - 5: D J - 6: S T52 H 965 D 76 C JT86 -contract:hearts play:E - 7: S KJ96 H K7 D AQ C A9753 -contract:hearts play:S - 5: D K954 - 6: S Q4 H AT432 C KQ - -db row for sol=3: -A873.QJ8.T832.42 T52.965.J76.JT86 KJ96.K7.AQ.A9753 Q4.AT432.K954.KQ:H: -7777777677777666666566666677777777777776666666555566 - -================================================================================ -dds10x output for: test.gib -timeall -================================================================================ - -test sol=1 sol=2 sol=3 ---------- ---------------- ---------------- --------------- -gib2 13 0.02 17 0.02 17 0.02 -gib3 55 0.02 74 0.02 74 0.02 -gib4 132 0.02 220 0.03 267 0.02 -gib5 232 0.02 677 0.02 1,091 0.03 -gib10 23,990 0.05 54,710 0.09 71,783 0.10 -gin 12,536 0.05 301,204 0.36 712,655 0.82 -dbldum1 1,320 0.03 2,045 0.02 2,070 0.03 -dbldum2 271,126 0.26 761,667 0.75 761,667 0.72 -devil1 80,278 0.11 145,941 0.17 279,078 0.30 -callahan 373,482 0.47 987,935 1.54 1,273,233 1.87 -g410-scc 82,136 0.12 98,589 0.13 324,586 0.41 -giblibno1 2,905,488 3.92 5,015,652 7.65 6,153,242 9.48 -giblibno2 339,994 0.38 440,591 0.49 440,591 0.49 -bo17 448,820 0.56 985,737 1.23 1,378,182 1.62 -bo21 2,103,531 3.08 2,622,826 3.82 5,511,592 7.83 -giblib1 39,201 0.08 97,312 0.13 97,312 0.14 -giblib2 838,043 0.95 1,081,582 1.19 5,357,787 5.55 -giblib3 118,210 0.12 310,481 0.28 310,487 0.28 -giblib4 113,139 0.14 210,143 0.23 1,155,003 1.14 -giblib5 720,826 0.77 2,301,738 2.66 2,301,738 2.60 -giblib6 813,750 0.90 1,629,511 1.92 1,837,380 2.04 -giblib7 89,093 0.12 443,105 0.51 469,467 0.54 -giblib8 137,034 0.20 751,701 0.81 751,701 0.78 -giblib9 936,282 1.05 1,734,880 2.02 3,170,680 3.77 -giblib10 117,587 0.15 371,259 0.44 710,326 0.79 - nodes: total=63,987,904 sol-1=10,566,298 sol-2=20,349,597 sol-3=33,072,009 -elapsed: total=81.50 sol-1=13.60 sol-2=26.52 sol-3=41.38 - -================================================================================ -dds10x output for: ../giblib -sol=1 -v -timeg=9n10 -================================================================================ - -timeg tricks=9 contract=n deals=10 target=-1 sol=1 mode=1 leader=W - deal=4 ndeal=1 nodes=113,139 elapsed=0.14 - deal=5 ndeal=2 nodes=720,826 elapsed=0.79 - deal=8 ndeal=3 nodes=137,034 elapsed=0.17 - deal=56 ndeal=4 nodes=1,837,912 elapsed=2.17 - deal=68 ndeal=5 nodes=1,224,530 elapsed=1.37 - deal=81 ndeal=6 nodes=410,308 elapsed=0.42 - deal=94 ndeal=7 nodes=593,127 elapsed=0.73 - deal=99 ndeal=8 nodes=1,946,230 elapsed=2.37 - deal=103 ndeal=9 nodes=155,728 elapsed=0.18 - deal=116 ndeal=10 nodes=174,796 elapsed=0.22 -deals=10 nodes=7,313,630 elapsed=8.57 -min_node=113,139 max_node=1,946,230 avg=731,363 -min_elapsed=0.14 max_elapsed=2.37 avg=0.86 -errors=0 - -================================================================================ -dds10x output for: ../giblib -giblib=1-1 -================================================================================ - -giblib=1-1 target=-1 sol=1 mode=1 - deal=1 leader=S 8N score=8 nodes=50,178 elapsed=0.08 - deal=1 leader=E 8N score=8 nodes=39,811 elapsed=0.08 - deal=1 leader=N 8N score=8 nodes=43,703 elapsed=0.08 - deal=1 leader=W 8N score=8 nodes=39,201 elapsed=0.07 - deal=1 leader=S 7S score=7 nodes=420,588 elapsed=0.56 - deal=1 leader=E 7S score=7 nodes=155,765 elapsed=0.23 - deal=1 leader=N 7S score=7 nodes=426,794 elapsed=0.60 - deal=1 leader=W 7S score=7 nodes=164,092 elapsed=0.23 - deal=1 leader=S 10H score=10 nodes=33,596 elapsed=0.07 - deal=1 leader=E 9H score=9 nodes=45,895 elapsed=0.09 - deal=1 leader=N 10H score=10 nodes=19,817 elapsed=0.05 - deal=1 leader=W 9H score=9 nodes=47,289 elapsed=0.09 - deal=1 leader=S 7D score=7 nodes=454,538 elapsed=0.63 - deal=1 leader=E 7D score=7 nodes=80,961 elapsed=0.13 - deal=1 leader=N 7D score=7 nodes=492,525 elapsed=0.69 - deal=1 leader=W 7D score=7 nodes=90,791 elapsed=0.14 - deal=1 leader=S 8C score=8 nodes=169,389 elapsed=0.21 - deal=1 leader=E 8C score=8 nodes=144,696 elapsed=0.19 - deal=1 leader=N 8C score=8 nodes=239,940 elapsed=0.29 - deal=1 leader=W 8C score=8 nodes=86,347 elapsed=0.13 - deal=1 nodes=3,245,916 elapsed=4.63 totalelapsed=4.63 - tricks=88887777A9A977778888 (max=13) -deals=1-1 nodes=3,245,916 avg=162,295 elapsed=4.63 avg=0.23 - -================================================================================ -dds105 output for: test.gib -timeall -================================================================================ - -test sol=1 sol=2 sol=3 ---------- ---------------- ---------------- --------------- -gib2 13 0.02 17 0.02 17 0.02 -gib3 51 0.03 70 0.02 70 0.02 -gib4 108 0.02 196 0.02 241 0.02 -gib5 201 0.02 615 0.02 1,029 0.03 -gib10 23,631 0.05 53,970 0.08 70,393 0.09 -gin 11,804 0.05 264,863 0.32 639,086 0.77 -dbldum1 1,190 0.02 1,756 0.02 1,781 0.03 -dbldum2 244,373 0.24 691,508 0.68 691,508 0.68 -devil1 77,028 0.11 140,404 0.17 269,045 0.29 -callahan 342,844 0.44 918,162 1.45 1,182,747 1.72 -g410-scc 77,328 0.12 92,379 0.14 316,332 0.36 -giblibno1 2,211,230 3.19 3,884,687 6.13 4,797,243 7.54 -giblibno2 307,453 0.36 401,005 0.47 401,005 0.47 -bo17 344,725 0.44 826,074 1.08 1,184,613 1.42 -bo21 1,793,723 2.60 2,249,871 3.23 4,791,239 6.78 -giblib1 37,717 0.07 90,410 0.13 90,410 0.13 -giblib2 780,451 0.88 1,009,229 1.15 5,027,108 5.38 -giblib3 111,864 0.12 294,222 0.28 294,228 0.28 -giblib4 102,296 0.13 191,583 0.22 1,086,325 1.13 -giblib5 671,160 0.73 2,180,365 2.49 2,180,365 2.50 -giblib6 763,607 0.85 1,531,703 1.79 1,722,183 1.98 -giblib7 71,888 0.10 375,551 0.47 399,876 0.49 -giblib8 120,940 0.15 689,874 0.73 689,874 0.73 -giblib9 802,763 0.93 1,507,576 1.80 2,802,602 3.46 -giblib10 88,779 0.13 272,940 0.34 586,850 0.69 - nodes: total=55,882,367 sol-1=8,987,167 sol-2=17,669,030 sol-3=29,226,170 -elapsed: total=72.11 sol-1=11.83 sol-2=23.27 sol-3=37.01 - -================================================================================ -dds105 output for: ../giblib -sol=1 -v -timeg=9n10 -================================================================================ - -timeg tricks=9 contract=n deals=10 target=-1 sol=1 mode=1 leader=W - deal=4 ndeal=1 nodes=102,296 elapsed=0.14 - deal=5 ndeal=2 nodes=671,160 elapsed=0.74 - deal=8 ndeal=3 nodes=120,940 elapsed=0.17 - deal=56 ndeal=4 nodes=1,700,168 elapsed=2.07 - deal=68 ndeal=5 nodes=1,070,739 elapsed=1.26 - deal=81 ndeal=6 nodes=372,940 elapsed=0.40 - deal=94 ndeal=7 nodes=490,804 elapsed=0.61 - deal=99 ndeal=8 nodes=1,819,501 elapsed=2.30 - deal=103 ndeal=9 nodes=103,882 elapsed=0.14 - deal=116 ndeal=10 nodes=150,449 elapsed=0.19 -deals=10 nodes=6,602,879 elapsed=8.01 -min_node=102,296 max_node=1,819,501 avg=660,287 -min_elapsed=0.14 max_elapsed=2.30 avg=0.80 -errors=0 - -================================================================================ -dds105 output for: ../giblib -giblib=1-1 -================================================================================ - -giblib=1-1 target=-1 sol=1 mode=1 - deal=1 leader=S 8N score=8 nodes=44,008 elapsed=0.08 - deal=1 leader=E 8N score=8 nodes=38,642 elapsed=0.07 - deal=1 leader=N 8N score=8 nodes=36,150 elapsed=0.07 - deal=1 leader=W 8N score=8 nodes=37,717 elapsed=0.07 - deal=1 leader=S 7S score=7 nodes=342,376 elapsed=0.46 - deal=1 leader=E 7S score=7 nodes=134,659 elapsed=0.18 - deal=1 leader=N 7S score=7 nodes=358,216 elapsed=0.49 - deal=1 leader=W 7S score=7 nodes=143,287 elapsed=0.20 - deal=1 leader=S 10H score=10 nodes=26,798 elapsed=0.06 - deal=1 leader=E 9H score=9 nodes=36,768 elapsed=0.08 - deal=1 leader=N 10H score=10 nodes=16,269 elapsed=0.05 - deal=1 leader=W 9H score=9 nodes=37,968 elapsed=0.08 - deal=1 leader=S 7D score=7 nodes=417,861 elapsed=0.60 - deal=1 leader=E 7D score=7 nodes=77,732 elapsed=0.14 - deal=1 leader=N 7D score=7 nodes=448,376 elapsed=0.66 - deal=1 leader=W 7D score=7 nodes=86,576 elapsed=0.15 - deal=1 leader=S 8C score=8 nodes=147,551 elapsed=0.21 - deal=1 leader=E 8C score=8 nodes=132,378 elapsed=0.18 - deal=1 leader=N 8C score=8 nodes=212,582 elapsed=0.27 - deal=1 leader=W 8C score=8 nodes=78,989 elapsed=0.13 - deal=1 nodes=2,854,903 elapsed=4.23 totalelapsed=4.23 - tricks=88887777A9A977778888 (max=13) -deals=1-1 nodes=2,854,903 avg=142,745 elapsed=4.23 avg=0.21 - -================================================================================ -dds105 output for: test.gib -tricks -name=gin -================================================================================ - -name=gin target=-1 sol=1 mode=1 - leader=S 9N nodes=217,042 elapsed=0.30 - leader=E 9N nodes=490,389 elapsed=0.54 - leader=N 9N nodes=242,708 elapsed=0.32 - leader=W 8N nodes=12,536 elapsed=0.05 - leader=S 9S nodes=1,067,876 elapsed=1.72 - leader=E 8S nodes=1,423,650 elapsed=2.10 - leader=N 9S nodes=579,046 elapsed=0.82 - leader=W 8S nodes=1,413,760 elapsed=2.35 - leader=S 9H nodes=421,052 elapsed=0.54 - leader=E 9H nodes=462,996 elapsed=0.55 - leader=N 9H nodes=388,427 elapsed=0.50 - leader=W 9H nodes=263,960 elapsed=0.30 - leader=S 6D nodes=400,416 elapsed=0.51 - leader=E 6D nodes=192,319 elapsed=0.24 - leader=N 6D nodes=312,717 elapsed=0.40 - leader=W 6D nodes=47,573 elapsed=0.09 - leader=S 7C nodes=987,365 elapsed=1.38 - leader=E 7C nodes=946,439 elapsed=1.20 - leader=N 7C nodes=1,102,393 elapsed=1.59 - leader=W 7C nodes=487,664 elapsed=0.56 -nodes=11,460,328 elapsed=16.06 totalelapsed=16.06 - K Q 9 - A Q J - 9 6 4 3 2 - 8 6 - T 6 8 7 3 2 - T 9 2 7 5 3 - T A K Q J 8 5 - A J T 9 5 3 2 - - A J 5 4 - K 8 6 4 - 7 - K Q 7 4 -name=gin tricks(leader=senw): n=9998 s=9898 h=9999 d=6666 c=7777 (max=13) - -================================================================================ -dds105 output for: test.gib -tricks -name=gin -================================================================================ - -name=gin target=-1 sol=1 mode=1 - leader=S 9N nodes=196,320 elapsed=0.27 - leader=E 9N nodes=422,811 elapsed=0.49 - leader=N 9N nodes=216,293 elapsed=0.29 - leader=W 8N nodes=11,804 elapsed=0.05 - leader=S 9S nodes=966,576 elapsed=1.68 - leader=E 8S nodes=1,247,854 elapsed=2.01 - leader=N 9S nodes=514,885 elapsed=0.76 - leader=W 8S nodes=1,225,697 elapsed=2.09 - leader=S 9H nodes=388,951 elapsed=0.52 - leader=E 9H nodes=428,708 elapsed=0.55 - leader=N 9H nodes=360,926 elapsed=0.48 - leader=W 9H nodes=238,759 elapsed=0.28 - leader=S 6D nodes=307,283 elapsed=0.41 - leader=E 6D nodes=164,629 elapsed=0.22 - leader=N 6D nodes=240,740 elapsed=0.32 - leader=W 6D nodes=43,630 elapsed=0.08 - leader=S 7C nodes=847,071 elapsed=1.21 - leader=E 7C nodes=831,338 elapsed=1.09 - leader=N 7C nodes=966,299 elapsed=1.45 - leader=W 7C nodes=430,252 elapsed=0.51 -nodes=10,050,826 elapsed=14.77 totalelapsed=14.77 - K Q 9 - A Q J - 9 6 4 3 2 - 8 6 - T 6 8 7 3 2 - T 9 2 7 5 3 - T A K Q J 8 5 - A J T 9 5 3 2 - - A J 5 4 - K 8 6 4 - 7 - K Q 7 4 -name=gin tricks(leader=senw): n=9998 s=9898 h=9999 d=6666 c=7777 (max=13) -================================================================================ -dds106 test.gib -timeal - ================================================================================ -test sol=1 sol=2 sol=3 ---------- ---------------- ---------------- --------------- -gib2 6 0.02 10 0.02 10 0.02 -gib3 29 0.02 45 0.02 45 0.02 -gib4 65 0.02 153 0.02 179 0.02 -gib5 150 0.02 518 0.02 857 0.02 -gib10 17,663 0.04 41,178 0.06 52,041 0.07 -gin 8,763 0.04 224,298 0.27 581,064 0.69 -dbldum1 988 0.02 1,514 0.02 1,539 0.02 -dbldum2 136,602 0.15 385,323 0.41 385,323 0.42 -devil1 74,661 0.10 135,218 0.15 234,862 0.24 -callahan 261,312 0.33 747,439 1.13 938,208 1.33 -g410-scc 45,331 0.08 57,262 0.09 237,488 0.27 -giblibno1 1,744,338 2.56 3,109,979 5.08 3,888,830 6.30 -giblibno2 203,773 0.25 270,424 0.31 270,424 0.32 -bo17 290,006 0.35 691,275 0.85 930,229 1.07 -bo21 1,502,044 2.16 1,882,400 2.66 3,926,551 5.61 -giblib1 34,024 0.06 75,758 0.10 75,758 0.10 -giblib2 685,093 0.73 889,056 0.93 3,631,179 3.96 -giblib3 39,792 0.06 113,138 0.13 113,144 0.13 -giblib4 58,370 0.08 108,555 0.12 724,213 0.74 -giblib5 565,021 0.60 1,738,081 2.07 1,738,081 2.08 -giblib6 631,095 0.66 1,332,592 1.48 1,502,434 1.64 -giblib7 49,494 0.07 261,284 0.32 282,134 0.34 -giblib8 106,018 0.12 625,995 0.66 625,995 0.66 -giblib9 534,453 0.58 1,145,748 1.36 2,246,335 2.71 -giblib10 28,477 0.06 91,990 0.12 371,359 0.40 - nodes: total=43,705,083 sol-1=7,017,568 sol-2=13,929,233 sol-3=22,758,282 -elapsed: total=56.73 sol-1=9.17 sol-2=18.39 sol-3=29.17 -================================================================================ -dds106 ../exe/ddd ../giblib -sol=1 -v -timeg=9n10 -================================================================================ -timeg tricks=9 contract=n deals=10 target=-1 sol=1 mode=1 leader=W - deal=4 ndeal=1 nodes=58,370 elapsed=0.09 - deal=5 ndeal=2 nodes=565,021 elapsed=0.61 - deal=8 ndeal=3 nodes=106,018 elapsed=0.13 - deal=56 ndeal=4 nodes=1,436,228 elapsed=1.74 - deal=68 ndeal=5 nodes=853,171 elapsed=0.99 - deal=81 ndeal=6 nodes=341,423 elapsed=0.35 - deal=94 ndeal=7 nodes=450,116 elapsed=0.54 - deal=99 ndeal=8 nodes=1,483,787 elapsed=1.92 - deal=103 ndeal=9 nodes=92,027 elapsed=0.11 - deal=116 ndeal=10 nodes=129,085 elapsed=0.16 -deals=10 nodes=5,515,246 elapsed=6.65 -min_node=58,370 max_node=1,483,787 avg=551,524 -min_elapsed=0.09 max_elapsed=1.92 avg=0.66 -errors=0 -================================================================================ -dds106 ../exe/ddd ../giblib -giblib=1-1 -================================================================================ -giblib=1-1 target=-1 sol=1 mode=1 - deal=1 leader=S 8N score=8 nodes=32,808 elapsed=0.06 - deal=1 leader=E 8N score=8 nodes=32,398 elapsed=0.06 - deal=1 leader=N 8N score=8 nodes=24,961 elapsed=0.05 - deal=1 leader=W 8N score=8 nodes=34,024 elapsed=0.06 - deal=1 leader=S 7S score=7 nodes=286,567 elapsed=0.35 - deal=1 leader=E 7S score=7 nodes=103,269 elapsed=0.13 - deal=1 leader=N 7S score=7 nodes=298,877 elapsed=0.38 - deal=1 leader=W 7S score=7 nodes=123,280 elapsed=0.16 - deal=1 leader=S 10H score=10 nodes=23,933 elapsed=0.05 - deal=1 leader=E 9H score=9 nodes=34,552 elapsed=0.06 - deal=1 leader=N 10H score=10 nodes=14,916 elapsed=0.04 - deal=1 leader=W 9H score=9 nodes=32,641 elapsed=0.06 - deal=1 leader=S 7D score=7 nodes=348,309 elapsed=0.47 - deal=1 leader=E 7D score=7 nodes=70,070 elapsed=0.10 - deal=1 leader=N 7D score=7 nodes=372,832 elapsed=0.50 - deal=1 leader=W 7D score=7 nodes=76,573 elapsed=0.11 - deal=1 leader=S 8C score=8 nodes=124,102 elapsed=0.15 - deal=1 leader=E 8C score=8 nodes=108,527 elapsed=0.13 - deal=1 leader=N 8C score=8 nodes=169,251 elapsed=0.20 - deal=1 leader=W 8C score=8 nodes=67,632 elapsed=0.10 - deal=1 nodes=2,379,522 elapsed=3.22 totalelapsed=3.22 - tricks=88887777A9A977778888 (max=13) -deals=1-1 nodes=2,379,522 avg=118,976 elapsed=3.22 avg=0.16 -================================================================================ -dds106 ../exe/ddd test.gib -tricks -name=gin -================================================================================ -name=gin target=-1 sol=1 mode=1 - leader=S 9N nodes=189,465 elapsed=0.25 - leader=E 9N nodes=367,149 elapsed=0.43 - leader=N 9N nodes=208,008 elapsed=0.27 - leader=W 8N nodes=8,763 elapsed=0.04 - leader=S 9S nodes=804,494 elapsed=1.43 - leader=E 8S nodes=1,078,255 elapsed=1.69 - leader=N 9S nodes=436,355 elapsed=0.64 - leader=W 8S nodes=1,058,980 elapsed=1.86 - leader=S 9H nodes=320,228 elapsed=0.42 - leader=E 9H nodes=336,922 elapsed=0.41 - leader=N 9H nodes=293,834 elapsed=0.38 - leader=W 9H nodes=199,614 elapsed=0.24 - leader=S 6D nodes=259,761 elapsed=0.33 - leader=E 6D nodes=143,529 elapsed=0.19 - leader=N 6D nodes=213,182 elapsed=0.27 - leader=W 6D nodes=40,411 elapsed=0.07 - leader=S 7C nodes=591,728 elapsed=0.75 - leader=E 7C nodes=565,863 elapsed=0.69 - leader=N 7C nodes=596,756 elapsed=0.77 - leader=W 7C nodes=256,286 elapsed=0.29 -nodes=7,969,583 elapsed=11.38 totalelapsed=11.38 - K Q 9 - A Q J - 9 6 4 3 2 - 8 6 - T 6 8 7 3 2 - T 9 2 7 5 3 - T A K Q J 8 5 - A J T 9 5 3 2 - - A J 5 4 - K 8 6 4 - 7 - K Q 7 4 -name=gin tricks(leader=senw): n=9998 s=9898 h=9999 d=6666 c=7777 (max=13) -================================================================================ -dds110 ./ddd test.gib -timeall -================================================================================ -test sol=1 sol=2 sol=3 ---------- ---------------- ---------------- --------------- -gib2 6 0.02 10 0.02 10 0.02 -gib3 29 0.02 45 0.02 45 0.02 -gib4 65 0.02 153 0.02 179 0.02 -gib5 150 0.02 518 0.02 857 0.02 -gib10 17,639 0.04 41,129 0.06 51,992 0.07 -gin 8,763 0.04 224,637 0.25 582,238 0.64 -dbldum1 988 0.02 1,514 0.02 1,539 0.02 -dbldum2 137,710 0.14 387,069 0.35 387,069 0.35 -devil1 74,416 0.09 135,018 0.15 234,410 0.24 -callahan 258,062 0.28 747,584 0.80 938,511 0.98 -g410-scc 45,860 0.08 57,788 0.09 240,189 0.27 -giblibno1 1,747,984 1.83 3,116,388 3.34 3,897,902 4.19 -giblibno2 203,086 0.22 269,483 0.29 269,483 0.29 -bo17 291,051 0.32 694,139 0.73 931,866 0.95 -bo21 1,460,883 1.54 1,838,366 1.93 3,875,408 4.04 -giblib1 34,009 0.06 75,902 0.10 75,902 0.10 -giblib2 686,922 0.66 891,102 0.85 3,662,838 3.45 -giblib3 39,792 0.06 113,138 0.12 113,144 0.12 -giblib4 58,380 0.08 109,081 0.13 724,372 0.70 -giblib5 558,633 0.56 1,741,928 1.73 1,741,928 1.73 -giblib6 630,322 0.63 1,336,872 1.35 1,505,222 1.50 -giblib7 49,621 0.07 261,723 0.28 282,573 0.30 -giblib8 105,897 0.12 630,239 0.64 630,239 0.64 -giblib9 526,845 0.53 1,146,045 1.16 2,250,098 2.30 -giblib10 28,477 0.06 92,836 0.13 372,485 0.41 - nodes: total=43,648,796 sol-1=6,965,590 sol-2=13,912,707 sol-3=22,770,499 -elapsed: total=45.42 sol-1=7.49 sol-2=14.56 sol-3=23.37 -================================================================================ -dds110 ./ddd ../giblib -sol=1 -v -timeg=9n10 -================================================================================ -timeg tricks=9 contract=n deals=10 target=-1 sol=1 mode=1 leader=W - deal=4 ndeal=1 nodes=58,380 elapsed=0.09 - deal=5 ndeal=2 nodes=558,633 elapsed=0.56 - deal=8 ndeal=3 nodes=105,897 elapsed=0.13 - deal=56 ndeal=4 nodes=1,431,474 elapsed=1.46 - deal=68 ndeal=5 nodes=851,777 elapsed=0.88 - deal=81 ndeal=6 nodes=341,552 elapsed=0.33 - deal=94 ndeal=7 nodes=449,189 elapsed=0.46 - deal=99 ndeal=8 nodes=1,495,869 elapsed=1.53 - deal=103 ndeal=9 nodes=92,254 elapsed=0.11 - deal=116 ndeal=10 nodes=129,354 elapsed=0.16 -deals=10 nodes=5,514,379 elapsed=5.71 -min_node=58,380 max_node=1,495,869 avg=551,437 -min_elapsed=0.09 max_elapsed=1.53 avg=0.57 -errors=0 -================================================================================ -dds110 ./ddd ../giblib -giblib=1-1 -giblib=1-1 target=-1 sol=1 mode=1 - deal=1 leader=S 8N score=8 nodes=32,808 elapsed=0.06 - deal=1 leader=E 8N score=8 nodes=32,441 elapsed=0.06 - deal=1 leader=N 8N score=8 nodes=25,021 elapsed=0.05 - deal=1 leader=W 8N score=8 nodes=34,009 elapsed=0.06 - deal=1 leader=S 7S score=7 nodes=279,639 elapsed=0.31 - deal=1 leader=E 7S score=7 nodes=102,254 elapsed=0.13 - deal=1 leader=N 7S score=7 nodes=301,914 elapsed=0.33 - deal=1 leader=W 7S score=7 nodes=121,529 elapsed=0.14 - deal=1 leader=S 10H score=10 nodes=24,004 elapsed=0.05 - deal=1 leader=E 9H score=9 nodes=34,337 elapsed=0.06 - deal=1 leader=N 10H score=10 nodes=14,921 elapsed=0.04 - deal=1 leader=W 9H score=9 nodes=32,523 elapsed=0.06 - deal=1 leader=S 7D score=7 nodes=347,634 elapsed=0.42 - deal=1 leader=E 7D score=7 nodes=69,322 elapsed=0.11 - deal=1 leader=N 7D score=7 nodes=371,443 elapsed=0.44 - deal=1 leader=W 7D score=7 nodes=76,652 elapsed=0.11 - deal=1 leader=S 8C score=8 nodes=129,621 elapsed=0.15 - deal=1 leader=E 8C score=8 nodes=110,722 elapsed=0.13 - deal=1 leader=N 8C score=8 nodes=172,313 elapsed=0.20 - deal=1 leader=W 8C score=8 nodes=64,853 elapsed=0.09 - deal=1 nodes=2,377,960 elapsed=2.99 totalelapsed=2.99 - tricks=88887777A9A977778888 (max=13) -deals=1-1 nodes=2,377,960 avg=118,898 elapsed=2.99 avg=0.15 -================================================================================ -dds110 ./ddd test.gib -tricks -name=gin -name=gin target=-1 sol=1 mode=1 - leader=S 9N nodes=192,174 elapsed=0.24 - leader=E 9N nodes=367,542 elapsed=0.40 - leader=N 9N nodes=207,824 elapsed=0.25 - leader=W 8N nodes=8,763 elapsed=0.04 - leader=S 9S nodes=785,551 elapsed=0.89 - leader=E 8S nodes=1,083,174 elapsed=1.24 - leader=N 9S nodes=437,999 elapsed=0.50 - leader=W 8S nodes=1,067,505 elapsed=1.18 - leader=S 9H nodes=321,295 elapsed=0.38 - leader=E 9H nodes=332,370 elapsed=0.39 - leader=N 9H nodes=295,031 elapsed=0.34 - leader=W 9H nodes=200,005 elapsed=0.22 - leader=S 6D nodes=260,627 elapsed=0.31 - leader=E 6D nodes=143,798 elapsed=0.19 - leader=N 6D nodes=214,479 elapsed=0.26 - leader=W 6D nodes=40,383 elapsed=0.07 - leader=S 7C nodes=596,131 elapsed=0.65 - leader=E 7C nodes=580,584 elapsed=0.64 - leader=N 7C nodes=596,086 elapsed=0.67 - leader=W 7C nodes=258,317 elapsed=0.28 -nodes=7,989,638 elapsed=9.12 totalelapsed=9.12 - K Q 9 - A Q J - 9 6 4 3 2 - 8 6 - T 6 8 7 3 2 - T 9 2 7 5 3 - T A K Q J 8 5 - A J T 9 5 3 2 - - A J 5 4 - K 8 6 4 - 7 - K Q 7 4 -name=gin tricks(leader=senw): n=9998 s=9898 h=9999 d=6666 c=7777 (max=13) -================================================================================ -ddd112 ./ddd test.gib -timeall -================================================================================ -test sol=1 sol=2 sol=3 ---------- ---------------- ---------------- --------------- -gib2 6 0.02 10 0.02 10 0.02 -gib3 29 0.02 45 0.03 45 0.02 -gib4 65 0.02 153 0.02 177 0.02 -gib5 155 0.02 486 0.02 657 0.02 -gib10 9,258 0.03 19,016 0.04 22,652 0.04 -gin 6,324 0.03 219,444 0.26 475,279 0.56 -dbldum1 540 0.02 1,013 0.03 1,038 0.02 -dbldum2 136,598 0.15 259,032 0.25 259,032 0.25 -devil1 81,548 0.10 116,045 0.14 153,721 0.18 -callahan 174,145 0.21 430,962 0.49 471,674 0.54 -g410-scc 43,903 0.08 44,681 0.08 112,062 0.15 -giblibno1 1,163,737 1.32 1,697,850 1.98 1,788,191 2.13 -giblibno2 160,340 0.20 223,954 0.27 223,954 0.27 -bo17 157,301 0.19 372,446 0.43 438,133 0.49 -bo21 1,795,469 2.03 1,959,809 2.25 2,407,449 2.85 -giblib1 31,058 0.06 44,026 0.08 44,026 0.07 -giblib2 255,255 0.28 418,134 0.53 1,931,126 2.06 -giblib3 18,470 0.04 38,885 0.06 38,891 0.07 -giblib4 48,509 0.07 143,359 0.17 401,817 0.45 -giblib5 417,649 0.43 1,711,054 1.99 1,711,054 1.86 -giblib6 560,081 0.60 937,852 1.02 996,590 1.10 -giblib7 41,668 0.07 114,334 0.14 119,228 0.14 -giblib8 74,780 0.10 264,695 0.29 264,695 0.29 -giblib9 427,057 0.48 899,105 1.00 1,163,416 1.32 -giblib10 30,338 0.06 96,455 0.14 270,423 0.33 - nodes: total=28,942,468 sol-1=5,634,283 sol-2=10,012,845 sol-3=13,295,340 -elapsed: total=33.59 sol-1=6.62 sol-2=11.71 sol-3=15.26 -================================================================================ -ddd112 ./ddd ../giblib -sol=1 -v -timeg=9n10 -================================================================================ -Double Dummy Driver (DDD) version 1.05 (25-Jan-2007) -timeg tricks=9 contract=n deals=10 target=-1 sol=1 mode=1 leader=W - deal=4 ndeal=1 nodes=48,509 elapsed=0.07 - deal=5 ndeal=2 nodes=417,649 elapsed=0.43 - deal=8 ndeal=3 nodes=74,780 elapsed=0.10 - deal=56 ndeal=4 nodes=1,241,660 elapsed=1.34 - deal=68 ndeal=5 nodes=319,869 elapsed=0.36 - deal=81 ndeal=6 nodes=158,661 elapsed=0.18 - deal=94 ndeal=7 nodes=666,682 elapsed=0.73 - deal=99 ndeal=8 nodes=1,607,014 elapsed=1.79 - deal=103 ndeal=9 nodes=51,985 elapsed=0.08 - deal=116 ndeal=10 nodes=128,401 elapsed=0.16 -deals=10 nodes=4,715,210 elapsed=5.24 -min_node=48,509 max_node=1,607,014 avg=471,521 -min_elapsed=0.07 max_elapsed=1.79 avg=0.52 -errors=0 -================================================================================ -ddd112 ./ddd ../giblib -giblib=1-1 -================================================================================ -Double Dummy Driver (DDD) version 1.05 (25-Jan-2007) -giblib=1-1 target=-1 sol=1 mode=1 - deal=1 leader=S 8N score=8 nodes=18,322 elapsed=0.04 - deal=1 leader=E 8N score=8 nodes=32,837 elapsed=0.06 - deal=1 leader=N 8N score=8 nodes=10,500 elapsed=0.04 - deal=1 leader=W 8N score=8 nodes=31,058 elapsed=0.06 - deal=1 leader=S 7S score=7 nodes=79,659 elapsed=0.11 - deal=1 leader=E 7S score=7 nodes=47,581 elapsed=0.07 - deal=1 leader=N 7S score=7 nodes=52,907 elapsed=0.08 - deal=1 leader=W 7S score=7 nodes=45,893 elapsed=0.07 - deal=1 leader=S 10H score=10 nodes=9,517 elapsed=0.03 - deal=1 leader=E 9H score=9 nodes=26,390 elapsed=0.05 - deal=1 leader=N 10H score=10 nodes=6,318 elapsed=0.03 - deal=1 leader=W 9H score=9 nodes=37,377 elapsed=0.07 - deal=1 leader=S 7D score=7 nodes=143,865 elapsed=0.19 - deal=1 leader=E 7D score=7 nodes=31,690 elapsed=0.06 - deal=1 leader=N 7D score=7 nodes=139,623 elapsed=0.19 - deal=1 leader=W 7D score=7 nodes=42,067 elapsed=0.07 - deal=1 leader=S 8C score=8 nodes=22,516 elapsed=0.05 - deal=1 leader=E 8C score=8 nodes=51,243 elapsed=0.08 - deal=1 leader=N 8C score=8 nodes=13,037 elapsed=0.04 - deal=1 leader=W 8C score=8 nodes=53,801 elapsed=0.08 - deal=1 nodes=896,201 elapsed=1.48 totalelapsed=1.48 - tricks=88887777A9A977778888 (max=13) -deals=1-1 nodes=896,201 avg=44,810 elapsed=1.48 avg=0.07 -================================================================================ -./ddd test.gib -tricks -name=gin -================================================================================ -Double Dummy Driver (DDD) version 1.05 (25-Jan-2007) -name=gin target=-1 sol=1 mode=1 - leader=S 9N nodes=204,883 elapsed=0.25 - leader=E 9N nodes=341,850 elapsed=0.39 - leader=N 9N nodes=202,525 elapsed=0.26 - leader=W 8N nodes=6,324 elapsed=0.03 - leader=S 9S nodes=404,513 elapsed=0.51 - leader=E 8S nodes=880,321 elapsed=1.09 - leader=N 9S nodes=481,945 elapsed=0.62 - leader=W 8S nodes=679,639 elapsed=0.83 - leader=S 9H nodes=317,100 elapsed=0.40 - leader=E 9H nodes=230,488 elapsed=0.32 - leader=N 9H nodes=341,234 elapsed=0.45 - leader=W 9H nodes=53,051 elapsed=0.08 - leader=S 6D nodes=420,142 elapsed=0.52 - leader=E 6D nodes=111,851 elapsed=0.15 - leader=N 6D nodes=448,369 elapsed=0.56 - leader=W 6D nodes=37,943 elapsed=0.07 - leader=S 7C nodes=460,906 elapsed=0.55 - leader=E 7C nodes=276,054 elapsed=0.34 - leader=N 7C nodes=515,007 elapsed=0.63 - leader=W 7C nodes=297,298 elapsed=0.33 -nodes=6,711,443 elapsed=8.38 totalelapsed=8.38 - K Q 9 - A Q J - 9 6 4 3 2 - 8 6 - T 6 8 7 3 2 - T 9 2 7 5 3 - T A K Q J 8 5 - A J T 9 5 3 2 - - A J 5 4 - K 8 6 4 - 7 - K Q 7 4 -name=gin tricks(leader=senw): n=9998 s=9898 h=9999 d=6666 c=7777 (max=13) -*/ +/* ************************************************************************** + ddd.cpp bridge double dummy driver + PM Cronje June 2006 + + Copyright 2006 P.M.Cronje + + This file is part of the Double Dummer Driver (DDD). + + DDD is a driver for the double dummy solver DDS, + released separately under the GPL by Bo Haglund. + + DDD 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. + + DDD 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 DDD; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + ************************************************************************** */ +// Changes in cleanSB 07-10-11 by Bo Haglund due to changes in dds 1.1.7 */ + +#include +#include +#include +#include + + +// ----------------------------------------------------------------------------- + +// HOW TO COMPILE AND LINK THIS WITH THE LATEST VERSION OF DDS +// +// The following is suggested: +// +// - obtain the latest dds11x.cpp and dds11x.h file for version 1.1x +// of Bo Haglund's DDS and copy them into this directory +// +// Linux: compile and link as follows: +// g++ -O2 -Wall -o ./ddd ddd.cpp dds11x.cpp defs.cpp timer.cpp giblib.cpp rng.cpp +// +// Windows: compile and link as follows: +// g++ -O2 -Wall -o ddd.exe ddd.cpp dds11x.cpp defs.cpp timer.cpp giblib.cpp rng.cpp +// +// for debugging change the switch '-O2' to '-g' +// +// Note: on MingW you must have _WIN32 defined to compile code in timer.cpp +// +// ----------------------------------------------------------------------------- + +#include "dds/include/dll.h" +#include "portab_DDD.h" +#include "giblib.h" +#include "timer.h" + +#define szVERSION "1.05" +#define szVERSION_DATE "25-Jan-2007" + +/* v1.03 10-Jul-2006 add set tricks to -giblib option + add -tricks option + v1.04 12-Jul-2006 changed giblib to C++ class cGIBLib + (not struct sGIBLIb anymore) + 13-jul-2006 add generateDeal(. ..) in class cGibLib + 14-Jul-2006 add optional flag 'all' for option + -giblib=d1-d2[-all] + changes to szTricks etc. in class cGibLib + 15-Jul-2006 fix 0 elapsed times for -gen + 25-Jan-2007 changes to use dds11x +*/ + +// ----------------------------------------------------------------------------- +// prototypes defined in this file +// ----------------------------------------------------------------------------- + +void cleanSB(); +void getSBScore(const struct futureTricks & fut, int * pmaxscore, + bool bscore[14], ushort m[14][4]); +bool generate(int gen, unsigned int genseed, int gencards, int gentricks); +bool giblib(char * pszfile, int target, int sol, int mode, char * pszgiblib); +FILE * openFile(char * pszfile); +void playDD(cGIBLib * pgib, int target, int sol); +void printSBScore(int target, int solutions, struct futureTricks * pfut, + double elapsed); +void printSBScore(bool bscore[14], ushort m[14][4]); +bool setDDS(cGIBLib * pgib, struct deal * pdl); +bool testSBCode(int sbcode); +bool timeAll(char * pszfile, int trumps, int leader); +bool timeg(char * pszfile, int target, int sol, int mode, + char * pszxcn, int leader, bool bverbose); +bool tricks(cGIBLib * pgib, int ideal, int target, int sol, int mode); + +// ----------------------------------------------------------------------------- +// macros to convert to/from DDS players/cards +// ----------------------------------------------------------------------------- + +#define PLAYER2DDS(pl) ((pl-1)&3) +#define CARD2DDS(card) (14-card) + +#define DDS2PLAYER(ddspl) ((ddspl+1)&3) +#define DDS2CARD(ddscard) (14-ddscard) + +#define szGENFILE "gen.txt" + +// ***************************************************************************** +// DDD definitions +// ***************************************************************************** + +int main(int argc, char * argv[]) +{ + cGIBLib gib; + char * pszfile = 0, *pszname = 0, *pszxcn = 0, *pszgiblib = 0; + int iarg, target = -1, solutions = 3, mode = 1, deal = 1, trumps = -1, leader = -1; + int sbcode; + bool bok = false, btimeall = false, bplaydd = false, bverbose = false, btricks = false; + int gen = 0, gencards = 52, gentricks = 1; + unsigned int genseed = 0; + FILE * fp; + cTimer timer; + + struct deal dl; + struct futureTricks fut; + + printf("\nDouble Dummy Driver (DDD) version %s (%s)\n", + szVERSION, szVERSION_DATE); + + if (argc < 2) + { + printf( + "\n" + "DDD usage:\n" + " ddd_executable file [opts]\n" + "where:\n" + " file : path for 'giblib' input file \n" + "optional arguments [opts] are one or more of: \n" + " -v : verbose where applicable \n" + " -target=d : (default -1), see dll reference \n" + " -sol=d : solution 1/2/3 (default 3), see dll reference \n" + " -mode=d : 0/1 (default 1), see dll reference \n" + " -trumps=t : s/h/d/c/n, this overrides the file (default=n) \n" + " -leader=l : w/n/e/s, this overrides the file (default=w) \n" + " but used only when no cards have been played \n" + " -deal=d : 1/2/... deal number in giblib file \n" + " only one of -deal or -name should be specified \n" + " -name=str : deal with 'name=str' in giblib file \n" + " only one of -deal or -name should be specified \n" + " -playdd : play deal choosing between DDS alternatives \n" + " -timeall : time all deals in file for sol=1/2/3, print stats \n" + " -timeg=xcn : x - hex digit, total tricks by n-s \n" + " c - contract s/h/d/c/n \n" + " n - number of deals \n" + " time the first n deals in the giblib file, \n" + " having total tricks x at contract c, \n" + " for target=-1 sol=1 mode=1 \n" + " and for the specified/default leader,\n" + " each deal is validated \n" + " -giblib=d1-d2[-all] : validate all deals from d1 to d2 in giblib file \n" + " for target=-1 sol=1 mode=1 \n" + " 1. if '-all' is given, this is done for all of \n" + " the 20 trick values even if some of them are '-' \n" + " 2. if '-all' is not given, this is done only for \n" + " those trick values which are not '-' \n" + " -tricks : like -giblib, but for single deal specified \n" + " by -name=str -deal=d or option \n" + " generate deals: \n" + " -gen=n : (required) n=number of deals to generate \n" + " output is written to a file (see below) \n" + " -genseed=s : (default 0) seed for random generator \n" + " -gencards=c : (default=52) number of cards generated per deal,\n" + " must be multiple of 4 \n" + " -gentricks=t : 0,1,...,20 (default 1), number of tricks values \n" + " to set randomly \n" + " generate output is written to a file: \n" + " gen-'genseed'-'ndeal'-'gencards'-'gentricks'.txt \n" + "\n" + ); + return -1; + } + for (iarg = 1; iarg < argc; iarg++) + { + if (argv[iarg][0] == '-') + { + if (strncasecmp(argv[iarg], "-target=", 8) == 0) + target = atol(argv[iarg] + 8); + else if (strcasecmp(argv[iarg], "-timeall") == 0) + btimeall = true; + else if (strncasecmp(argv[iarg], "-timeg=", 7) == 0) + pszxcn = argv[iarg] + 7; + else if (strncasecmp(argv[iarg], "-giblib=", 8) == 0) + pszgiblib = argv[iarg] + 8; + else if (strncasecmp(argv[iarg], "-tricks", 7) == 0) + btricks = true; + else if (strcasecmp(argv[iarg], "-playdd") == 0) + bplaydd = true; + else if (strncasecmp(argv[iarg], "-gen=", 5) == 0) + gen = atol(argv[iarg] + 5); + else if (strncasecmp(argv[iarg], "-genseed=", 9) == 0) + genseed = static_cast(atol(argv[iarg] + 9)); + else if (strncasecmp(argv[iarg], "-gencards=", 10) == 0) + gencards = atol(argv[iarg] + 10); + else if (strncasecmp(argv[iarg], "-gentricks=", 11) == 0) + gentricks = atol(argv[iarg] + 11); + else if (strncasecmp(argv[iarg], "-sol=", 5) == 0) + solutions = atol(argv[iarg] + 5); + else if (strncasecmp(argv[iarg], "-mode=", 6) == 0) + { + mode = atol(argv[iarg] + 6); + if (mode < 0) + mode = 0; + else if (mode > 0) + mode = 1; + } + else if (strncasecmp(argv[iarg], "-trumps=", 8) == 0) + { + if (tolower(argv[iarg][8]) == 's') trumps = 0; + else if (tolower(argv[iarg][8]) == 'h') trumps = 1; + else if (tolower(argv[iarg][8]) == 'd') trumps = 2; + else if (tolower(argv[iarg][8]) == 'c') trumps = 3; + else if (tolower(argv[iarg][8]) == 'n') trumps = 4; + else + { + printf("*** error: invalid trumps option '%s'\n", argv[iarg]); + return -1; + } + } + else if (strncasecmp(argv[iarg], "-leader=", 8) == 0) + { + if (tolower(argv[iarg][8]) == 'w') leader = 0; + else if (tolower(argv[iarg][8]) == 'n') leader = 1; + else if (tolower(argv[iarg][8]) == 'e') leader = 2; + else if (tolower(argv[iarg][8]) == 's') leader = 3; + else + { + printf("*** error: invalid leader option '%s'\n", argv[iarg]); + return -1; + } + } + else if (strncasecmp(argv[iarg], "-deal=", 6) == 0) + { + deal = atol(argv[iarg] + 6); + if (deal < 1) + deal = 1; + } + else if (strncasecmp(argv[iarg], "-name=", 6) == 0) + pszname = argv[iarg] + 6; + else if (strcasecmp(argv[iarg], "-v") == 0) + bverbose = true; + else + { + printf("*** error: invalid option '%s'\n", argv[iarg]); + return -1; + } + } + else + pszfile = argv[iarg]; + } + + if (gen > 0) + { + generate(gen, genseed, gencards, gentricks); + goto cleanup; + } + if (btimeall) + { + timeAll(pszfile, trumps, leader); + goto cleanup; + } + else if (pszxcn) + { + timeg(pszfile, -1, 1, 1, pszxcn, (leader == -1 ? 0 : leader), bverbose); + goto cleanup; + } + else if (pszgiblib) + { + giblib(pszfile, -1, 1, 1, pszgiblib); + goto cleanup; + } + + // open file + fp = openFile(pszfile); + if (fp == 0) + return -1; + + // read giblib deal + bok = gib.readFile(deal - 1, pszname, fp); + fclose(fp); + if (!bok) + { + printf("%s", gib.szErrMsg); + return -1; + } + + if (btricks) + { + tricks(&gib, deal, -1, 1, 1); + goto cleanup; + } + + // if overridden from command line, set trumps/leader + if (trumps != -1) + gib.Trumps = trumps; + if ((gib.nPlayed == 0) && (leader != -1)) + { + // override leader/player only when no cards have been played + gib.Leader = gib.Player = leader; + } + + if (bplaydd) + { + playDD(&gib, target, solutions); + goto cleanup; + } + + // set up dds10 + if (setDDS(&gib, &dl) == false) + return -1; + + printf("\n"); + gib.print(); + printf("\n"); + gib.printHands(); + gib.printInfo(); + printf("\n"); + fflush(stdout); + + timer.start(); + sbcode = SolveBoard(dl, target, solutions, mode, &fut, 0); + timer.check(); + if (testSBCode(sbcode) == false) + exit(-1); + printSBScore(target, solutions, &fut, timer.dblElapsed()); + +cleanup: + cleanSB(); + + return 0; + +} // main +// ***************************************************************************** + +void cleanSB() +{ +} +// ***************************************************************************** + +bool generate(int gen, unsigned int genseed, int gencards, int gentricks) +{ + // generate deals + // write giblib extended format to specified file + + cGIBLib gib; + int ntrick, sbcode, ideal, trickpos, trumps, leader; + int settrick[20], setpos[20], nsettrick, itrick; + int maxscore, nerror, score, ntotal; + bool bscore[14]; + ushort m[14][4]; + + FILE * fp; + cTimer timer; + struct deal dl; + struct futureTricks fut; + + double elapsed, totalelapsed; + unsigned long long nodes, totalnodes; + char sz1[32], szfile[256]; + + int target = -1, sol = 1, mode = 1; + + // check arguments + sprintf(szfile, "gen-%u-%d-%d-%d.txt", genseed, gen, gencards, gentricks); + // if existing file, warn the user + + fp = fopen(szfile, "r"); + if (fp) + { + fclose(fp); + printf("\n*** WARNING: generate deals\n" + " the file '%s' is an existing file\n" + " and it may be overwritten\n" + "do you want to continue? (y/n)):", szfile); + fflush(stdout); + char buf[255], *pch; + pch = fgets(buf, 255, stdin); + if (pch == 0) + return false; + if (tolower(*pch) != 'y') + return false; + } + + if (gen < 0) + { + printf("*** error: gen=%d invalid number of deals to generate\n", gen); + return false; + } + if ((gencards < 4) || (gencards > 52)) + { + printf("*** error: gencards=%d must be >=4 and <=52\n", gencards); + return false; + } + if ((gencards % 4) != 0) + { + printf("*** error: gencards=%d not a multiple ofg 4\n", gencards); + return false; + } + if ((gentricks < 0) || (gentricks > 20)) + { + printf("*** error: gentricks=%d must be >=0 and <=20\n", gentricks); + return false; + } + + fp = fopen(szfile, "w"); + if (fp == 0) + { + printf("*** error: : cannot open gen file %s for writing\n", szfile); + return false; + } + + printf("\ngenerate: seed=%u deals=%d cards=%d tricks=%d file=%s\n", + genseed, gen, gencards, gentricks, szfile); + fflush(stdout); + + gib.setRNGSeed(genseed); + + timer.start(); + + nerror = ntotal = 0; + elapsed = totalelapsed = 0; + nodes = totalnodes = 0; + + for (ideal = 0; ideal < gen; ideal++) + { + // loop over generated deal + + // generate the deal + if (gib.generateDeal(gencards / 4) == false) + return false; + if (gib.setGeneratedDeal() == false) + break; + + // set tricks + if (gentricks > 0) + { + // initialize trick positions + for (trickpos = 0; trickpos < 20; trickpos++) + settrick[trickpos] = trickpos; + nsettrick = 20; + + // get sorted trick positions + for (itrick = 0; itrick < gentricks; itrick++) + { + // get a random trick position + trickpos = static_cast(gib.pRNG->randomUint + (static_cast(nsettrick))); + setpos[itrick] = settrick[trickpos]; + if (trickpos < nsettrick - 1) + memmove(settrick + trickpos, settrick + trickpos + 1, + static_cast(nsettrick - 1 - trickpos)*sizeof(int)); + nsettrick--; + } + + // compute trick values + for (itrick = 0; itrick < gentricks; itrick++) + { + timer.check(); + trickpos = setpos[itrick]; + gib.getTricks(trickpos, &leader, &trumps, &ntrick); + // set up dds10 + gib.Trumps = trumps; + gib.Leader = leader; + if (setDDS(&gib, &dl) == false) + return false; + sbcode = SolveBoard(dl, target, sol, mode, &fut, 0); + if (testSBCode(sbcode) == false) + return false; + getSBScore(fut, &maxscore, bscore, m); + if (maxscore < 0) + { + printf("*** error: deal=%d leader=%c : no score\n", + ideal + 1, chPLAYER[gib.Leader]); + return false; + } + score = maxscore; + if (score >= 0) + score = ((gib.Leader & 1) ? score : gib.numCard() / 4 - score); + + timer.check(); + nodes = static_cast(fut.nodes); + totalnodes += nodes; + elapsed = timer.dblDeltaElapsed(); + + printf(" deal=%d leader=%c %d%c nodes=%s elapsed=%0.2f\n", + ideal + 1, chPLAYER[gib.Leader], score, (trumps == 4) ? 'N' : chSUIT[trumps], + format64(nodes, sz1), elapsed); + + if (score < 10) + gib.szTricks[trickpos] = static_cast(score + '0'); + else + gib.szTricks[trickpos] = static_cast(score - 10 + 'A'); + } + } + + // write the deal to file + fprintf(fp, "%s:%s\n", gib.szDeal, gib.szTricks); + // flush file, so that cancel does not lose data + fflush(fp); + + // print the deal + printf("%d %s:%s\n", ideal + 1, gib.szDeal, gib.szTricks); + } + + timer.check(); + totalelapsed = timer.dElapsed; + printf("deals=%d nodes=%s elapsed=%0.2f\n" + "output written to file %s\n", + gen, format64(totalnodes, sz1), + totalelapsed, szfile); + + fclose(fp); + return true; + +} // generate +// ***************************************************************************** + +void getSBScore(const struct futureTricks & fut, int * pmaxscore, + bool bscore[14], ushort m[14][4]) +{ + // get DDS 'score' after SolveBoard(..) has been run + + int iscore, suit, alt; + + for (iscore = 0; iscore < 14; iscore++) + bscore[iscore] = false; + memset(m, 0, 14 * 4 * sizeof(ushort)); + *pmaxscore = -1; + + for (alt = 0; alt < fut.cards; alt++) + { + iscore = fut.score[alt]; + if (iscore == -1) + continue; + if (fut.rank[alt]) + { + bscore[iscore] = true; + if (*pmaxscore < iscore) + *pmaxscore = iscore; + suit = fut.suit[alt]; + setBit(m[iscore][suit], 14 - fut.rank[alt]); + ushort malt = static_cast(fut.equals[alt]); + while (malt) + { + int c = leastSignificant1Bit(malt); + clearBit(malt, c); + setBit(m[iscore][suit], 14 - c); + } + } + } + +} // getSBScore +// ***************************************************************************** + +bool giblib(char * pszfile, int target, int sol, int mode, char * pszgiblib) +{ + // run deals in giblib file for all possible tricks, + // collect and print the stats + + cGIBLib gib; + int sbcode, ideal1, ideal2, ideal, trickpos, trumps, + tricks = 0, leader; + int maxscore, nerror, score, ntotal; + char * pch; + bool ball, bscore[14]; + ushort m[14][4]; + + bool bok = false; + FILE * fp; + cTimer timer; + struct deal dl; + struct futureTricks fut; + + double elapsed, dealelapsed, totalelapsed; + unsigned long long nodes, dealnodes, totalnodes; + char sz1[32], sz2[32]; + + // get/test arguments + pch = strchr(pszgiblib, '-'); + if (pch == 0) + { + printf("*** error: giblib=%s not 'deal1-deal2[-all]'\n", pszgiblib); + return false; + } + ideal1 = atol(pszgiblib); + if ((ideal1 < 1) || (strlen(pszgiblib) == 0)) + { + printf("*** error: giblib=%s invalid deal1\n", pszgiblib); + return false; + } + pch++; + ideal2 = atol(pch); + if ((ideal2 < 1) || (strlen(pch) == 0)) + { + printf("*** error: giblib=%s invalid deal2\n", pszgiblib); + return false; + } + if (ideal1 > ideal2) + { + printf("*** error: giblib=%s ideal1 > ideal2\n", pszgiblib); + return false; + } + ball = false; + pch = strchr(pch, '-'); + if (pch) + { + if (strcmp(pch, "-all") != 0) + { + printf("*** error: giblib=%s expected '-all' after ideal2\n", pszgiblib); + return false; + } + ball = true; + } + + fp = openFile(pszfile); + if (fp == 0) + return false; + + printf("\n" + "giblib=%s target=%d sol=%d mode=%d\n", pszgiblib, target, sol, mode); + fflush(stdout); + + timer.start(); + + nerror = ntotal = 0; + elapsed = totalelapsed = 0; + nodes = totalnodes = 0; + + // skip to startdeal + for (ideal = 1; ideal < ideal1; ideal++) + { + bok = gib.readDeal(fp); + if (!bok) + return false; + } + + for (ideal = ideal1; ideal <= ideal2; ideal++) + { + // loop over deals in file + + // read giblib deal + bok = gib.readDeal(fp); + if (!bok) + break; + if (gib.setDeal() == false) + break; + + if ((gib.numCard() % 4) != 0) + { + printf(" warning: deal=%d cards=%d not multiple of 4, skipping deal ...\n", + ideal, gib.numCard()); + continue; + } + + // Note that we are using gib.szTricks internally, + // - if not read, we are setting it, + // - in addition we are correcting any errors. + + dealnodes = 0; + dealelapsed = 0.0; + + for (trickpos = 0; trickpos < 20; trickpos++) + { + if (gib.getTricks(trickpos, &leader, &trumps, &tricks) == false) + { + if (ball == false) + continue; + } + + // set up dds10 + gib.Trumps = trumps; + gib.Leader = leader; + if (setDDS(&gib, &dl) == false) + return false; + + sbcode = SolveBoard(dl, target, sol, mode, &fut, 0); + timer.check(); + if (testSBCode(sbcode) == false) + return false; + + getSBScore(fut, &maxscore, bscore, m); + if (maxscore < 0) + { + printf("*** error: deal=%d leader=%c no score\n", + ideal, chPLAYER[gib.Leader]); + return false; + } + score = maxscore; + if (score >= 0) + score = ((gib.Leader & 1) ? score : gib.numCard() / 4 - score); + + nodes = static_cast(fut.nodes); + dealnodes += nodes; + totalnodes += nodes; + elapsed = timer.dblDeltaElapsed(); + dealelapsed += elapsed; + totalelapsed += elapsed; + + if (gib.szTricks[trickpos] != '-') + { + printf(" deal=%d leader=%c %d%c score=%d nodes=%s elapsed=%0.2f\n", + ideal, chPLAYER[gib.Leader], tricks, (trumps == 4) ? 'N' : chSUIT[trumps], + score, format64(nodes, sz1), elapsed); + bok = true; + + // test that tricks and score agree + if ((score < 0) || score != tricks) + { + nerror++; + bok = false; + printf(" error: deal=%d leader=%c %d%c score=%d\n", + ideal, chPLAYER[gib.Leader], tricks, (trumps == 4) ? 'N' : chSUIT[trumps], + score); + } + } + else + { + printf(" deal=%d leader=%c %d%c nodes=%s elapsed=%0.2f\n", + ideal, chPLAYER[gib.Leader], score, (trumps == 4) ? 'N' : chSUIT[trumps], + format64(nodes, sz1), elapsed); + bok = false; + } + if (bok == false) + { + if (score < 10) + gib.szTricks[trickpos] = static_cast + (score + static_cast('0')); + else + gib.szTricks[trickpos] = static_cast + (score - 10 + static_cast('A')); + } + ntotal++; + } + + printf(" deal=%d nodes=%s elapsed=%0.2f totalelapsed=%0.2f\n" + " ", + ideal, format64(dealnodes, sz1), dealelapsed, totalelapsed); + if (strlen(gib.pszName)) + printf("name=%s ", gib.pszName); + printf("tricks=%s (max=%d)\n", + gib.szTricks, gib.numCard() / 4); + } + + printf("deals=%s nodes=%s avg=%s elapsed=%0.2f avg=%.02f\n", + pszgiblib, format64(totalnodes, sz1), + ntotal ? format64(totalnodes / static_cast(ntotal), sz2) : + format64(totalnodes, sz2), + totalelapsed, + ntotal ? totalelapsed / static_cast(ntotal) : + static_cast(totalelapsed)); + if (nerror) + printf("*** ERROR: nerror=%d, tricks and score different\n", nerror); + printf("\n"); + + fclose(fp); + + return true; + +} // giblib +// ***************************************************************************** + +FILE * openFile(char * pszfile) +{ + if (pszfile == 0) + { + printf("*** error: no 'giblib' file specified\n"); + return 0; + } + + /*if(access(pszfile,F_OK) != 0) + { printf("*** error: non-existing file %s\n",pszfile); + return 0; + } + */ + + FILE * fp = fopen(pszfile, "r"); + if (fp == 0) + { + printf("*** : cannot open file %s for reading\n", pszfile); + return 0; + } + + return fp; + +} // openFile +// ***************************************************************************** + +void playDD(cGIBLib * pgib, int target, int sol) +{ + cTimer timer; + double elapsed = 0; + struct deal dl; + struct futureTricks fut; + int sbcode, suit, card, ntotalcard; + char * pch, *pchend, buf[255]; + bool bhelp = false, bcompute = true; + char szplayer[4][6] = {"west", "north", "east", "south"}; + + printf("\n"); + pgib->print(); + printf("\n"); + + timer.start(); + for (;;) + { + pgib->printHands(); + pgib->printInfo(); + printf("\n"); + fflush(stdout); + + ntotalcard = pgib->numCard(); + if (ntotalcard) + { + // DDS only when there are cards left to play + if (bcompute) + { + // set up dds10 + if (setDDS(pgib, &dl) == false) + return; + + timer.check(); + sbcode = SolveBoard(dl, target, sol, 1, &fut, 0); + timer.check(); + if (testSBCode(sbcode) == false) + exit(-1); + elapsed += timer.dblDeltaElapsed(); + } + printSBScore(target, sol, &fut, elapsed); + } + + if (bhelp) + { + printf("help for options:\n" + " 'q' - quit \n" + " 'h' - print this help \n" + " 'u' - unplay previous card (if available) \n" + " 'sc' - card/suit to play, e.g. dq/ht/s3\n" + " must be valid for current player \n" + ); + bhelp = false; + } + + bcompute = false; + if (ntotalcard > 0) + printf("enter options for %s ", szplayer[pgib->Player]); + else + printf("enter options "); + if (ntotalcard <= 0) + printf("(q/h/u): "); + else if (pgib->nPlayed > 0) + printf("(q/h/u/sc): "); + else + printf("(q/h/sc): "); + fflush(stdout); + pch = fgets(buf, 255, stdin); + if (pch == 0) + continue; + pchend = strchr(buf, '\n'); + if (pchend) + *pchend = '\0'; + pchend = strchr(buf, '\r'); + if (pchend) + *pch = '\0'; + while (*pch == ' ') + pch++; + if (*pch == '\0') + continue; + if (*pch == 'q') + break; + else if ((pch[0] == 'h') && ((pch[1] == ' ') || (pch[1] == '\0'))) + { + bhelp = true; + continue; + } + else if ((pgib->nPlayed > 0) && (*pch == 'u')) + { + if (pgib->unplayCard()) + bcompute = true; + } + else if (ntotalcard) + { + if (tolower(pch[0]) == 's') suit = 0; + else if (tolower(pch[0]) == 'h') suit = 1; + else if (tolower(pch[0]) == 'd') suit = 2; + else if (tolower(pch[0]) == 'c') suit = 3; + else + continue; + pch++; + card = static_cast(cGIBLib::getCard(pch[0])); + if (card == eCARD_NONE) + continue; + + // play the card + pgib->SuitPlayed[pgib->nPlayed] = suit; + pgib->CardPlayed[pgib->nPlayed] = card; + if (pgib->playCard(suit, card)) + bcompute = true; + } + } + +} // playDD +// ***************************************************************************** + +void printSBScore(int target, int solutions, struct futureTricks * pfut, + double elapsed) +{ + // print DDS 'score' after SolveBoard(..) has been run + + char sz1[32]; + bool bscore[14]; + ushort m[14][4]; + int maxscore; + + printf("-- sb completed: nodes=%s tgt=%d sol=%d alt=%d elapsed=%0.2f\n", + format(static_cast(pfut->nodes), sz1), target, solutions, pfut->cards, elapsed); + getSBScore(*pfut, &maxscore, bscore, m); + printSBScore(bscore, m); + +} // printSBScore +// ***************************************************************************** + +void printSBScore(bool bscore[14], ushort m[14][4]) +{ + int iscore, suit, nscore = 0; + + for (iscore = 0; iscore < 14; iscore++) + { + if (bscore[iscore]) + { + nscore++; + printf(" %2d: ", iscore); + for (suit = 0; suit < 4; suit++) + { + if (m[iscore][suit]) + { + printf("%c ", chSUIT[suit]); + while (m[iscore][suit]) + { + int c = leastSignificant1Bit(m[iscore][suit]); + clearBit(m[iscore][suit], c); + printf("%c", chCARD[c]); + } + printf(" "); + } + } + printf("\n"); + } + } + + if (nscore == 0) + printf(" none\n"); + +} // printSBScore +// ***************************************************************************** + +bool setDDS(cGIBLib * pgib, struct deal * pdl) +{ + // setup deal structure for DDS + + int pl, suit, ntrick, ntrickcard; + int lastsuit, lastcard, card; + + pdl->trump = pgib->Trumps; // s=0,h=1,d=2,c=3,nt=4 + + // remaining cards from partial trick + ntrick = (pgib->nPlayed / 4); + ntrickcard = (pgib->nPlayed - 4 * ntrick); + memset(pdl->currentTrickSuit, 0, 3 * sizeof(int)); + memset(pdl->currentTrickRank, 0, 3 * sizeof(int)); + if (ntrickcard > 0) + { + for (pl = 0; pl < ntrickcard; pl++) + { + lastsuit = pgib->SuitPlayed[4 * ntrick + pl]; + lastcard = pgib->CardPlayed[4 * ntrick + pl]; + pdl->currentTrickSuit[pl] = lastsuit; + pdl->currentTrickRank[pl] = CARD2DDS(lastcard); + } + } + + // DDS leader + pdl->first = PLAYER2DDS(pgib->Leader); // n=0,e=1,s=2,w=3 + + // DDS remaining cards + for (pl = 0; pl < 4; pl++) + { + int ddspl = PLAYER2DDS(pl); + for (suit = 0; suit < 4; suit++) + { + ushort m = 0, mp = pgib->mPlayerSuit[pl][suit]; + while (mp) + { + card = leastSignificant1Bit(mp); + clearBit(mp, card); + setBit(m, CARD2DDS(card)); + } + pdl->remainCards[ddspl][suit] = static_cast(m); + } + } + + return true; + +} // setDDDS +// ***************************************************************************** + +bool testSBCode(int sbcode) +{ + // test DDS return code after SolveBoard(..) has been run + + if (sbcode != RETURN_NO_FAULT) + { + char line[80]; + ErrorMessage(sbcode, line); + printf("*** error: %s\n", line); + return false; + } + + return true; + +} // testSBCode +// ***************************************************************************** + +bool timeAll(char * pszfile, int trumps, int leader) +{ + // run all deals in giblib file for sol=1/2/3, + // collect and print the stats + + cGIBLib gib; + int sbcode, ideal; + bool bok = false; + FILE * fp; + cTimer timer; + struct deal dl; + struct futureTricks fut; + + double totalelapsed = 0.0, elapsed[3] = {0.0, 0.0, 0.0}; + unsigned long long totalnodes = 0, nodes[3] = {0, 0, 0}; + +#define LEN_RESULTNAME 15 + struct sResult + { + int nNode[3]; + double Elapsed[3]; + char szName[LEN_RESULTNAME + 1]; + }; + +#define MAX_RESULT 10 + int sol, target = -1, mode = 1, ndealalloc = 0, ndeal, nresult = 0; + struct sResult * presult = 0; + + for (sol = 1; sol <= 3; sol++) + { + ndeal = 0; + for (;;) + { + // loop over deals in file + + // open file + fp = openFile(pszfile); + if (fp == 0) + return false; + + // read giblib deal + bok = gib.readFile(ndeal, 0, fp); + fclose(fp); + if (!bok) + break; + + if (trumps != -1) + gib.Trumps = trumps; + if (leader != -1) + gib.Leader = leader; + + printf("\n"); + gib.print(); + printf("\n"); + gib.printHands(); + gib.printInfo(); + printf("\n"); + fflush(stdout); + + // set up dds10 + if (setDDS(&gib, &dl) == false) + return false; + + timer.start(); + sbcode = SolveBoard(dl, target, sol, mode, &fut, 0); + timer.check(); + if (testSBCode(sbcode) == false) + return false; + printSBScore(target, sol, &fut, timer.dblElapsed()); + + if (ndeal >= ndealalloc) + { + presult = static_cast + (realloc(presult, (static_cast(ndealalloc) + 25) * sizeof(sResult))); + if (presult == 0) + { + printf("*** error: cannot allocate result array\n"); + return false; + } + ndealalloc += 25; + } + + presult[ndeal].nNode[sol - 1] = fut.nodes; + presult[ndeal].Elapsed[sol - 1] = timer.dblElapsed(); + strncpy(presult[ndeal].szName, gib.pszName, LEN_RESULTNAME); + presult[ndeal].szName[LEN_RESULTNAME] = '\0'; + ndeal++; + if (nresult < ndeal) + nresult = ndeal; + + totalnodes += static_cast(fut.nodes); + nodes[sol - 1] += static_cast(fut.nodes); + totalelapsed += timer.dblElapsed(); + elapsed[sol - 1] += timer.dblElapsed(); + } + } + + // print the results + printf("\n" + "test sol=1 sol=2 sol=3\n" + "--------- ---------------- ---------------- ---------------\n" + ); + for (ideal = 0; ideal < nresult; ideal++) + { + char szline[128], sz1[32], sz2[32]; + int len, pos; + memset(szline, ' ', 127); + len = static_cast(strlen(presult[ideal].szName)); + if (len) + strncpy(szline, presult[ideal].szName, static_cast(len)); + pos = LEN_RESULTNAME + 1; + for (sol = 0; sol < 3; sol++) + { + format( static_cast(presult[ideal].nNode[sol]), sz1); + sprintf(sz2, "%0.2f", presult[ideal].Elapsed[sol]); + len = static_cast(strlen(sz1)); + strncpy(szline + pos + 12 - len, sz1, static_cast(len)); + pos += 13; + len = static_cast(strlen(sz2)); + strncpy(szline + pos + 5 - len, sz2, static_cast(len)); + pos += 8; + } + szline[pos] = '\0'; + printf("%s\n", szline); + } + printf("\n"); + { + char sz1[32], sz2[32], sz3[32], sz4[32]; + printf(" nodes: total=%s sol-1=%s sol-2=%s sol-3=%s\n", + format64(totalnodes, sz1), format64(nodes[0], sz2), + format64(nodes[1], sz3), format64(nodes[2], sz4)); + } + printf("elapsed: total=%0.2f sol-1=%0.2f sol-2=%0.2f sol-3=%0.2f\n", + totalelapsed, elapsed[0], elapsed[1], elapsed[2]); + + return true; + +} // timeAll +// ***************************************************************************** + +bool timeg(char * pszfile, int target, int sol, int mode, + char * pszxcn, int leader, bool bverbose) +{ + // run and validate specified number of deals deals in + // giblib file for given contract/leader/target/sol/mode + + cGIBLib gib; + int sbcode, ideal, currentdeal, trickpos; + int maxscore, nerror, score; + bool bscore[14]; + ushort m[14][4]; + + bool bok = false; + FILE * fp; + cTimer timer; + struct deal dl; + struct futureTricks fut; + + double elapsed = 0.0, minelapsed = 1.0e10, maxelapsed = 0.0; + unsigned long long nodes = 0; + int minnode = 2000000000, maxnode = 0; + char sz1[32], sz2[32], sz3[32]; + char optx; + int tricks, contract, ndeal; + + // get/test arguments + if (strlen(pszxcn) < 3) + { + printf("*** error: timeg options=%s is not >=3\n", pszxcn); + return false; + } + optx = pszxcn[0]; + if (!isxdigit(optx)) + { + printf("*** error: timeg optionX=%c is not hex digit 3\n", optx); + return false; + } + if ((tolower(optx) == 'e') || (tolower(optx) == 'f')) + { + printf("*** error: timeg optionX=%c more than 13 tricks\n", optx); + return false; + } + optx = static_cast(tolower(optx)); + tricks = (static_cast(optx) - static_cast('0')); + if ((tricks < 0) || (tricks > 9)) + tricks = static_cast(optx - static_cast('a') + 10); + + if (pszxcn[1] == 's') contract = 0; + else if (pszxcn[1] == 'h') contract = 1; + else if (pszxcn[1] == 'd') contract = 2; + else if (pszxcn[1] == 'c') contract = 3; + else if (pszxcn[1] == 'n') contract = 4; + else + { + printf("*** error: timeg contract=%c is not s/h/d/c/n\n", pszxcn[1]); + return false; + } + ndeal = atol(pszxcn + 2); + if (ndeal <= 0) + { + printf("*** error: timeg ndeal=%d is not >= 0\n", ndeal); + return false; + } + + if (contract == 4) + trickpos = 0; // nt + else + trickpos = 4 + 4 * contract; // s/h/d/c + // giblib leader goes s/e/n/w + // our leader goes w/n/e/s + trickpos += (3 - leader); + + fp = openFile(pszfile); + if (fp == 0) + return false; + + printf("\n" + "timeg tricks=%d contract=%c deals=%d target=%d sol=%d mode=%d leader=%c\n", + tricks, "shdcn"[contract], ndeal, target, sol, mode, chPLAYER[leader]); + fflush(stdout); + + timer.start(); + + ideal = currentdeal = nerror = 0; + for (;;) + { + // loop over deals in file + + // read giblib deal + bok = gib.readDeal(fp); + if (!bok) + break; + if (gib.setDeal() == false) + break; + + currentdeal++; + + if (optx != tolower(gib.szTricks[trickpos])) + continue; + + ideal++; + // set up dds10 + gib.Trumps = contract; + if (leader != -1) + gib.Leader = leader; + if (setDDS(&gib, &dl) == false) + return false; + + sbcode = SolveBoard(dl, target, sol, mode, &fut, 0); + timer.check(); + if (testSBCode(sbcode) == false) + return false; + + getSBScore(fut, &maxscore, bscore, m); + if (maxscore < 0) + { + nerror++; + printf("\r --- error: deal=%d ndeal=%d no score\n", + currentdeal, ideal); + } + else + { + score = maxscore; + if (score >= 0) + //score = ((leader & 1) ? gib.numCard()/4-score : score); + score = ((leader & 1) ? score : gib.numCard() / 4 - score); + if ((score < 0) || score != tricks) + { + nerror++; + printf("\r --- error: deal=%d ndeal=%d tricks=%d score=%d\n", + currentdeal, ideal, tricks, score); + } + } + + if (!bverbose) + printf("\r"); + printf(" deal=%d ndeal=%d nodes=%s elapsed=%0.2f", + currentdeal, ideal, format64(static_cast(fut.nodes), sz1), + timer.deltaElapsed); + if (!bverbose) + printf(" "); + else + printf("\n"); + fflush(stdout); + + nodes += static_cast(fut.nodes); + elapsed += timer.dblDeltaElapsed(); + + if (minnode > fut.nodes) + minnode = fut.nodes; + if (maxnode < fut.nodes) + maxnode = fut.nodes; + + if (minelapsed > timer.deltaElapsed) + minelapsed = timer.deltaElapsed; + if (maxelapsed < timer.deltaElapsed) + maxelapsed = timer.deltaElapsed; + + if (ideal >= ndeal) + break; + } + if (ideal <= 0) + printf("no deals found\n"); + else + { + printf("\rdeals=%d nodes=%s elapsed=%0.2f \n", + ndeal, format64(nodes, sz1), elapsed); + printf("min_node=%s max_node=%s avg=%s\n", + format(static_cast(minnode), sz1), + format(static_cast(maxnode), sz2), + format(static_cast + ( ideal > 0 ? static_cast(nodes) / static_cast(ideal) : static_cast(nodes)), + sz3)); + printf("min_elapsed=%0.2f max_elapsed=%0.2f avg=%0.2f\n", + minelapsed, maxelapsed, (elapsed > 0.0) ? elapsed / + static_cast(ideal) : elapsed); + } + if (nerror) + printf("*** ERROR: nerror=%d, incorrect maximum tricks\n", nerror); + else + printf("errors=0\n"); + printf("\n"); + + fclose(fp); + + return true; + +} // timeg +// ***************************************************************************** + +bool tricks(cGIBLib * pgib, int ideal, int target, int sol, int mode) +{ + // run deal in giblib file for all possible tricks, + // collect and print the stats + + int sbcode, trickpos, trumps; + int maxscore, score; + bool bscore[14]; + ushort m[14][4]; + + cTimer timer; + struct deal dl; + struct futureTricks fut; + + double elapsed, dealelapsed, totalelapsed; + unsigned long long nodes, dealnodes, totalnodes; + char sz1[32]; + + if (pgib->pszName && strlen(pgib->pszName)) + printf("\nname=%s", pgib->pszName); + else + printf("\ndeal=%d", ideal); + printf(" target=%d sol=%d mode=%d\n", target, sol, mode); + fflush(stdout); + + timer.start(); + + elapsed = totalelapsed = 0; + nodes = totalnodes = 0; + + dealnodes = 0; + dealelapsed = 0.0; + + memset(pgib->szTricks, '-', 20); + pgib->szTricks[20] = '\0'; + + for (trickpos = 0; trickpos < 20; trickpos++) + { + if (trickpos < 4) + trumps = 4; + else + trumps = (trickpos - 4) / 4; + + // set up dds10 + pgib->Trumps = trumps; + pgib->Leader = 3 - (trickpos % 4); + if (setDDS(pgib, &dl) == false) + return false; + + sbcode = SolveBoard(dl, target, sol, mode, &fut, 0); + timer.check(); + if (testSBCode(sbcode) == false) + return false; + + getSBScore(fut, &maxscore, bscore, m); + if (maxscore < 0) + { + printf("*** error: leader=%c no score\n", + chPLAYER[pgib->Leader]); + return false; + } + score = maxscore; + if (score >= 0) + score = ((pgib->Leader & 1) ? score : pgib->numCard() / 4 - score); + + nodes = static_cast(fut.nodes); + dealnodes += nodes; + totalnodes += nodes; + elapsed = timer.dblDeltaElapsed(); + dealelapsed += elapsed; + totalelapsed += elapsed; + + printf(" leader=%c %d%c nodes=%s elapsed=%0.2f\n", + chPLAYER[pgib->Leader], score, (trumps == 4) ? 'N' : chSUIT[trumps], + format64(nodes, sz1), elapsed); + + if (score < 10) + pgib->szTricks[trickpos] = static_cast + (score + static_cast('0')); + else + pgib->szTricks[trickpos] = static_cast + (score - 10 + static_cast('A')); + } + printf("nodes=%s elapsed=%0.2f totalelapsed=%0.2f\n", + format64(dealnodes, sz1), dealelapsed, totalelapsed); + + printf("\n"); + pgib->printHands(); + printf("\n"); + if (pgib->pszName && strlen(pgib->pszName)) + printf("name=%s", pgib->pszName); + else + printf("deal=%d", ideal); + printf(" tricks(leader=senw):"); + for (trickpos = 0; trickpos < 20; trickpos++) + { + if ((trickpos % 4) == 0) + { + if (trickpos == 0) + printf(" n="); + else if (trickpos == 4) + printf(" s="); + else if (trickpos == 8) + printf(" h="); + else if (trickpos == 12) + printf(" d="); + else if (trickpos == 16) + printf(" c="); + } + printf("%c", pgib->szTricks[trickpos]); + } + printf(" (max=%d)\n\n", pgib->numCard() / 4); + + return true; + +} // tricks +// ***************************************************************************** +/* +================================================================================ +output for: test.gib -timeall +================================================================================ + +test sol=1 sol=2 sol=3 +--------- ---------------- ---------------- --------------- +gib2 13 0.02 17 0.02 17 0.02 +gib3 55 0.02 74 0.03 74 0.02 +gib4 144 0.02 239 0.02 290 0.02 +gib5 283 0.02 828 0.03 1,321 0.02 +gib10 24,616 0.05 56,172 0.09 73,522 0.10 +gin 17,372 0.05 330,860 0.37 836,869 0.96 +dbldum1 1,806 0.03 3,052 0.03 3,084 0.03 +dbldum2 272,365 0.25 767,339 0.71 767,339 0.69 +devil1 94,935 0.12 179,691 0.21 336,969 0.34 +callahan 502,044 0.60 1,303,934 1.99 1,679,319 2.33 +g410-scc 121,233 0.15 140,942 0.20 464,298 0.45 +giblibno1 4,026,572 5.01 6,887,233 9.50 8,470,777 11.83 +giblibno2 469,241 0.48 586,377 0.61 586,377 0.60 +bo17 578,078 0.69 1,342,200 1.64 1,813,889 2.06 +bo21 2,614,869 3.65 3,229,875 4.45 6,668,155 9.07 +giblib1 70,093 0.10 158,829 0.20 158,829 0.18 +giblib2 1,362,230 1.34 1,698,895 1.68 7,052,520 6.82 +giblib3 178,884 0.18 477,891 0.38 477,899 0.39 +giblib4 148,267 0.16 345,545 0.35 1,523,658 1.43 +giblib5 997,945 1.00 3,119,281 3.24 3,119,281 3.24 +giblib6 1,634,670 1.60 3,446,862 3.70 3,805,367 3.85 +giblib7 116,215 0.16 575,832 0.67 606,341 0.64 +giblib8 188,369 0.20 1,115,375 1.08 1,115,375 1.06 +giblib9 1,287,045 1.33 2,542,975 2.88 4,461,078 5.17 +giblib10 141,894 0.41 440,351 0.49 872,148 0.91 + + nodes: total=88,494,703 sol-1=14,849,238 sol-2=28,750,669 sol-3=44,894,796 +elapsed: total=104.43 sol-1=17.65 sol-2=34.56 sol-3=52.23 + +================================================================================ +output for: ../giblib -sol=1 -v -timeg=9n10 +================================================================================ + +timeg tricks=9 contract=n deals=10 target=-1 sol=1 mode=1 leader=W + deal=4 ndeal=1 nodes=148,267 elapsed=0.17 + deal=5 ndeal=2 nodes=997,945 elapsed=1.02 + deal=8 ndeal=3 nodes=188,369 elapsed=0.20 + deal=56 ndeal=4 nodes=2,496,093 elapsed=2.88 + deal=68 ndeal=5 nodes=1,942,886 elapsed=2.07 + deal=81 ndeal=6 nodes=595,946 elapsed=0.57 + deal=94 ndeal=7 nodes=910,639 elapsed=1.07 + deal=99 ndeal=8 nodes=2,916,346 elapsed=3.54 + deal=103 ndeal=9 nodes=247,399 elapsed=0.26 + deal=116 ndeal=10 nodes=353,807 elapsed=0.38 +deals=10 nodes=10,797,697 elapsed=12.16 +min_node=148,267 max_node=2,916,346 avg=1,079,769 +min_elapsed=0.17 max_elapsed=3.54 avg=1.22 +errors=0 + +================================================================================ +output for: ../giblib -giblib=1-1 +================================================================================ + +giblib=1-1 target=-1 sol=1 mode=1 + deal=1 leader=S 8N score=8 nodes=76,507 elapsed=0.10 + deal=1 leader=E 8N score=8 nodes=73,856 elapsed=0.10 + deal=1 leader=N 8N score=8 nodes=66,062 elapsed=0.09 + deal=1 leader=W 8N score=8 nodes=70,093 elapsed=0.10 + deal=1 leader=S 7S score=7 nodes=633,804 elapsed=0.77 + deal=1 leader=E 7S score=7 nodes=227,684 elapsed=0.26 + deal=1 leader=N 7S score=7 nodes=617,829 elapsed=0.78 + deal=1 leader=W 7S score=7 nodes=239,070 elapsed=0.28 + deal=1 leader=S 10H score=10 nodes=44,135 elapsed=0.07 + deal=1 leader=E 9H score=9 nodes=64,593 elapsed=0.10 + deal=1 leader=N 10H score=10 nodes=25,802 elapsed=0.05 + deal=1 leader=W 9H score=9 nodes=66,538 elapsed=0.10 + deal=1 leader=S 7D score=7 nodes=710,876 elapsed=0.95 + deal=1 leader=E 7D score=7 nodes=129,917 elapsed=0.17 + deal=1 leader=N 7D score=7 nodes=740,822 elapsed=1.00 + deal=1 leader=W 7D score=7 nodes=156,316 elapsed=0.20 + deal=1 leader=S 8C score=8 nodes=287,964 elapsed=0.31 + deal=1 leader=E 8C score=8 nodes=234,815 elapsed=0.26 + deal=1 leader=N 8C score=8 nodes=367,526 elapsed=0.39 + deal=1 leader=W 8C score=8 nodes=128,382 elapsed=0.16 + deal=1 nodes=4,962,591 elapsed=6.25 totalelapsed=6.25 + tricks=88887777A9A977778888 (max=13) +deals=1-1 nodes=4,962,591 avg=248,129 elapsed=6.25 avg=0.31 + +================================================================================ +output for: test.gib -tricks -name=gin +================================================================================ + +name=gin target=-1 sol=1 mode=1 + leader=S 9N nodes=252,521 elapsed=0.32 + leader=E 9N nodes=538,589 elapsed=0.59 + leader=N 9N nodes=276,076 elapsed=0.35 + leader=W 8N nodes=17,372 elapsed=0.05 + leader=S 9S nodes=1,268,000 elapsed=2.08 + leader=E 8S nodes=1,726,949 elapsed=2.50 + leader=N 9S nodes=695,799 elapsed=0.96 + leader=W 8S nodes=1,656,521 elapsed=2.83 + leader=S 9H nodes=476,674 elapsed=0.59 + leader=E 9H nodes=531,859 elapsed=0.61 + leader=N 9H nodes=437,013 elapsed=0.53 + leader=W 9H nodes=298,225 elapsed=0.33 + leader=S 6D nodes=474,565 elapsed=0.57 + leader=E 6D nodes=238,345 elapsed=0.29 + leader=N 6D nodes=370,831 elapsed=0.44 + leader=W 6D nodes=60,061 elapsed=0.09 + leader=S 7C nodes=1,118,923 elapsed=1.46 + leader=E 7C nodes=1,074,097 elapsed=1.27 + leader=N 7C nodes=1,267,293 elapsed=1.70 + leader=W 7C nodes=587,523 elapsed=0.62 +nodes=13,367,236 elapsed=18.18 totalelapsed=18.18 + + K Q 9 + A Q J + 9 6 4 3 2 + 8 6 + T 6 8 7 3 2 + T 9 2 7 5 3 + T A K Q J 8 5 + A J T 9 5 3 2 - + A J 5 4 + K 8 6 4 + 7 + K Q 7 4 + +name=gin tricks(leader=senw): n=9998 s=9898 h=9999 d=6666 c=7777 (max=13) + +dds/jack database format: +------------------------- +deal: A873.QJ8.T832.42 T52.965.J76.JT86 KJ96.K7.AQ.A9753 Q4.AT432.K954.KQ + +sol=3 +contract:hearts play:W + 6: D T + 7: S A873 H QJ8 D 832 C 42 +contract:hearts play:N + 5: D J + 6: S T52 H 965 D 76 C JT86 +contract:hearts play:E + 7: S KJ96 H K7 D AQ C A9753 +contract:hearts play:S + 5: D K954 + 6: S Q4 H AT432 C KQ + +db row for sol=3: +A873.QJ8.T832.42 T52.965.J76.JT86 KJ96.K7.AQ.A9753 Q4.AT432.K954.KQ:H: +7777777677777666666566666677777777777776666666555566 + +================================================================================ +dds10x output for: test.gib -timeall +================================================================================ + +test sol=1 sol=2 sol=3 +--------- ---------------- ---------------- --------------- +gib2 13 0.02 17 0.02 17 0.02 +gib3 55 0.02 74 0.02 74 0.02 +gib4 132 0.02 220 0.03 267 0.02 +gib5 232 0.02 677 0.02 1,091 0.03 +gib10 23,990 0.05 54,710 0.09 71,783 0.10 +gin 12,536 0.05 301,204 0.36 712,655 0.82 +dbldum1 1,320 0.03 2,045 0.02 2,070 0.03 +dbldum2 271,126 0.26 761,667 0.75 761,667 0.72 +devil1 80,278 0.11 145,941 0.17 279,078 0.30 +callahan 373,482 0.47 987,935 1.54 1,273,233 1.87 +g410-scc 82,136 0.12 98,589 0.13 324,586 0.41 +giblibno1 2,905,488 3.92 5,015,652 7.65 6,153,242 9.48 +giblibno2 339,994 0.38 440,591 0.49 440,591 0.49 +bo17 448,820 0.56 985,737 1.23 1,378,182 1.62 +bo21 2,103,531 3.08 2,622,826 3.82 5,511,592 7.83 +giblib1 39,201 0.08 97,312 0.13 97,312 0.14 +giblib2 838,043 0.95 1,081,582 1.19 5,357,787 5.55 +giblib3 118,210 0.12 310,481 0.28 310,487 0.28 +giblib4 113,139 0.14 210,143 0.23 1,155,003 1.14 +giblib5 720,826 0.77 2,301,738 2.66 2,301,738 2.60 +giblib6 813,750 0.90 1,629,511 1.92 1,837,380 2.04 +giblib7 89,093 0.12 443,105 0.51 469,467 0.54 +giblib8 137,034 0.20 751,701 0.81 751,701 0.78 +giblib9 936,282 1.05 1,734,880 2.02 3,170,680 3.77 +giblib10 117,587 0.15 371,259 0.44 710,326 0.79 + nodes: total=63,987,904 sol-1=10,566,298 sol-2=20,349,597 sol-3=33,072,009 +elapsed: total=81.50 sol-1=13.60 sol-2=26.52 sol-3=41.38 + +================================================================================ +dds10x output for: ../giblib -sol=1 -v -timeg=9n10 +================================================================================ + +timeg tricks=9 contract=n deals=10 target=-1 sol=1 mode=1 leader=W + deal=4 ndeal=1 nodes=113,139 elapsed=0.14 + deal=5 ndeal=2 nodes=720,826 elapsed=0.79 + deal=8 ndeal=3 nodes=137,034 elapsed=0.17 + deal=56 ndeal=4 nodes=1,837,912 elapsed=2.17 + deal=68 ndeal=5 nodes=1,224,530 elapsed=1.37 + deal=81 ndeal=6 nodes=410,308 elapsed=0.42 + deal=94 ndeal=7 nodes=593,127 elapsed=0.73 + deal=99 ndeal=8 nodes=1,946,230 elapsed=2.37 + deal=103 ndeal=9 nodes=155,728 elapsed=0.18 + deal=116 ndeal=10 nodes=174,796 elapsed=0.22 +deals=10 nodes=7,313,630 elapsed=8.57 +min_node=113,139 max_node=1,946,230 avg=731,363 +min_elapsed=0.14 max_elapsed=2.37 avg=0.86 +errors=0 + +================================================================================ +dds10x output for: ../giblib -giblib=1-1 +================================================================================ + +giblib=1-1 target=-1 sol=1 mode=1 + deal=1 leader=S 8N score=8 nodes=50,178 elapsed=0.08 + deal=1 leader=E 8N score=8 nodes=39,811 elapsed=0.08 + deal=1 leader=N 8N score=8 nodes=43,703 elapsed=0.08 + deal=1 leader=W 8N score=8 nodes=39,201 elapsed=0.07 + deal=1 leader=S 7S score=7 nodes=420,588 elapsed=0.56 + deal=1 leader=E 7S score=7 nodes=155,765 elapsed=0.23 + deal=1 leader=N 7S score=7 nodes=426,794 elapsed=0.60 + deal=1 leader=W 7S score=7 nodes=164,092 elapsed=0.23 + deal=1 leader=S 10H score=10 nodes=33,596 elapsed=0.07 + deal=1 leader=E 9H score=9 nodes=45,895 elapsed=0.09 + deal=1 leader=N 10H score=10 nodes=19,817 elapsed=0.05 + deal=1 leader=W 9H score=9 nodes=47,289 elapsed=0.09 + deal=1 leader=S 7D score=7 nodes=454,538 elapsed=0.63 + deal=1 leader=E 7D score=7 nodes=80,961 elapsed=0.13 + deal=1 leader=N 7D score=7 nodes=492,525 elapsed=0.69 + deal=1 leader=W 7D score=7 nodes=90,791 elapsed=0.14 + deal=1 leader=S 8C score=8 nodes=169,389 elapsed=0.21 + deal=1 leader=E 8C score=8 nodes=144,696 elapsed=0.19 + deal=1 leader=N 8C score=8 nodes=239,940 elapsed=0.29 + deal=1 leader=W 8C score=8 nodes=86,347 elapsed=0.13 + deal=1 nodes=3,245,916 elapsed=4.63 totalelapsed=4.63 + tricks=88887777A9A977778888 (max=13) +deals=1-1 nodes=3,245,916 avg=162,295 elapsed=4.63 avg=0.23 + +================================================================================ +dds105 output for: test.gib -timeall +================================================================================ + +test sol=1 sol=2 sol=3 +--------- ---------------- ---------------- --------------- +gib2 13 0.02 17 0.02 17 0.02 +gib3 51 0.03 70 0.02 70 0.02 +gib4 108 0.02 196 0.02 241 0.02 +gib5 201 0.02 615 0.02 1,029 0.03 +gib10 23,631 0.05 53,970 0.08 70,393 0.09 +gin 11,804 0.05 264,863 0.32 639,086 0.77 +dbldum1 1,190 0.02 1,756 0.02 1,781 0.03 +dbldum2 244,373 0.24 691,508 0.68 691,508 0.68 +devil1 77,028 0.11 140,404 0.17 269,045 0.29 +callahan 342,844 0.44 918,162 1.45 1,182,747 1.72 +g410-scc 77,328 0.12 92,379 0.14 316,332 0.36 +giblibno1 2,211,230 3.19 3,884,687 6.13 4,797,243 7.54 +giblibno2 307,453 0.36 401,005 0.47 401,005 0.47 +bo17 344,725 0.44 826,074 1.08 1,184,613 1.42 +bo21 1,793,723 2.60 2,249,871 3.23 4,791,239 6.78 +giblib1 37,717 0.07 90,410 0.13 90,410 0.13 +giblib2 780,451 0.88 1,009,229 1.15 5,027,108 5.38 +giblib3 111,864 0.12 294,222 0.28 294,228 0.28 +giblib4 102,296 0.13 191,583 0.22 1,086,325 1.13 +giblib5 671,160 0.73 2,180,365 2.49 2,180,365 2.50 +giblib6 763,607 0.85 1,531,703 1.79 1,722,183 1.98 +giblib7 71,888 0.10 375,551 0.47 399,876 0.49 +giblib8 120,940 0.15 689,874 0.73 689,874 0.73 +giblib9 802,763 0.93 1,507,576 1.80 2,802,602 3.46 +giblib10 88,779 0.13 272,940 0.34 586,850 0.69 + nodes: total=55,882,367 sol-1=8,987,167 sol-2=17,669,030 sol-3=29,226,170 +elapsed: total=72.11 sol-1=11.83 sol-2=23.27 sol-3=37.01 + +================================================================================ +dds105 output for: ../giblib -sol=1 -v -timeg=9n10 +================================================================================ + +timeg tricks=9 contract=n deals=10 target=-1 sol=1 mode=1 leader=W + deal=4 ndeal=1 nodes=102,296 elapsed=0.14 + deal=5 ndeal=2 nodes=671,160 elapsed=0.74 + deal=8 ndeal=3 nodes=120,940 elapsed=0.17 + deal=56 ndeal=4 nodes=1,700,168 elapsed=2.07 + deal=68 ndeal=5 nodes=1,070,739 elapsed=1.26 + deal=81 ndeal=6 nodes=372,940 elapsed=0.40 + deal=94 ndeal=7 nodes=490,804 elapsed=0.61 + deal=99 ndeal=8 nodes=1,819,501 elapsed=2.30 + deal=103 ndeal=9 nodes=103,882 elapsed=0.14 + deal=116 ndeal=10 nodes=150,449 elapsed=0.19 +deals=10 nodes=6,602,879 elapsed=8.01 +min_node=102,296 max_node=1,819,501 avg=660,287 +min_elapsed=0.14 max_elapsed=2.30 avg=0.80 +errors=0 + +================================================================================ +dds105 output for: ../giblib -giblib=1-1 +================================================================================ + +giblib=1-1 target=-1 sol=1 mode=1 + deal=1 leader=S 8N score=8 nodes=44,008 elapsed=0.08 + deal=1 leader=E 8N score=8 nodes=38,642 elapsed=0.07 + deal=1 leader=N 8N score=8 nodes=36,150 elapsed=0.07 + deal=1 leader=W 8N score=8 nodes=37,717 elapsed=0.07 + deal=1 leader=S 7S score=7 nodes=342,376 elapsed=0.46 + deal=1 leader=E 7S score=7 nodes=134,659 elapsed=0.18 + deal=1 leader=N 7S score=7 nodes=358,216 elapsed=0.49 + deal=1 leader=W 7S score=7 nodes=143,287 elapsed=0.20 + deal=1 leader=S 10H score=10 nodes=26,798 elapsed=0.06 + deal=1 leader=E 9H score=9 nodes=36,768 elapsed=0.08 + deal=1 leader=N 10H score=10 nodes=16,269 elapsed=0.05 + deal=1 leader=W 9H score=9 nodes=37,968 elapsed=0.08 + deal=1 leader=S 7D score=7 nodes=417,861 elapsed=0.60 + deal=1 leader=E 7D score=7 nodes=77,732 elapsed=0.14 + deal=1 leader=N 7D score=7 nodes=448,376 elapsed=0.66 + deal=1 leader=W 7D score=7 nodes=86,576 elapsed=0.15 + deal=1 leader=S 8C score=8 nodes=147,551 elapsed=0.21 + deal=1 leader=E 8C score=8 nodes=132,378 elapsed=0.18 + deal=1 leader=N 8C score=8 nodes=212,582 elapsed=0.27 + deal=1 leader=W 8C score=8 nodes=78,989 elapsed=0.13 + deal=1 nodes=2,854,903 elapsed=4.23 totalelapsed=4.23 + tricks=88887777A9A977778888 (max=13) +deals=1-1 nodes=2,854,903 avg=142,745 elapsed=4.23 avg=0.21 + +================================================================================ +dds105 output for: test.gib -tricks -name=gin +================================================================================ + +name=gin target=-1 sol=1 mode=1 + leader=S 9N nodes=217,042 elapsed=0.30 + leader=E 9N nodes=490,389 elapsed=0.54 + leader=N 9N nodes=242,708 elapsed=0.32 + leader=W 8N nodes=12,536 elapsed=0.05 + leader=S 9S nodes=1,067,876 elapsed=1.72 + leader=E 8S nodes=1,423,650 elapsed=2.10 + leader=N 9S nodes=579,046 elapsed=0.82 + leader=W 8S nodes=1,413,760 elapsed=2.35 + leader=S 9H nodes=421,052 elapsed=0.54 + leader=E 9H nodes=462,996 elapsed=0.55 + leader=N 9H nodes=388,427 elapsed=0.50 + leader=W 9H nodes=263,960 elapsed=0.30 + leader=S 6D nodes=400,416 elapsed=0.51 + leader=E 6D nodes=192,319 elapsed=0.24 + leader=N 6D nodes=312,717 elapsed=0.40 + leader=W 6D nodes=47,573 elapsed=0.09 + leader=S 7C nodes=987,365 elapsed=1.38 + leader=E 7C nodes=946,439 elapsed=1.20 + leader=N 7C nodes=1,102,393 elapsed=1.59 + leader=W 7C nodes=487,664 elapsed=0.56 +nodes=11,460,328 elapsed=16.06 totalelapsed=16.06 + K Q 9 + A Q J + 9 6 4 3 2 + 8 6 + T 6 8 7 3 2 + T 9 2 7 5 3 + T A K Q J 8 5 + A J T 9 5 3 2 - + A J 5 4 + K 8 6 4 + 7 + K Q 7 4 +name=gin tricks(leader=senw): n=9998 s=9898 h=9999 d=6666 c=7777 (max=13) + +================================================================================ +dds105 output for: test.gib -tricks -name=gin +================================================================================ + +name=gin target=-1 sol=1 mode=1 + leader=S 9N nodes=196,320 elapsed=0.27 + leader=E 9N nodes=422,811 elapsed=0.49 + leader=N 9N nodes=216,293 elapsed=0.29 + leader=W 8N nodes=11,804 elapsed=0.05 + leader=S 9S nodes=966,576 elapsed=1.68 + leader=E 8S nodes=1,247,854 elapsed=2.01 + leader=N 9S nodes=514,885 elapsed=0.76 + leader=W 8S nodes=1,225,697 elapsed=2.09 + leader=S 9H nodes=388,951 elapsed=0.52 + leader=E 9H nodes=428,708 elapsed=0.55 + leader=N 9H nodes=360,926 elapsed=0.48 + leader=W 9H nodes=238,759 elapsed=0.28 + leader=S 6D nodes=307,283 elapsed=0.41 + leader=E 6D nodes=164,629 elapsed=0.22 + leader=N 6D nodes=240,740 elapsed=0.32 + leader=W 6D nodes=43,630 elapsed=0.08 + leader=S 7C nodes=847,071 elapsed=1.21 + leader=E 7C nodes=831,338 elapsed=1.09 + leader=N 7C nodes=966,299 elapsed=1.45 + leader=W 7C nodes=430,252 elapsed=0.51 +nodes=10,050,826 elapsed=14.77 totalelapsed=14.77 + K Q 9 + A Q J + 9 6 4 3 2 + 8 6 + T 6 8 7 3 2 + T 9 2 7 5 3 + T A K Q J 8 5 + A J T 9 5 3 2 - + A J 5 4 + K 8 6 4 + 7 + K Q 7 4 +name=gin tricks(leader=senw): n=9998 s=9898 h=9999 d=6666 c=7777 (max=13) +================================================================================ +dds106 test.gib -timeal + ================================================================================ +test sol=1 sol=2 sol=3 +--------- ---------------- ---------------- --------------- +gib2 6 0.02 10 0.02 10 0.02 +gib3 29 0.02 45 0.02 45 0.02 +gib4 65 0.02 153 0.02 179 0.02 +gib5 150 0.02 518 0.02 857 0.02 +gib10 17,663 0.04 41,178 0.06 52,041 0.07 +gin 8,763 0.04 224,298 0.27 581,064 0.69 +dbldum1 988 0.02 1,514 0.02 1,539 0.02 +dbldum2 136,602 0.15 385,323 0.41 385,323 0.42 +devil1 74,661 0.10 135,218 0.15 234,862 0.24 +callahan 261,312 0.33 747,439 1.13 938,208 1.33 +g410-scc 45,331 0.08 57,262 0.09 237,488 0.27 +giblibno1 1,744,338 2.56 3,109,979 5.08 3,888,830 6.30 +giblibno2 203,773 0.25 270,424 0.31 270,424 0.32 +bo17 290,006 0.35 691,275 0.85 930,229 1.07 +bo21 1,502,044 2.16 1,882,400 2.66 3,926,551 5.61 +giblib1 34,024 0.06 75,758 0.10 75,758 0.10 +giblib2 685,093 0.73 889,056 0.93 3,631,179 3.96 +giblib3 39,792 0.06 113,138 0.13 113,144 0.13 +giblib4 58,370 0.08 108,555 0.12 724,213 0.74 +giblib5 565,021 0.60 1,738,081 2.07 1,738,081 2.08 +giblib6 631,095 0.66 1,332,592 1.48 1,502,434 1.64 +giblib7 49,494 0.07 261,284 0.32 282,134 0.34 +giblib8 106,018 0.12 625,995 0.66 625,995 0.66 +giblib9 534,453 0.58 1,145,748 1.36 2,246,335 2.71 +giblib10 28,477 0.06 91,990 0.12 371,359 0.40 + nodes: total=43,705,083 sol-1=7,017,568 sol-2=13,929,233 sol-3=22,758,282 +elapsed: total=56.73 sol-1=9.17 sol-2=18.39 sol-3=29.17 +================================================================================ +dds106 ../exe/ddd ../giblib -sol=1 -v -timeg=9n10 +================================================================================ +timeg tricks=9 contract=n deals=10 target=-1 sol=1 mode=1 leader=W + deal=4 ndeal=1 nodes=58,370 elapsed=0.09 + deal=5 ndeal=2 nodes=565,021 elapsed=0.61 + deal=8 ndeal=3 nodes=106,018 elapsed=0.13 + deal=56 ndeal=4 nodes=1,436,228 elapsed=1.74 + deal=68 ndeal=5 nodes=853,171 elapsed=0.99 + deal=81 ndeal=6 nodes=341,423 elapsed=0.35 + deal=94 ndeal=7 nodes=450,116 elapsed=0.54 + deal=99 ndeal=8 nodes=1,483,787 elapsed=1.92 + deal=103 ndeal=9 nodes=92,027 elapsed=0.11 + deal=116 ndeal=10 nodes=129,085 elapsed=0.16 +deals=10 nodes=5,515,246 elapsed=6.65 +min_node=58,370 max_node=1,483,787 avg=551,524 +min_elapsed=0.09 max_elapsed=1.92 avg=0.66 +errors=0 +================================================================================ +dds106 ../exe/ddd ../giblib -giblib=1-1 +================================================================================ +giblib=1-1 target=-1 sol=1 mode=1 + deal=1 leader=S 8N score=8 nodes=32,808 elapsed=0.06 + deal=1 leader=E 8N score=8 nodes=32,398 elapsed=0.06 + deal=1 leader=N 8N score=8 nodes=24,961 elapsed=0.05 + deal=1 leader=W 8N score=8 nodes=34,024 elapsed=0.06 + deal=1 leader=S 7S score=7 nodes=286,567 elapsed=0.35 + deal=1 leader=E 7S score=7 nodes=103,269 elapsed=0.13 + deal=1 leader=N 7S score=7 nodes=298,877 elapsed=0.38 + deal=1 leader=W 7S score=7 nodes=123,280 elapsed=0.16 + deal=1 leader=S 10H score=10 nodes=23,933 elapsed=0.05 + deal=1 leader=E 9H score=9 nodes=34,552 elapsed=0.06 + deal=1 leader=N 10H score=10 nodes=14,916 elapsed=0.04 + deal=1 leader=W 9H score=9 nodes=32,641 elapsed=0.06 + deal=1 leader=S 7D score=7 nodes=348,309 elapsed=0.47 + deal=1 leader=E 7D score=7 nodes=70,070 elapsed=0.10 + deal=1 leader=N 7D score=7 nodes=372,832 elapsed=0.50 + deal=1 leader=W 7D score=7 nodes=76,573 elapsed=0.11 + deal=1 leader=S 8C score=8 nodes=124,102 elapsed=0.15 + deal=1 leader=E 8C score=8 nodes=108,527 elapsed=0.13 + deal=1 leader=N 8C score=8 nodes=169,251 elapsed=0.20 + deal=1 leader=W 8C score=8 nodes=67,632 elapsed=0.10 + deal=1 nodes=2,379,522 elapsed=3.22 totalelapsed=3.22 + tricks=88887777A9A977778888 (max=13) +deals=1-1 nodes=2,379,522 avg=118,976 elapsed=3.22 avg=0.16 +================================================================================ +dds106 ../exe/ddd test.gib -tricks -name=gin +================================================================================ +name=gin target=-1 sol=1 mode=1 + leader=S 9N nodes=189,465 elapsed=0.25 + leader=E 9N nodes=367,149 elapsed=0.43 + leader=N 9N nodes=208,008 elapsed=0.27 + leader=W 8N nodes=8,763 elapsed=0.04 + leader=S 9S nodes=804,494 elapsed=1.43 + leader=E 8S nodes=1,078,255 elapsed=1.69 + leader=N 9S nodes=436,355 elapsed=0.64 + leader=W 8S nodes=1,058,980 elapsed=1.86 + leader=S 9H nodes=320,228 elapsed=0.42 + leader=E 9H nodes=336,922 elapsed=0.41 + leader=N 9H nodes=293,834 elapsed=0.38 + leader=W 9H nodes=199,614 elapsed=0.24 + leader=S 6D nodes=259,761 elapsed=0.33 + leader=E 6D nodes=143,529 elapsed=0.19 + leader=N 6D nodes=213,182 elapsed=0.27 + leader=W 6D nodes=40,411 elapsed=0.07 + leader=S 7C nodes=591,728 elapsed=0.75 + leader=E 7C nodes=565,863 elapsed=0.69 + leader=N 7C nodes=596,756 elapsed=0.77 + leader=W 7C nodes=256,286 elapsed=0.29 +nodes=7,969,583 elapsed=11.38 totalelapsed=11.38 + K Q 9 + A Q J + 9 6 4 3 2 + 8 6 + T 6 8 7 3 2 + T 9 2 7 5 3 + T A K Q J 8 5 + A J T 9 5 3 2 - + A J 5 4 + K 8 6 4 + 7 + K Q 7 4 +name=gin tricks(leader=senw): n=9998 s=9898 h=9999 d=6666 c=7777 (max=13) +================================================================================ +dds110 ./ddd test.gib -timeall +================================================================================ +test sol=1 sol=2 sol=3 +--------- ---------------- ---------------- --------------- +gib2 6 0.02 10 0.02 10 0.02 +gib3 29 0.02 45 0.02 45 0.02 +gib4 65 0.02 153 0.02 179 0.02 +gib5 150 0.02 518 0.02 857 0.02 +gib10 17,639 0.04 41,129 0.06 51,992 0.07 +gin 8,763 0.04 224,637 0.25 582,238 0.64 +dbldum1 988 0.02 1,514 0.02 1,539 0.02 +dbldum2 137,710 0.14 387,069 0.35 387,069 0.35 +devil1 74,416 0.09 135,018 0.15 234,410 0.24 +callahan 258,062 0.28 747,584 0.80 938,511 0.98 +g410-scc 45,860 0.08 57,788 0.09 240,189 0.27 +giblibno1 1,747,984 1.83 3,116,388 3.34 3,897,902 4.19 +giblibno2 203,086 0.22 269,483 0.29 269,483 0.29 +bo17 291,051 0.32 694,139 0.73 931,866 0.95 +bo21 1,460,883 1.54 1,838,366 1.93 3,875,408 4.04 +giblib1 34,009 0.06 75,902 0.10 75,902 0.10 +giblib2 686,922 0.66 891,102 0.85 3,662,838 3.45 +giblib3 39,792 0.06 113,138 0.12 113,144 0.12 +giblib4 58,380 0.08 109,081 0.13 724,372 0.70 +giblib5 558,633 0.56 1,741,928 1.73 1,741,928 1.73 +giblib6 630,322 0.63 1,336,872 1.35 1,505,222 1.50 +giblib7 49,621 0.07 261,723 0.28 282,573 0.30 +giblib8 105,897 0.12 630,239 0.64 630,239 0.64 +giblib9 526,845 0.53 1,146,045 1.16 2,250,098 2.30 +giblib10 28,477 0.06 92,836 0.13 372,485 0.41 + nodes: total=43,648,796 sol-1=6,965,590 sol-2=13,912,707 sol-3=22,770,499 +elapsed: total=45.42 sol-1=7.49 sol-2=14.56 sol-3=23.37 +================================================================================ +dds110 ./ddd ../giblib -sol=1 -v -timeg=9n10 +================================================================================ +timeg tricks=9 contract=n deals=10 target=-1 sol=1 mode=1 leader=W + deal=4 ndeal=1 nodes=58,380 elapsed=0.09 + deal=5 ndeal=2 nodes=558,633 elapsed=0.56 + deal=8 ndeal=3 nodes=105,897 elapsed=0.13 + deal=56 ndeal=4 nodes=1,431,474 elapsed=1.46 + deal=68 ndeal=5 nodes=851,777 elapsed=0.88 + deal=81 ndeal=6 nodes=341,552 elapsed=0.33 + deal=94 ndeal=7 nodes=449,189 elapsed=0.46 + deal=99 ndeal=8 nodes=1,495,869 elapsed=1.53 + deal=103 ndeal=9 nodes=92,254 elapsed=0.11 + deal=116 ndeal=10 nodes=129,354 elapsed=0.16 +deals=10 nodes=5,514,379 elapsed=5.71 +min_node=58,380 max_node=1,495,869 avg=551,437 +min_elapsed=0.09 max_elapsed=1.53 avg=0.57 +errors=0 +================================================================================ +dds110 ./ddd ../giblib -giblib=1-1 +giblib=1-1 target=-1 sol=1 mode=1 + deal=1 leader=S 8N score=8 nodes=32,808 elapsed=0.06 + deal=1 leader=E 8N score=8 nodes=32,441 elapsed=0.06 + deal=1 leader=N 8N score=8 nodes=25,021 elapsed=0.05 + deal=1 leader=W 8N score=8 nodes=34,009 elapsed=0.06 + deal=1 leader=S 7S score=7 nodes=279,639 elapsed=0.31 + deal=1 leader=E 7S score=7 nodes=102,254 elapsed=0.13 + deal=1 leader=N 7S score=7 nodes=301,914 elapsed=0.33 + deal=1 leader=W 7S score=7 nodes=121,529 elapsed=0.14 + deal=1 leader=S 10H score=10 nodes=24,004 elapsed=0.05 + deal=1 leader=E 9H score=9 nodes=34,337 elapsed=0.06 + deal=1 leader=N 10H score=10 nodes=14,921 elapsed=0.04 + deal=1 leader=W 9H score=9 nodes=32,523 elapsed=0.06 + deal=1 leader=S 7D score=7 nodes=347,634 elapsed=0.42 + deal=1 leader=E 7D score=7 nodes=69,322 elapsed=0.11 + deal=1 leader=N 7D score=7 nodes=371,443 elapsed=0.44 + deal=1 leader=W 7D score=7 nodes=76,652 elapsed=0.11 + deal=1 leader=S 8C score=8 nodes=129,621 elapsed=0.15 + deal=1 leader=E 8C score=8 nodes=110,722 elapsed=0.13 + deal=1 leader=N 8C score=8 nodes=172,313 elapsed=0.20 + deal=1 leader=W 8C score=8 nodes=64,853 elapsed=0.09 + deal=1 nodes=2,377,960 elapsed=2.99 totalelapsed=2.99 + tricks=88887777A9A977778888 (max=13) +deals=1-1 nodes=2,377,960 avg=118,898 elapsed=2.99 avg=0.15 +================================================================================ +dds110 ./ddd test.gib -tricks -name=gin +name=gin target=-1 sol=1 mode=1 + leader=S 9N nodes=192,174 elapsed=0.24 + leader=E 9N nodes=367,542 elapsed=0.40 + leader=N 9N nodes=207,824 elapsed=0.25 + leader=W 8N nodes=8,763 elapsed=0.04 + leader=S 9S nodes=785,551 elapsed=0.89 + leader=E 8S nodes=1,083,174 elapsed=1.24 + leader=N 9S nodes=437,999 elapsed=0.50 + leader=W 8S nodes=1,067,505 elapsed=1.18 + leader=S 9H nodes=321,295 elapsed=0.38 + leader=E 9H nodes=332,370 elapsed=0.39 + leader=N 9H nodes=295,031 elapsed=0.34 + leader=W 9H nodes=200,005 elapsed=0.22 + leader=S 6D nodes=260,627 elapsed=0.31 + leader=E 6D nodes=143,798 elapsed=0.19 + leader=N 6D nodes=214,479 elapsed=0.26 + leader=W 6D nodes=40,383 elapsed=0.07 + leader=S 7C nodes=596,131 elapsed=0.65 + leader=E 7C nodes=580,584 elapsed=0.64 + leader=N 7C nodes=596,086 elapsed=0.67 + leader=W 7C nodes=258,317 elapsed=0.28 +nodes=7,989,638 elapsed=9.12 totalelapsed=9.12 + K Q 9 + A Q J + 9 6 4 3 2 + 8 6 + T 6 8 7 3 2 + T 9 2 7 5 3 + T A K Q J 8 5 + A J T 9 5 3 2 - + A J 5 4 + K 8 6 4 + 7 + K Q 7 4 +name=gin tricks(leader=senw): n=9998 s=9898 h=9999 d=6666 c=7777 (max=13) +================================================================================ +ddd112 ./ddd test.gib -timeall +================================================================================ +test sol=1 sol=2 sol=3 +--------- ---------------- ---------------- --------------- +gib2 6 0.02 10 0.02 10 0.02 +gib3 29 0.02 45 0.03 45 0.02 +gib4 65 0.02 153 0.02 177 0.02 +gib5 155 0.02 486 0.02 657 0.02 +gib10 9,258 0.03 19,016 0.04 22,652 0.04 +gin 6,324 0.03 219,444 0.26 475,279 0.56 +dbldum1 540 0.02 1,013 0.03 1,038 0.02 +dbldum2 136,598 0.15 259,032 0.25 259,032 0.25 +devil1 81,548 0.10 116,045 0.14 153,721 0.18 +callahan 174,145 0.21 430,962 0.49 471,674 0.54 +g410-scc 43,903 0.08 44,681 0.08 112,062 0.15 +giblibno1 1,163,737 1.32 1,697,850 1.98 1,788,191 2.13 +giblibno2 160,340 0.20 223,954 0.27 223,954 0.27 +bo17 157,301 0.19 372,446 0.43 438,133 0.49 +bo21 1,795,469 2.03 1,959,809 2.25 2,407,449 2.85 +giblib1 31,058 0.06 44,026 0.08 44,026 0.07 +giblib2 255,255 0.28 418,134 0.53 1,931,126 2.06 +giblib3 18,470 0.04 38,885 0.06 38,891 0.07 +giblib4 48,509 0.07 143,359 0.17 401,817 0.45 +giblib5 417,649 0.43 1,711,054 1.99 1,711,054 1.86 +giblib6 560,081 0.60 937,852 1.02 996,590 1.10 +giblib7 41,668 0.07 114,334 0.14 119,228 0.14 +giblib8 74,780 0.10 264,695 0.29 264,695 0.29 +giblib9 427,057 0.48 899,105 1.00 1,163,416 1.32 +giblib10 30,338 0.06 96,455 0.14 270,423 0.33 + nodes: total=28,942,468 sol-1=5,634,283 sol-2=10,012,845 sol-3=13,295,340 +elapsed: total=33.59 sol-1=6.62 sol-2=11.71 sol-3=15.26 +================================================================================ +ddd112 ./ddd ../giblib -sol=1 -v -timeg=9n10 +================================================================================ +Double Dummy Driver (DDD) version 1.05 (25-Jan-2007) +timeg tricks=9 contract=n deals=10 target=-1 sol=1 mode=1 leader=W + deal=4 ndeal=1 nodes=48,509 elapsed=0.07 + deal=5 ndeal=2 nodes=417,649 elapsed=0.43 + deal=8 ndeal=3 nodes=74,780 elapsed=0.10 + deal=56 ndeal=4 nodes=1,241,660 elapsed=1.34 + deal=68 ndeal=5 nodes=319,869 elapsed=0.36 + deal=81 ndeal=6 nodes=158,661 elapsed=0.18 + deal=94 ndeal=7 nodes=666,682 elapsed=0.73 + deal=99 ndeal=8 nodes=1,607,014 elapsed=1.79 + deal=103 ndeal=9 nodes=51,985 elapsed=0.08 + deal=116 ndeal=10 nodes=128,401 elapsed=0.16 +deals=10 nodes=4,715,210 elapsed=5.24 +min_node=48,509 max_node=1,607,014 avg=471,521 +min_elapsed=0.07 max_elapsed=1.79 avg=0.52 +errors=0 +================================================================================ +ddd112 ./ddd ../giblib -giblib=1-1 +================================================================================ +Double Dummy Driver (DDD) version 1.05 (25-Jan-2007) +giblib=1-1 target=-1 sol=1 mode=1 + deal=1 leader=S 8N score=8 nodes=18,322 elapsed=0.04 + deal=1 leader=E 8N score=8 nodes=32,837 elapsed=0.06 + deal=1 leader=N 8N score=8 nodes=10,500 elapsed=0.04 + deal=1 leader=W 8N score=8 nodes=31,058 elapsed=0.06 + deal=1 leader=S 7S score=7 nodes=79,659 elapsed=0.11 + deal=1 leader=E 7S score=7 nodes=47,581 elapsed=0.07 + deal=1 leader=N 7S score=7 nodes=52,907 elapsed=0.08 + deal=1 leader=W 7S score=7 nodes=45,893 elapsed=0.07 + deal=1 leader=S 10H score=10 nodes=9,517 elapsed=0.03 + deal=1 leader=E 9H score=9 nodes=26,390 elapsed=0.05 + deal=1 leader=N 10H score=10 nodes=6,318 elapsed=0.03 + deal=1 leader=W 9H score=9 nodes=37,377 elapsed=0.07 + deal=1 leader=S 7D score=7 nodes=143,865 elapsed=0.19 + deal=1 leader=E 7D score=7 nodes=31,690 elapsed=0.06 + deal=1 leader=N 7D score=7 nodes=139,623 elapsed=0.19 + deal=1 leader=W 7D score=7 nodes=42,067 elapsed=0.07 + deal=1 leader=S 8C score=8 nodes=22,516 elapsed=0.05 + deal=1 leader=E 8C score=8 nodes=51,243 elapsed=0.08 + deal=1 leader=N 8C score=8 nodes=13,037 elapsed=0.04 + deal=1 leader=W 8C score=8 nodes=53,801 elapsed=0.08 + deal=1 nodes=896,201 elapsed=1.48 totalelapsed=1.48 + tricks=88887777A9A977778888 (max=13) +deals=1-1 nodes=896,201 avg=44,810 elapsed=1.48 avg=0.07 +================================================================================ +./ddd test.gib -tricks -name=gin +================================================================================ +Double Dummy Driver (DDD) version 1.05 (25-Jan-2007) +name=gin target=-1 sol=1 mode=1 + leader=S 9N nodes=204,883 elapsed=0.25 + leader=E 9N nodes=341,850 elapsed=0.39 + leader=N 9N nodes=202,525 elapsed=0.26 + leader=W 8N nodes=6,324 elapsed=0.03 + leader=S 9S nodes=404,513 elapsed=0.51 + leader=E 8S nodes=880,321 elapsed=1.09 + leader=N 9S nodes=481,945 elapsed=0.62 + leader=W 8S nodes=679,639 elapsed=0.83 + leader=S 9H nodes=317,100 elapsed=0.40 + leader=E 9H nodes=230,488 elapsed=0.32 + leader=N 9H nodes=341,234 elapsed=0.45 + leader=W 9H nodes=53,051 elapsed=0.08 + leader=S 6D nodes=420,142 elapsed=0.52 + leader=E 6D nodes=111,851 elapsed=0.15 + leader=N 6D nodes=448,369 elapsed=0.56 + leader=W 6D nodes=37,943 elapsed=0.07 + leader=S 7C nodes=460,906 elapsed=0.55 + leader=E 7C nodes=276,054 elapsed=0.34 + leader=N 7C nodes=515,007 elapsed=0.63 + leader=W 7C nodes=297,298 elapsed=0.33 +nodes=6,711,443 elapsed=8.38 totalelapsed=8.38 + K Q 9 + A Q J + 9 6 4 3 2 + 8 6 + T 6 8 7 3 2 + T 9 2 7 5 3 + T A K Q J 8 5 + A J T 9 5 3 2 - + A J 5 4 + K 8 6 4 + 7 + K Q 7 4 +name=gin tricks(leader=senw): n=9998 s=9898 h=9999 d=6666 c=7777 (max=13) +*/ diff --git a/dds b/dds new file mode 160000 index 0000000..d09fbad --- /dev/null +++ b/dds @@ -0,0 +1 @@ +Subproject commit d09fbadce025f4574af93968e8ffd5901f6b5ade diff --git a/defs.cpp b/defs.cpp index 61fc339..33c61c5 100644 --- a/defs.cpp +++ b/defs.cpp @@ -1,5 +1,5 @@ /* ************************************************************************** - defs.cpp bridge definitions for C/C++ programs + defs.cpp bridge definitions for C/C++ programs PM Cronje June 2006 Copyright 2006 P.M.Cronje @@ -13,12 +13,12 @@ DDD 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 + 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 DDD; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA ************************************************************************** */ @@ -27,13 +27,14 @@ #include #include "defs.h" +#include "portab_DDD.h" -const char *szPLAYER[4] = {"west", "north", "east", "south"}; -const char chPLAYER[4] = {'W', 'N', 'E', 'S'}; -const char *szSUIT[4] = {"spades", "hearts", "diamonds", "clubs"}; -const char chSUIT[4] = {'S', 'H', 'D', 'C'}; -const char *szCONTRACT[5] = {"spades","hearts","diamonds","clubs","notrump"}; -const char chCARD[13] = {'A','K','Q','J','T','9','8','7','6','5','4','3','2'}; +const char * szPLAYER[4] = {"west", "north", "east", "south"}; +const char chPLAYER[4] = {'W', 'N', 'E', 'S'}; +const char * szSUIT[4] = {"spades", "hearts", "diamonds", "clubs"}; +const char chSUIT[4] = {'S', 'H', 'D', 'C'}; +const char * szCONTRACT[5] = {"spades", "hearts", "diamonds", "clubs", "notrump"}; +const char chCARD[13] = {'A', 'K', 'Q', 'J', 'T', '9', '8', '7', '6', '5', '4', '3', '2'}; const ushort usMASK[16] = { 0x0001, 0x0002, 0x0004, 0x0008, @@ -73,29 +74,30 @@ const unsigned int ulNotMASK[32] int fromHex(char ch) { - if(isdigit(ch)) - return ((int)tolower(ch) - (int)'0'); + if (isdigit(ch)) + return (static_cast(tolower(ch)) - static_cast('0')); else - return ((int)tolower(ch) - (int)'a' + 10); + return (static_cast(tolower(ch)) - static_cast('a' + 10)); } // fromHex // ***************************************************************************** char toHex(int i) { - if(i < 10) - return (char)(i + '0'); + if (i < 10) + return static_cast(i + '0'); else - return toupper((char)(i - 10 + (int)'a')); + return static_cast + (toupper(static_cast(i - 10 + static_cast('a')))); } // toHex // ***************************************************************************** // initialization of static arrays -// - BitsInByte[256] -// count of 1-bits in byte -// - MSBitInByte[256] -// most significant bit in byte +// - BitsInByte[256] +// count of 1-bits in byte +// - MSBitInByte[256] +// most significant bit in byte static bool initBitsInByte(int bits[256], int msb[256]) { @@ -104,25 +106,29 @@ static bool initBitsInByte(int bits[256], int msb[256]) bits[0] = msb[0] = 0; // set bits in byte - for(i=1; i<256; i++) - { n = 0; + for (i = 1; i < 256; i++) + { + n = 0; m = i; - while(m) - { n++; - m = (m & (m-1)); // strip right-most bit + while (m) + { + n++; + m = (m & (m - 1)); // strip right-most bit }; bits[i] = n; } // most significant bit in byte - for(i=1; i<256; i++) - { n = 0; + for (i = 1; i < 256; i++) + { + n = 0; m = i; - while(m) - { n++; + while (m) + { + n++; m >>= 1; }; - msb[i] = n-1; + msb[i] = n - 1; } return true; @@ -132,7 +138,7 @@ static bool initBitsInByte(int bits[256], int msb[256]) static int BitsInByte[256]; static int MSBitInByte[256]; -static bool bInitBitsInByte = initBitsInByte(BitsInByte,MSBitInByte); +static bool bInitBitsInByte = initBitsInByte(BitsInByte, MSBitInByte); // ***************************************************************************** @@ -145,7 +151,7 @@ int bitCount(ushort m) int leastSignificant1Bit(ushort m) { - m = (ushort)((ushort)m ^ ((ushort)m - 1)); + m = static_cast(static_cast(m) ^ (static_cast(m) - 1)); return bitCount(m) - 1; @@ -154,72 +160,83 @@ int leastSignificant1Bit(ushort m) int mostSignificant1Bit(ushort m) { -/* - if(m & 0xff00) - return (8 + MSBitInByte[(m >> 8) & 0x00ff]); - else - return MSBitInByte[m]; -*/ - register unsigned int x = (m | (m >> 1)); + /* + if(m & 0xff00) + return (8 + MSBitInByte[(m >> 8) & 0x00ff]); + else + return MSBitInByte[m]; + */ + register unsigned int x = static_cast(m | (m >> 1)); x |= (x >> 2); x |= (x >> 4); x |= (x >> 8); //x = (x & (~(x >> 1))); - return bitCount(x) - 1; + return bitCount(static_cast(x)) - 1; } // mostSignificant1Bit // ***************************************************************************** -void clearBit(ushort &m, int ibit) { m &= usNotMASK[ibit];} -bool isBit(ushort m, int ibit) { return (m & usMASK[ibit]);} -void setBit(ushort &m, int ibit) { m |= usMASK[ibit];} +void clearBit(ushort & m, int ibit) +{ + m &= usNotMASK[ibit]; +} +bool isBit(ushort m, int ibit) +{ + return ((m & usMASK[ibit]) ? true : false); +} +void setBit(ushort & m, int ibit) +{ + m |= usMASK[ibit]; +} /* ************************************************************************** */ -char *format(char str[], char sz[]); +char * format(char str[], char sz[]); -char *format64(unsigned long long number, char sz[]) +char * format64(unsigned long long number, char sz[]) { char str[32]; - snprintf(str,31,"%llu",number); - format(str,sz); + snprintf(str, 31, "%llu", number); + format(str, sz); return sz; } // format64 /* ************************************************************************** */ -char *format(unsigned int number, char sz[]) +char * format(unsigned int number, char sz[]) { char str[32]; - snprintf(str,31,"%u",number); - format(str,sz); + snprintf(str, 31, "%u", number); + format(str, sz); return sz; } // format /* ************************************************************************** */ -char *format(char str[], char sz[]) +char * format(char str[], char sz[]) { int len, n, istart, ndigit, i, pos; - len = strlen(str); + len = static_cast(strlen(str)); n = len / 3; - if(3*n != len) + if (3 * n != len) n++; istart = pos = 0; - for(i=0; i(ndigit)); istart += ndigit; pos += ndigit; - if(i < n-1) - { sz[pos] = ','; + if (i < n - 1) + { + sz[pos] = ','; pos++; } } @@ -230,12 +247,12 @@ char *format(char str[], char sz[]) } // format // ***************************************************************************** -char *mPerSec(unsigned int count, double elapsed, char sz[]) +char * mPerSec(unsigned int count, double elapsed, char sz[]) { - if(elapsed >= 0.01) - sprintf(sz,"%0.3lfm/s",1.0e-6*(double)count/elapsed); + if (elapsed >= 0.01) + sprintf(sz, "%0.3fm/s", 1.0e-6 * static_cast(count) / elapsed); else - strcpy(sz,"-.---m/s"); + strcpy(sz, "-.---m/s"); return sz; diff --git a/defs.h b/defs.h index bcf7a61..dd14ac3 100644 --- a/defs.h +++ b/defs.h @@ -1,5 +1,5 @@ /* ************************************************************************** - defs.h bridge definitions for C/C++ programs + defs.h bridge definitions for C/C++ programs PM Cronje June 2006 Copyright 2006 P.M.Cronje @@ -13,23 +13,23 @@ DDD 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 + 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 DDD; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA ************************************************************************** */ #ifndef DEFS_H #define DEFS_H -extern const char *szPLAYER[4]; -extern const char chPLAYER[4]; -extern const char *szSUIT[4]; -extern const char chSUIT[4]; -extern const char *szCONTRACT[5]; +extern const char * szPLAYER[4]; +extern const char chPLAYER[4]; +extern const char * szSUIT[4]; +extern const char chSUIT[4]; +extern const char * szCONTRACT[5]; extern const char chCARD[13]; typedef unsigned short int ushort; @@ -43,35 +43,35 @@ extern const unsigned int ulNotMASK[32]; // ----------------------------------------------------------------------------- - int fromHex(char ch); +int fromHex(char ch); char toHex(int i); - int bitCount(ushort m); - int leastSignificant1Bit(ushort m); - int mostSignificant1Bit(ushort m); -void clearBit(ushort &m, int ibit); +int bitCount(ushort m); +int leastSignificant1Bit(ushort m); +int mostSignificant1Bit(ushort m); +void clearBit(ushort & m, int ibit); bool isBit(ushort m, int ibit); -void setBit(ushort &m, int ibit); +void setBit(ushort & m, int ibit); -char *format64(uint64 number, char sz[]); -char *format(unsigned int number, char sz[]); -char *mPerSec(unsigned int count, double elapsed, char sz[]); +char * format64(uint64 number, char sz[]); +char * format(unsigned int number, char sz[]); +char * mPerSec(unsigned int count, double elapsed, char sz[]); // ----------------------------------------------------------------------------- enum eContract { - eCONTRACT_SPADE = 0, - eCONTRACT_HEART = 1, - eCONTRACT_DIAMOND = 2, - eCONTRACT_CLUB = 3, + eCONTRACT_SPADE = 0, + eCONTRACT_HEART = 1, + eCONTRACT_DIAMOND = 2, + eCONTRACT_CLUB = 3, - eCONTRACT_NOTRUMP = 4, + eCONTRACT_NOTRUMP = 4, - eCONTRACT_PASS = 5, + eCONTRACT_PASS = 5, - eCONTRACT_NONE = -1 + eCONTRACT_NONE = -1 }; // enum eContract // ----------------------------------------------------------------------------- @@ -79,7 +79,7 @@ enum eContract enum eContractRisk { eCONTRACTRISK_UNDOUBLED = 0, - eCONTRACTRISK_DOUBLED = 1, + eCONTRACTRISK_DOUBLED = 1, eCONTRACTRISK_REDOUBLED = 2 }; // enum eContractRisk @@ -87,45 +87,45 @@ enum eContractRisk enum ePlayer { - ePLAYER_WEST = 0, + ePLAYER_WEST = 0, ePLAYER_NORTH = 1, - ePLAYER_EAST = 2, + ePLAYER_EAST = 2, ePLAYER_SOUTH = 3, - ePLAYER_NONE = -1 + ePLAYER_NONE = -1 }; // enum ePlayer // ----------------------------------------------------------------------------- enum eSuit { - eSUIT_SPADE = 0, - eSUIT_HEART = 1, + eSUIT_SPADE = 0, + eSUIT_HEART = 1, eSUIT_DIAMOND = 2, - eSUIT_CLUB = 3, + eSUIT_CLUB = 3, - eSUIT_NONE = -1 + eSUIT_NONE = -1 }; // enum eSuit // ----------------------------------------------------------------------------- enum eCard { - eCARD_A = 0, - eCARD_K = 1, - eCARD_Q = 2, - eCARD_J = 3, - eCARD_10 = 4, - eCARD_9 = 5, - eCARD_8 = 6, - eCARD_7 = 7, - eCARD_6 = 8, - eCARD_5 = 9, - eCARD_4 = 10, - eCARD_3 = 11, - eCARD_2 = 12, - - eCARD_NONE = -1 + eCARD_A = 0, + eCARD_K = 1, + eCARD_Q = 2, + eCARD_J = 3, + eCARD_10 = 4, + eCARD_9 = 5, + eCARD_8 = 6, + eCARD_7 = 7, + eCARD_6 = 8, + eCARD_5 = 9, + eCARD_4 = 10, + eCARD_3 = 11, + eCARD_2 = 12, + + eCARD_NONE = -1 }; // enum eCard // ----------------------------------------------------------------------------- diff --git a/giblib.cpp b/giblib.cpp index dea4075..d9a4521 100644 --- a/giblib.cpp +++ b/giblib.cpp @@ -1,8 +1,8 @@ /* ************************************************************************** - giblib.cpp giblib reader and state for bridge C/C++ programs + giblib.cpp giblib reader and state for bridge C/C++ programs PM Cronje June 2006 - PM Cronje 13-Jul-2006 add deal genearator + PM Cronje 13-Jul-2006 add deal genearator Copyright 2006 P.M.Cronje @@ -15,12 +15,12 @@ DDD 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 + 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 DDD; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA ************************************************************************** */ @@ -36,23 +36,23 @@ cGIBLib::cGIBLib() { - pszComment = (char*)realloc(0,GIBLIB_LENLINE*sizeof(char)); - pszName = (char*)realloc(0,sizeof(char)); + pszComment = static_cast(realloc(0, GIBLIB_LENLINE * sizeof(char))); + pszName = static_cast(realloc(0, sizeof(char))); pszName[0] = '\0'; nPlayed = 0; nLine = 0; - pRNG = cRNG::createRNG(eRNG_MT,0); + pRNG = cRNG::createRNG(eRNG_MT, 0); } // cGIBLib::cGIBLib // ***************************************************************************** cGIBLib::~cGIBLib() { - pszComment = (char*)realloc(pszComment,0); - pszName = (char*)realloc(pszName,0); + pszComment = static_cast(realloc(pszComment, 0)); + pszName = static_cast(realloc(pszName, 0)); - if(pRNG) + if (pRNG) delete pRNG; } // cGIBLib::~cGIBLib @@ -63,56 +63,63 @@ bool cGIBLib::generateDeal(int ntrick) int lsuit[52], lcard[52]; int player, suit, card, icard, ncard, ndeck; - if(pRNG == 0) - { sprintf(szErrMsg,"*** error: create RNG\n"); + if (pRNG == 0) + { + sprintf(szErrMsg, "*** error: create RNG\n"); return false; } - if((ntrick < 1) || (ntrick > 13)) - { sprintf(szErrMsg,"*** error: generateDeal ntrick=%d must be >=1 and <=13\n", + if ((ntrick < 1) || (ntrick > 13)) + { + sprintf(szErrMsg, "*** error: generateDeal ntrick=%d must be >=1 and <=13\n", ntrick); return false; } - memset(mPlayerSuit,0,16*sizeof(ushort)); + memset(mPlayerSuit, 0, 16 * sizeof(ushort)); player = 0; // set up a sorted deck icard = 0; - for(suit=0; suit<4; suit++) - { for(card=0; card<13; card++) - { lsuit[icard] = suit; + for (suit = 0; suit < 4; suit++) + { + for (card = 0; card < 13; card++) + { + lsuit[icard] = suit; lcard[icard] = card; icard++; } } - if(ntrick < 1) + if (ntrick < 1) ntrick = 1; - if(ntrick > 13) + if (ntrick > 13) ntrick = 13; ncard = 4 * ntrick; ndeck = 52; - while(ncard) - { if(ncard == 1) + while (ncard) + { + if (ncard == 1) icard = 0; else - icard = (int)pRNG->randomUint(ndeck); + icard = static_cast + (pRNG->randomUint(static_cast(ndeck))); // add new card given by lsuit[icard] and lcard[icard] - setBit(mPlayerSuit[player][lsuit[icard]],lcard[icard]); + setBit(mPlayerSuit[player][lsuit[icard]], lcard[icard]); // shorten deck (remove this card) - if(icard < ndeck-1) - { memmove(lsuit+icard,lsuit+icard+1,(ndeck-1-icard)*sizeof(int)); - memmove(lcard+icard,lcard+icard+1,(ndeck-1-icard)*sizeof(int)); + if (icard < ndeck - 1) + { + memmove(lsuit + icard, lsuit + icard + 1, static_cast(ndeck - 1 - icard)*sizeof(int)); + memmove(lcard + icard, lcard + icard + 1, static_cast(ndeck - 1 - icard)*sizeof(int)); } ncard--; ndeck--; - player = ((player+1)%4); + player = ((player + 1) % 4); } return true; @@ -122,19 +129,21 @@ bool cGIBLib::generateDeal(int ntrick) enum eCard cGIBLib::getCard(char chcard) { - if(tolower(chcard) == 'a') + if (tolower(chcard) == 'a') return eCARD_A; - else if(tolower(chcard) == 'k') + else if (tolower(chcard) == 'k') return eCARD_K; - else if(tolower(chcard) == 'q') + else if (tolower(chcard) == 'q') return eCARD_Q; - else if(tolower(chcard) == 'j') + else if (tolower(chcard) == 'j') return eCARD_J; - else if(tolower(chcard) == 't') + else if (tolower(chcard) == 't') return eCARD_10; - else if(isdigit(chcard)) - { if(((int)chcard >= (int)'2') && ((int)chcard <= (int)'9')) - return (enum eCard)(14 - (int)chcard + (int)'0'); + else if (isdigit(chcard)) + { + if ((static_cast(chcard) >= static_cast('2')) && + (static_cast(chcard) <= static_cast('9'))) + return static_cast(14 - static_cast(chcard) + static_cast('0')); } return eCARD_NONE; @@ -144,67 +153,76 @@ enum eCard cGIBLib::getCard(char chcard) bool cGIBLib::getOptions() { - char *pchend; - int suit, card; + char * pchend; + int suit, card; - pchend = strstr(pszComment,"name="); - if(pchend) - setName(pchend+5); + pchend = strstr(pszComment, "name="); + if (pchend) + setName(pchend + 5); else pszName[0] = '\0'; - pchend = strstr(pszComment,"trumps="); - if(pchend) - { if(tolower(pchend[7]) == 's') Trumps = 0; - else if(tolower(pchend[7]) == 'h') Trumps = 1; - else if(tolower(pchend[7]) == 'd') Trumps = 2; - else if(tolower(pchend[7]) == 'c') Trumps = 3; - else if(tolower(pchend[7]) == 'n') Trumps = 4; + pchend = strstr(pszComment, "trumps="); + if (pchend) + { + if (tolower(pchend[7]) == 's') Trumps = 0; + else if (tolower(pchend[7]) == 'h') Trumps = 1; + else if (tolower(pchend[7]) == 'd') Trumps = 2; + else if (tolower(pchend[7]) == 'c') Trumps = 3; + else if (tolower(pchend[7]) == 'n') Trumps = 4; else - { sprintf(szErrMsg,"*** error: invalid trumps='%c' at line %d\n", - pchend[7],nLine); + { + sprintf(szErrMsg, "*** error: invalid trumps='%c' at line %d\n", + pchend[7], nLine); return false; } } - pchend = strstr(pszComment,"leader="); - if(pchend) - { if(tolower(pchend[7]) == 'w') Leader = 0; - else if(tolower(pchend[7]) == 'n') Leader = 1; - else if(tolower(pchend[7]) == 'e') Leader = 2; - else if(tolower(pchend[7]) == 's') Leader = 3; + pchend = strstr(pszComment, "leader="); + if (pchend) + { + if (tolower(pchend[7]) == 'w') Leader = 0; + else if (tolower(pchend[7]) == 'n') Leader = 1; + else if (tolower(pchend[7]) == 'e') Leader = 2; + else if (tolower(pchend[7]) == 's') Leader = 3; else - { sprintf(szErrMsg,"*** error: invalid leader='%c' at line %d\n", - pchend[7],nLine); + { + sprintf(szErrMsg, "*** error: invalid leader='%c' at line %d\n", + pchend[7], nLine); return false; } } - pchend = strstr(pszComment,"played="); - if(pchend) - { pchend += 7; + pchend = strstr(pszComment, "played="); + if (pchend) + { + pchend += 7; nPlayed = 0; - for(;;) - { while((pchend[0]=='.') || (pchend[0]=='-')) + for (;;) + { + while ((pchend[0] == '.') || (pchend[0] == '-')) pchend++; - if(tolower(pchend[0]) == 's') suit = 0; - else if(tolower(pchend[0]) == 'h') suit = 1; - else if(tolower(pchend[0]) == 'd') suit = 2; - else if(tolower(pchend[0]) == 'c') suit = 3; - else if((pchend[0]==' ')||(pchend[0]=='}')||(pchend[0]=='\n')) + if (tolower(pchend[0]) == 's') suit = 0; + else if (tolower(pchend[0]) == 'h') suit = 1; + else if (tolower(pchend[0]) == 'd') suit = 2; + else if (tolower(pchend[0]) == 'c') suit = 3; + else if ((pchend[0] == ' ') || (pchend[0] == '}') || (pchend[0] == '\n')) break; else - { sprintf(szErrMsg,"*** error: invalid suit='%c' at line %d\n", - pchend[0],nLine); + { + sprintf(szErrMsg, "*** error: invalid suit='%c' at line %d\n", + pchend[0], nLine); return false; } pchend++; card = getCard(pchend[0]); - if(card == eCARD_NONE) - { sprintf(szErrMsg,"*** error: invalid card='%c' at line %d\n", - pchend[0],nLine); + if (card == eCARD_NONE) + { + sprintf(szErrMsg, "*** error: invalid card='%c' at line %d\n", + pchend[0], nLine); return false; } - if(nPlayed >= 51) - { sprintf(szErrMsg,"*** error: too many cards at line %d\n",nLine); + if (nPlayed >= 51) + { + sprintf(szErrMsg, "*** error: too many cards at line %d\n", nLine); return false; } SuitPlayed[nPlayed] = suit; @@ -219,14 +237,14 @@ bool cGIBLib::getOptions() } // cGIBLib::getOptions // ***************************************************************************** -bool cGIBLib::getTricks(int i, int *pleader, int *ptrumps, int *pntrick) +bool cGIBLib::getTricks(int i, int * pleader, int * ptrumps, int * pntrick) { // defaults *pleader = ePLAYER_WEST; *ptrumps = eCONTRACT_NOTRUMP; *pntrick = 0; - if((i < 0) || (i >= 20)) + if ((i < 0) || (i >= 20)) return false; // leader @@ -234,20 +252,21 @@ bool cGIBLib::getTricks(int i, int *pleader, int *ptrumps, int *pntrick) // trumps *ptrumps = (i / 4); - if(*ptrumps == 0) + if (*ptrumps == 0) *ptrumps = eCONTRACT_NOTRUMP; else (*ptrumps)--; // number of tricks; *pntrick = -1; - char *pch = szTricks + i; - if(isdigit(*pch)) - *pntrick = (*pch - '0'); - else if(isxdigit(*pch)) - *pntrick = (toupper(*pch) - 'A' + 10); - if((*pntrick < 0) || (*pntrick > 13)) - { *pntrick = 0; + char * pch_local = szTricks + i; + if (isdigit(*pch_local)) + *pntrick = (*pch_local - '0'); + else if (isxdigit(*pch_local)) + *pntrick = (toupper(*pch_local) - 'A' + 10); + if ((*pntrick < 0) || (*pntrick > 13)) + { + *pntrick = 0; return false; } else @@ -257,11 +276,14 @@ bool cGIBLib::getTricks(int i, int *pleader, int *ptrumps, int *pntrick) // ***************************************************************************** int cGIBLib::numCard() -{ return (nPlayerCard(0)+nPlayerCard(1)+ nPlayerCard(2)+nPlayerCard(3));} +{ + return (nPlayerCard(0) + nPlayerCard(1) + nPlayerCard(2) + nPlayerCard(3)); +} int cGIBLib::nPlayerCard(int pl) -{ return bitCount(mPlayerSuit[pl][0])+bitCount(mPlayerSuit[pl][1]) - +bitCount(mPlayerSuit[pl][2])+bitCount(mPlayerSuit[pl][3]); +{ + return bitCount(mPlayerSuit[pl][0]) + bitCount(mPlayerSuit[pl][1]) + + bitCount(mPlayerSuit[pl][2]) + bitCount(mPlayerSuit[pl][3]); } // ***************************************************************************** @@ -269,80 +291,91 @@ bool cGIBLib::playCard(int suit, int card) { int player, pl, c; - if((suit<0) || (suit>3) || (card<0) || (card>12)) - { sprintf(szErrMsg,"*** error: invalid playcard suit=%d card=%d\n", - suit,card); + if ((suit < 0) || (suit > 3) || (card < 0) || (card > 12)) + { + sprintf(szErrMsg, "*** error: invalid playcard suit=%d card=%d\n", + suit, card); return false; } // find player player = -1; - for(pl=0; pl<4; pl++) - { if(isBit(mPlayerSuit[pl][suit],card)) - { player = pl; + for (pl = 0; pl < 4; pl++) + { + if (isBit(mPlayerSuit[pl][suit], card)) + { + player = pl; break; } } - if(player == -1) - { sprintf(szErrMsg,"*** error: card %c%c not found in hands\n", - chSUIT[suit],chCARD[card]); + if (player == -1) + { + sprintf(szErrMsg, "*** error: card %c%c not found in hands\n", + chSUIT[suit], chCARD[card]); return false; } // set/test player - if((suit == SuitPlayed[0]) && (card == CardPlayed[0])) + if ((suit == SuitPlayed[0]) && (card == CardPlayed[0])) Player = Leader = player; else - { // check the player, it must be same as current player - if(player != Player) - { sprintf(szErrMsg,"*** error: wrong player(%c) for card %c%c\n", - chPLAYER[player],chSUIT[suit],chCARD[card]); + { + // check the player, it must be same as current player + if (player != Player) + { + sprintf(szErrMsg, "*** error: wrong player(%c) for card %c%c\n", + chPLAYER[player], chSUIT[suit], chCARD[card]); return false; } } // player must follow suit - if( (nTrickCard != 0) - && bitCount(mPlayerSuit[player][SuitLed]) - && (suit != SuitLed)) - { sprintf(szErrMsg,"*** error: card %c%c is not following suit led %c\n", - chSUIT[suit],chCARD[card],chSUIT[SuitLed]); + if ( (nTrickCard != 0) + && bitCount(mPlayerSuit[player][SuitLed]) + && (suit != SuitLed)) + { + sprintf(szErrMsg, "*** error: card %c%c is not following suit led %c\n", + chSUIT[suit], chCARD[card], chSUIT[SuitLed]); return false; } // update the player's cards - clearBit(mPlayerSuit[player][suit],card); + clearBit(mPlayerSuit[player][suit], card); - if((nTrickCard % 4) == 0) - { // first card of trick, remember suitled and card played + if ((nTrickCard % 4) == 0) + { + // first card of trick, remember suitled and card played SuitLed = suit; TrickStart = 4 * nTrick; } // set this player - PlayerPlayed[4*nTrick+nTrickCard] = player; - SuitPlayed[4*nTrick+nTrickCard] = suit; - CardPlayed[4*nTrick+nTrickCard] = card; + PlayerPlayed[4 * nTrick + nTrickCard] = player; + SuitPlayed[4 * nTrick + nTrickCard] = suit; + CardPlayed[4 * nTrick + nTrickCard] = card; nTrickCard++; - if(nTrickCard == 4) - { // end of trick, update leader and tricks + if (nTrickCard == 4) + { + // end of trick, update leader and tricks c = TrickStart; int winningplayer = PlayerPlayed[c]; - int winningsuit = SuitPlayed[c]; - int winningcard = CardPlayed[c]; - for(c=TrickStart+1; c(strlen(pchstart)); + pszComment = static_cast(realloc(pszComment, static_cast(pos + len + 2) * sizeof(char))); + strcpy(pszComment + pos, pchstart); pos += len; - strcpy(pszComment+pos,"\n"); + strcpy(pszComment + pos, "\n"); pos++; - if(readLine() == false) + if (readLine() == false) return false; pchstart = szLine; } @@ -506,11 +551,11 @@ bool cGIBLib::readComment() pch++; chkeep = *pch; *pch = '\0'; - len = strlen(pchstart); - pszComment = (char*)realloc(pszComment,(pos+len+2)*sizeof(char)); - strcpy(pszComment+pos,szLine); + len = static_cast(strlen(pchstart)); + pszComment = static_cast(realloc(pszComment, static_cast(pos + len + 2) * sizeof(char))); + strcpy(pszComment + pos, szLine); pos += len; - strcpy(pszComment+pos,"\n"); + strcpy(pszComment + pos, "\n"); *pch = chkeep; return true; @@ -518,51 +563,59 @@ bool cGIBLib::readComment() } // cGIBLib::readComment // ***************************************************************************** -bool cGIBLib::readDeal(FILE *fileptr) +bool cGIBLib::readDeal(FILE * fileptr) { fp = fileptr; reset(); - for(;;) - { if(readLine() == false) + for (;;) + { + if (readLine() == false) return false; - while(isspace(*pch)) + while (isspace(*pch)) pch++; - if(*pch == '{') - { if(pszComment[0] == '\0') - { if(readComment() == false) + if (*pch == '{') + { + if (pszComment[0] == '\0') + { + if (readComment() == false) return false; - if(getOptions() == false) + if (getOptions() == false) return false; } else - { sprintf(szErrMsg,"*** error: more than one comment at line %d\n",nLine); + { + sprintf(szErrMsg, "*** error: more than one comment at line %d\n", nLine); return false; } } - else if(*pch == '\0') - { // skip empty line + else if (*pch == '\0') + { + // skip empty line continue; } else - { // neither comment nor empty line, this is a deal + { + // neither comment nor empty line, this is a deal break; } } - pch = strchr(szLine,':'); - if(pch) + pch = strchr(szLine, ':'); + if (pch) *pch = '\0'; - strcpy(szDeal,szLine); - if(pch) - { pch++; - if(strlen(pch) != 20) - { sprintf(szErrMsg,"*** error: length tricks not 20 at line %d\n", + strcpy(szDeal, szLine); + if (pch) + { + pch++; + if (strlen(pch) != 20) + { + sprintf(szErrMsg, "*** error: length tricks not 20 at line %d\n", nLine); return false; } - strcpy(szTricks,pch); + strcpy(szTricks, pch); } return true; @@ -570,63 +623,73 @@ bool cGIBLib::readDeal(FILE *fileptr) } // cGIBLib::readDeal // ***************************************************************************** -bool cGIBLib::readFile(int ideal0, char *pszname, FILE *fileptr) +bool cGIBLib::readFile(int ideal0, char * pszname, FILE * fileptr) { fp = fileptr; nLine = 0; reset(); - for(;;) - { if(readLine() == false) + for (;;) + { + if (readLine() == false) return false; - while(isspace(*pch)) + while (isspace(*pch)) pch++; - if(*pch == '{') - { if(pszComment[0] == '\0') - { if(readComment() == false) + if (*pch == '{') + { + if (pszComment[0] == '\0') + { + if (readComment() == false) return false; - if(getOptions() == false) + if (getOptions() == false) return false; } else - { sprintf(szErrMsg,"*** error: more than one comment at line %d\n",nLine); + { + sprintf(szErrMsg, "*** error: more than one comment at line %d\n", nLine); return false; } } - else if(*pch == '\0') - { // skip empty line + else if (*pch == '\0') + { + // skip empty line continue; } else - { // neither comment nor empty line, this is a deal - if(pszname) - { if(strcmp(pszname,pszName) == 0) + { + // neither comment nor empty line, this is a deal + if (pszname) + { + if (strcmp(pszname, pszName) == 0) break; } else - { ideal0--; - if(ideal0 < 0) + { + ideal0--; + if (ideal0 < 0) break; } reset(); } } - pch = strchr(szLine,':'); - if(pch) + pch = strchr(szLine, ':'); + if (pch) *pch = '\0'; - strcpy(szDeal,szLine); - if(pch) - { pch++; - if(strlen(pch) != 20) - { sprintf(szErrMsg,"*** error: length tricks not 20 at line %d\n",nLine); + strcpy(szDeal, szLine); + if (pch) + { + pch++; + if (strlen(pch) != 20) + { + sprintf(szErrMsg, "*** error: length tricks not 20 at line %d\n", nLine); return false; } - strcpy(szTricks,pch); + strcpy(szTricks, pch); } - if(setDeal() == false) + if (setDeal() == false) return false; return true; @@ -636,30 +699,33 @@ bool cGIBLib::readFile(int ideal0, char *pszname, FILE *fileptr) bool cGIBLib::readLine() { - char *pchcr; + char * pchcr; bFileEnd = false; nLine++; - if(fgets(szLine,GIBLIB_LENLINE,fp) == 0) - { if(feof(fp)) - { bFileEnd = true; - sprintf(szErrMsg,"*** error: end-of-file reading line %d of file\n",nLine); + if (fgets(szLine, GIBLIB_LENLINE, fp) == 0) + { + if (feof(fp)) + { + bFileEnd = true; + sprintf(szErrMsg, "*** error: end-of-file reading line %d of file\n", nLine); return false; } else - { sprintf(szErrMsg,"*** error: %s: reading line %d of file\n", - strerror(errno),nLine); + { + sprintf(szErrMsg, "*** error: %s: reading line %d of file\n", + strerror(errno), nLine); return false; } } // remove any '\r' and '\n', - pchcr = strchr(szLine,'\r'); - if(pchcr) + pchcr = strchr(szLine, '\r'); + if (pchcr) *pchcr = '\0'; - pchcr = strchr(szLine,'\n'); - if(pchcr) + pchcr = strchr(szLine, '\n'); + if (pchcr) *pchcr = '\0'; pch = szLine; @@ -673,9 +739,9 @@ void cGIBLib::reset() { pszName[0] = '\0'; pszComment[0] = '\0'; - Trumps = 4; // default notrump - Leader = 0; // default west - memset(szTricks,'-',20); + Trumps = 4; // default notrump + Leader = 0; // default west + memset(szTricks, '-', 20); szTricks[20] = '\0'; nPlayed = 0; @@ -684,76 +750,87 @@ void cGIBLib::reset() bool cGIBLib::setDeal() { - int pl, s, nplayer, c; - char *pc; + int pl, s, nplayer, c; + char * pc; ushort msuit[4]; pc = szDeal; - memset(mPlayerSuit,0,4*4*sizeof(ushort)); - memset(msuit,0,4*sizeof(ushort)); + memset(mPlayerSuit, 0, 4 * 4 * sizeof(ushort)); + memset(msuit, 0, 4 * sizeof(ushort)); pl = ePLAYER_WEST; s = eSUIT_SPADE; nplayer = 1; - for(;;) - { if(nplayer > 4) - { sprintf(szErrMsg,"*** error: deal too many players\n"); + for (;;) + { + if (nplayer > 4) + { + sprintf(szErrMsg, "*** error: deal too many players\n"); return false; } - else if(pc[0] == '\0') + else if (pc[0] == '\0') break; - else if(pc[0] == ' ') - { // next player - pl = ((pl+1) & 3); + else if (pc[0] == ' ') + { + // next player + pl = ((pl + 1) & 3); s = eSUIT_SPADE; nplayer++; } - else if(*pc == '.') - { // next suit + else if (*pc == '.') + { + // next suit s++; - if(s > eSUIT_CLUB) - { sprintf(szErrMsg,"*** error: deal too many suits\n"); + if (s > eSUIT_CLUB) + { + sprintf(szErrMsg, "*** error: deal too many suits\n"); return false; } } else - { if(bitCount(mPlayerSuit[pl][s]) >= 13) - { sprintf(szErrMsg,"*** error: more than 13 cards in suit at line %d\n", + { + if (bitCount(mPlayerSuit[pl][s]) >= 13) + { + sprintf(szErrMsg, "*** error: more than 13 cards in suit at line %d\n", nLine); return false; } c = getCard(pc[0]); - if(c == eCARD_NONE) - { sprintf(szErrMsg,"*** error: invalid deal card %c line %d\n", - pc[0],nLine); + if (c == eCARD_NONE) + { + sprintf(szErrMsg, "*** error: invalid deal card %c line %d\n", + pc[0], nLine); return false; } - if(isBit(mPlayerSuit[pl][s],c)) - { sprintf(szErrMsg,"*** error: duplicate card %c player %c\n", - chCARD[c],chPLAYER[pl]); + if (isBit(mPlayerSuit[pl][s], c)) + { + sprintf(szErrMsg, "*** error: duplicate card %c player %c\n", + chCARD[c], chPLAYER[pl]); return false; } - if(isBit(msuit[s],c)) - { sprintf(szErrMsg,"*** error: duplicate card %c in more than one hand\n", + if (isBit(msuit[s], c)) + { + sprintf(szErrMsg, "*** error: duplicate card %c in more than one hand\n", chCARD[c]); return false; } - setBit(msuit[s],c); - setBit(mPlayerSuit[pl][s],c); + setBit(msuit[s], c); + setBit(mPlayerSuit[pl][s], c); } pc++; } // test equal number of cards in each hand - if( (nPlayerCard(0) != nPlayerCard(1)) - || (nPlayerCard(0) != nPlayerCard(2)) - || (nPlayerCard(0) != nPlayerCard(3))) - { sprintf(szErrMsg,"*** error: different number of cards in hands line %d\n", + if ( (nPlayerCard(0) != nPlayerCard(1)) + || (nPlayerCard(0) != nPlayerCard(2)) + || (nPlayerCard(0) != nPlayerCard(3))) + { + sprintf(szErrMsg, "*** error: different number of cards in hands line %d\n", nLine); return false; } // play specified cards - if(setPlayed() == false) + if (setPlayed() == false) return false; return true; @@ -763,22 +840,26 @@ bool cGIBLib::setDeal() bool cGIBLib::setGeneratedDeal() { - int pos, player, suit, c; + int pos, player, suit, c; ushort m; reset(); pos = 0; - for(player=0; player<4; player++) - { for(suit=0; suit<4; suit++) - { if(suit > 0) - { szDeal[pos] = '.'; + for (player = 0; player < 4; player++) + { + for (suit = 0; suit < 4; suit++) + { + if (suit > 0) + { + szDeal[pos] = '.'; pos++; } m = mPlayerSuit[player][suit]; - while(m) - { c = leastSignificant1Bit(m); - clearBit(m,c); + while (m) + { + c = leastSignificant1Bit(m); + clearBit(m, c); szDeal[pos] = chCARD[c]; pos++; } @@ -786,11 +867,11 @@ bool cGIBLib::setGeneratedDeal() szDeal[pos] = ' '; pos++; } - szDeal[pos-1] = '\0'; + szDeal[pos - 1] = '\0'; - if(setDeal() == false) + if (setDeal() == false) return false; - if(setPlayed() == false) + if (setPlayed() == false) return false; return true; @@ -807,8 +888,9 @@ bool cGIBLib::setPlayed() nplayed = nPlayed; nPlayed = 0; - for(i=0; i(realloc(pszName, static_cast(len + 1) * sizeof(char))); + strncpy(pszName, pszname, static_cast(len)); pszName[len] = '\0'; } // cGIBLib::setName @@ -838,16 +921,19 @@ bool cGIBLib::skipComment() { // must be called with position at '{' - while(*pch != '}') - { pch++; - if(*pch=='\0') - { // line end, read next line - if(readLine() == false) + while (*pch != '}') + { + pch++; + if (*pch == '\0') + { + // line end, read next line + if (readLine() == false) return false; } } - if(readLine() == false) - { if(bFileEnd == false) + if (readLine() == false) + { + if (bFileEnd == false) return false; } @@ -862,29 +948,31 @@ bool cGIBLib::unplayCard() int player, suit, card; - if(nPlayed == 0) - { sprintf(szErrMsg,"*** error: no cards to unplay in giblibPlayCard()\n"); + if (nPlayed == 0) + { + sprintf(szErrMsg, "*** error: no cards to unplay in giblibPlayCard()\n"); return false; } nPlayed--; player = PlayerPlayed[nPlayed]; - suit = SuitPlayed[nPlayed]; - card = CardPlayed[nPlayed]; + suit = SuitPlayed[nPlayed]; + card = CardPlayed[nPlayed]; // update the player's cards - setBit(mPlayerSuit[player][suit],card); + setBit(mPlayerSuit[player][suit], card); - nTrickCard = ((nTrickCard -1) & 3); - if(nTrickCard == 3) - { nTrick--; - if(WinningPlayer[nTrick] & 1) + nTrickCard = ((nTrickCard - 1) & 3); + if (nTrickCard == 3) + { + nTrick--; + if (WinningPlayer[nTrick] & 1) nTrickSN--; else nTrickWE--; TrickStart = 4 * nTrick; SuitLed = SuitPlayed[TrickStart]; - Leader = PlayerPlayed[TrickStart]; + Leader = PlayerPlayed[TrickStart]; } Player = PlayerPlayed[nPlayed]; diff --git a/giblib.h b/giblib.h index 7b8eb1c..a43469f 100644 --- a/giblib.h +++ b/giblib.h @@ -1,8 +1,8 @@ /* ************************************************************************** - giblib.h giblib reader and state for bridge C/C++ programs + giblib.h giblib reader and state for bridge C/C++ programs PM Cronje June 2006 - PM Cronje 13-Jul-2006 add deal genearator + PM Cronje 13-Jul-2006 add deal genearator Copyright 2006 P.M.Cronje @@ -15,12 +15,12 @@ DDD 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 + 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 DDD; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA ************************************************************************** */ @@ -143,135 +143,137 @@ class cGIBLib { public: - // construct/destruct - cGIBLib(); - ~cGIBLib(); - - // print - void print(); - void printHands(); - void printInfo(); - - // read deal (ideal0=0,1,2, ...) from GIBLib file - bool readFile(int ideal0, char *pszname, FILE *fileptr); - // read next deal in the file - bool readDeal(FILE *fileptr); - - // play a card (it be present in current player's hand) - // all variables affected are updated - bool playCard(int suit, int card); - - // unplay previous card (there must be one or more played) - bool unplayCard(); - - // number of cards in hand of player 0,1,2,3 (i.e. w,n,e,s) - int nPlayerCard(int pl); - - // number of cards in all hands - int numCard(); - - // decode szTricks[i], 0<=i<20 - // if successful returns true with result in - // *pleader/*ptrumps/*pntrick - // if unsuccessful returns false with default result - // *pleader = ePLAYER_WEST - // *ptrumps = eCONTRACT_NOTRUMP - // *pntrick = 0 - bool getTricks(int i, int *pleader, int *ptrumps, int *pntrick); - - // ---------------------------------------------------------- - // deal generation - // ---------------------------------------------------------- - - // generate a random deal - // this sets mPlayerSuit[4][4] only, - // nothing else, - // to set the giblib object, - // call setGeneratedDeal(...) after this - // the idea is that you may want to do filtering on the deals - // checking whether a deal is acceptable first, without - // having the overhead of also setting the deal into the - // giblib object - bool generateDeal(int ntrick); - - // set generated deal, - // call this only after generateDeal(...), - // this will set szDeal and clear szTricks with '-', - // and initialize some other variables - bool setGeneratedDeal(); - - // ---------------------------------------------------------- - // READ-ONLY public data (after successful read) - // ---------------------------------------------------------- - - // date read: deal, giblib tricks, comment, name - char szDeal[68]; - char szTricks[24]; - char *pszComment, *pszName; - - // -------------------- - // play/unplay - // -------------------- - - // cards played - int nPlayed; - // player, suit, card for i=0,...,nPlayed-1 - int PlayerPlayed[52], SuitPlayed[52], CardPlayed[52]; - // trick number 0,1,... - // trick card 0,1,2,3 - // tricks won sofar by south/north and west/east - int nTrick, nTrickCard, nTrickSN, nTrickWE; - // TrickStart is index into the three lists ...Played[52] - // for the first card of this trick - int TrickStart; - // suit led at this trick - // player to this card of this trick - // winning player this trick (at completion of trick) - int SuitLed, Player, WinningPlayer[13]; - - // failed calls write their error message here, - // print this to see the reason - char szErrMsg[512]; - - // ---------------------------------------------------------- - // READ-ONLY processed data (after successful read) - // ---------------------------------------------------------- - - int Trumps; // s=0,h=1,d=2,c=3,n=4 - - // leader of current trick - int Leader; // w=0,n=1,e=2,s=3 - - // bit masks of cards per player/suit: - ushort mPlayerSuit[4][4]; // [player][suit] - - // ---------------------------------------------------------- - // INTERNAL interface - // ---------------------------------------------------------- - - char *pch, szLine[GIBLIB_LENLINE]; - int nLine; - bool bFileEnd; - FILE *fp; - - static enum eCard getCard(char chcard); - bool getOptions(); - static char *printSuit(ushort m, char sz[]); - bool readComment(); - bool readLine(); - void reset(); - bool setDeal(); - bool setPlayed(); - void setName(char *pszname); - bool skipComment(); - - // deal generator - // uses RNG (random number generator) - cRNG *pRNG; - - // set the RNG seed - void setRNGSeed(unsigned int useed) - { if(pRNG) pRNG->set(useed);} + // construct/destruct + cGIBLib(); + ~cGIBLib(); + + // print + void print(); + void printHands(); + void printInfo(); + + // read deal (ideal0=0,1,2, ...) from GIBLib file + bool readFile(int ideal0, char * pszname, FILE * fileptr); + // read next deal in the file + bool readDeal(FILE * fileptr); + + // play a card (it be present in current player's hand) + // all variables affected are updated + bool playCard(int suit, int card); + + // unplay previous card (there must be one or more played) + bool unplayCard(); + + // number of cards in hand of player 0,1,2,3 (i.e. w,n,e,s) + int nPlayerCard(int pl); + + // number of cards in all hands + int numCard(); + + // decode szTricks[i], 0<=i<20 + // if successful returns true with result in + // *pleader/*ptrumps/*pntrick + // if unsuccessful returns false with default result + // *pleader = ePLAYER_WEST + // *ptrumps = eCONTRACT_NOTRUMP + // *pntrick = 0 + bool getTricks(int i, int * pleader, int * ptrumps, int * pntrick); + + // ---------------------------------------------------------- + // deal generation + // ---------------------------------------------------------- + + // generate a random deal + // this sets mPlayerSuit[4][4] only, + // nothing else, + // to set the giblib object, + // call setGeneratedDeal(...) after this + // the idea is that you may want to do filtering on the deals + // checking whether a deal is acceptable first, without + // having the overhead of also setting the deal into the + // giblib object + bool generateDeal(int ntrick); + + // set generated deal, + // call this only after generateDeal(...), + // this will set szDeal and clear szTricks with '-', + // and initialize some other variables + bool setGeneratedDeal(); + + // ---------------------------------------------------------- + // READ-ONLY public data (after successful read) + // ---------------------------------------------------------- + + // date read: deal, giblib tricks, comment, name + char szDeal[68]; + char szTricks[24]; + char * pszComment, *pszName; + + // -------------------- + // play/unplay + // -------------------- + + // cards played + int nPlayed; + // player, suit, card for i=0,...,nPlayed-1 + int PlayerPlayed[52], SuitPlayed[52], CardPlayed[52]; + // trick number 0,1,... + // trick card 0,1,2,3 + // tricks won sofar by south/north and west/east + int nTrick, nTrickCard, nTrickSN, nTrickWE; + // TrickStart is index into the three lists ...Played[52] + // for the first card of this trick + int TrickStart; + // suit led at this trick + // player to this card of this trick + // winning player this trick (at completion of trick) + int SuitLed, Player, WinningPlayer[13]; + + // failed calls write their error message here, + // print this to see the reason + char szErrMsg[512]; + + // ---------------------------------------------------------- + // READ-ONLY processed data (after successful read) + // ---------------------------------------------------------- + + int Trumps; // s=0,h=1,d=2,c=3,n=4 + + // leader of current trick + int Leader; // w=0,n=1,e=2,s=3 + + // bit masks of cards per player/suit: + ushort mPlayerSuit[4][4]; // [player][suit] + + // ---------------------------------------------------------- + // INTERNAL interface + // ---------------------------------------------------------- + + char * pch, szLine[GIBLIB_LENLINE]; + int nLine; + bool bFileEnd; + FILE * fp; + + static enum eCard getCard(char chcard); + bool getOptions(); + static char * printSuit(ushort m, char sz[]); + bool readComment(); + bool readLine(); + void reset(); + bool setDeal(); + bool setPlayed(); + void setName(char * pszname); + bool skipComment(); + + // deal generator + // uses RNG (random number generator) + cRNG * pRNG; + + // set the RNG seed + void setRNGSeed(unsigned int useed) + { + if (pRNG) pRNG->set(useed); + } }; // cGIBLib // ----------------------------------------------------------------------------- diff --git a/portab_DDD.h b/portab_DDD.h new file mode 100644 index 0000000..bd1797f --- /dev/null +++ b/portab_DDD.h @@ -0,0 +1,54 @@ +// Update to DDS v2.8 +// Soren Hein, November 2014 + +#if defined(_WIN32) + #if defined(__MINGW32__) && !defined(WINVER) + #define WINVER 0x500 + #endif + + #if defined(_MSC_VER) + #include + #endif + + #include + + #define strcasecmp _stricmp + #define strncasecmp _strnicmp + #define snprintf _snprintf + + #define access _access + #define F_OK 0 + +#elif defined(__CYGWIN__) + #include + #include + +#elif defined(__linux) + #include + #include + #include + #include + #include + #include + #include + +#elif defined(__APPLE__) + #include + #include + #include + #include + #include + #include + +#endif + + +// In C++11 UNUSED(x) is explicitly provided +#if __cplusplus <= 199711L + #if defined (_MSC_VER) + #define UNUSED(x) (void) (x); + #else + #define UNUSED(x) (void) (sizeof((x), 0)) + #endif + #define nullptr NULL +#endif diff --git a/readme.txt b/readme2006.txt similarity index 100% rename from readme.txt rename to readme2006.txt diff --git a/rng.cpp b/rng.cpp index 76c8076..1cc677f 100644 --- a/rng.cpp +++ b/rng.cpp @@ -1,5 +1,5 @@ // ============================================================================= -/* rng.cpp RNG - random number generators +/* rng.cpp RNG - random number generators PMC 14-jun-2005 PMC 06-jul-2005 @@ -14,12 +14,12 @@ RNG 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 + 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 RNG; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ // ============================================================================= @@ -27,27 +27,34 @@ #include #include #include -#include -#include -#include -#include -#include #include +#include "portab_DDD.h" #include "rng.h" -const char *pszRNGGen[eRNG_COUNT] - = { - "qd1", - "mt", - "mthr", - "well" - }; - -const char *pszRNGGenList = "qd1/mt/mthr/well"; -const char *pszRNGGenDefault = "mt"; - -double dRAN_SCALE = 1.0 / (1.0+double((unsigned int)(0xFFFFFFFF))); +const char * pszRNGGen[eRNG_COUNT] += +{ + "qd1", + "mt", + "mthr", + "well" +}; + +const char * pszRNGGenList = "qd1/mt/mthr/well"; +const char * pszRNGGenDefault = "mt"; + +double dRAN_SCALE = 1.0 / (1.0 + double(static_cast(0xFFFFFFFF))); + +unsigned int qd1(unsigned int * puseed); +void reset1Bit(unsigned int u1bit, unsigned int * pu); +unsigned int count1Bits(unsigned int useed); +unsigned int qd1Uint(unsigned int * puseed, unsigned int urange); +unsigned int equiDistribute1Bits(unsigned int u, unsigned int * puseed); +void set0Bit(unsigned int u0bit, unsigned int * pu); +double gammln(float xx); +void gcf(double * gammcf, double aa, double x, double * gln); +void gser(double * gamser, double aa, double x, double * gln); // ***************************************************************************** // cRNG @@ -55,24 +62,25 @@ double dRAN_SCALE = 1.0 / (1.0+double((unsigned int)(0xFFFFFFFF))); unsigned int cRNG::randomUint(unsigned int urange) { - return (unsigned int)((double)urange * (double)random() * dRAN_SCALE); + return static_cast(static_cast(urange) * + static_cast(random()) * dRAN_SCALE); } // cRNG::randomUint // ***************************************************************************** -cRNG *cRNG::createRNG(eRNG erng, unsigned int useed) +cRNG * cRNG::createRNG(eRNG erng, unsigned int useed) { - cRNG *prng; + cRNG * prng; int rng; - rng = (int)erng; - if(rng == eRNG_QD1) + rng = static_cast(erng); + if (rng == eRNG_QD1) prng = new cRNG_QD1(useed); - else if(rng == eRNG_MTHR) + else if (rng == eRNG_MTHR) prng = new cRNG_Mother(useed); else if (rng == eRNG_WELL) prng = new cRNG_WELL(useed); - else // if(rng == eRNG_MT) // default + else // if(rng == eRNG_MT) // default prng = new cRNG_MT19937(useed); return prng; @@ -80,17 +88,17 @@ cRNG *cRNG::createRNG(eRNG erng, unsigned int useed) } // cRNG::createRNG(erng) // ***************************************************************************** -cRNG *cRNG::createRNG(char *pszrng, unsigned int useed) +cRNG * cRNG::createRNG(char * pszrng, unsigned int useed) { - cRNG *prng; + cRNG * prng; - if(0 == strcasecmp(pszrng,"qd1")) + if (0 == strcasecmp(pszrng, "qd1")) prng = new cRNG_QD1(useed); - else if(0 == strcasecmp(pszrng,"mthr")) + else if (0 == strcasecmp(pszrng, "mthr")) prng = new cRNG_Mother(useed); - else if (0 == strcasecmp(pszrng,"well")) + else if (0 == strcasecmp(pszrng, "well")) prng = new cRNG_WELL(useed); - else // if(0 == strcasecmp(pszrng,"mt")) // default + else // if(0 == strcasecmp(pszrng,"mt")) // default prng = new cRNG_MT19937(useed); return prng; @@ -105,12 +113,13 @@ void cRNG_QD1::set(unsigned int useed) { uSeed = useed; RNG = eRNG_QD1; - strcpy(szGen,pszRNGGen[RNG]); + strcpy(szGen, pszRNGGen[RNG]); } unsigned int cRNG_QD1::random() { - uSeed = ((unsigned int)(1664525L) * uSeed + (unsigned int)(1013904223L)); + uSeed = (static_cast(1664525L) * uSeed + + static_cast(1013904223L)); return uSeed; } // cRNG_QD1::random @@ -118,17 +127,20 @@ unsigned int cRNG_QD1::random() // equiDistribute1Bits /* ************************************************************************** */ -unsigned int qd1(unsigned int *puseed) +unsigned int qd1(unsigned int * puseed) { - *puseed = ((unsigned int)(1664525L) * (*puseed) + (unsigned int)(1013904223L)); + *puseed = (static_cast(1664525L) * (*puseed) + + static_cast(1013904223L)); return *puseed; } // qd1 -unsigned int qd1Uint(unsigned int *puseed, unsigned int urange) +unsigned int qd1Uint(unsigned int * puseed, unsigned int urange) { - *puseed = ((unsigned int)(1664525L) * (*puseed) + (unsigned int)(1013904223L)); - return (unsigned int)((double)urange * (double)(*puseed) * dRAN_SCALE); + *puseed = (static_cast(1664525L) * (*puseed) + + static_cast(1013904223L)); + return static_cast(static_cast(urange) * + static_cast(*puseed) * dRAN_SCALE); } // qd1Uint @@ -139,8 +151,9 @@ unsigned int count1Bits(unsigned int useed) // count the number of 1-bits mask = 0x00000001; n1 = 0; - for(i=0; i<32; i++) - { if(mask & useed) + for (i = 0; i < 32; i++) + { + if (mask & useed) n1++; mask = (mask << 1); } @@ -149,17 +162,20 @@ unsigned int count1Bits(unsigned int useed) } // count1Bits -void reset1Bit(unsigned int u1bit, unsigned int *pu) +void reset1Bit(unsigned int u1bit, unsigned int * pu) { unsigned int mask, n, i; // find and zero the bit mask = 0x00000001; n = 0; - for(i=0; i<32; i++) - { if(mask & (*pu)) - { if(n == u1bit) - { *pu = ((*pu) & (~mask)); + for (i = 0; i < 32; i++) + { + if (mask & (*pu)) + { + if (n == u1bit) + { + *pu = ((*pu) & (~mask)); return; } n++; @@ -169,17 +185,20 @@ void reset1Bit(unsigned int u1bit, unsigned int *pu) } // reset1Bit -void set0Bit(unsigned int u0bit, unsigned int *pu) +void set0Bit(unsigned int u0bit, unsigned int * pu) { unsigned int mask, n, i; // find and set the bit mask = 0x00000001; n = 0; - for(i=0; i<32; i++) - { if(0 == (mask & (*pu))) - { if(n == u0bit) - { *pu = ((*pu) | mask); + for (i = 0; i < 32; i++) + { + if (0 == (mask & (*pu))) + { + if (n == u0bit) + { + *pu = ((*pu) | mask); return; } n++; @@ -190,30 +209,34 @@ void set0Bit(unsigned int u0bit, unsigned int *pu) } // set0Bit -unsigned int equiDistribute1Bits(unsigned int u, unsigned int *puseed) +unsigned int equiDistribute1Bits(unsigned int u, unsigned int * puseed) { // if number of 1-bits in useed not 16, - // if excess of 1-bits, randomly reset them to 0-bits - // if excess of 0-bits, randomly set them to 1-bits + // if excess of 1-bits, randomly reset them to 0-bits + // if excess of 0-bits, randomly set them to 1-bits - unsigned int n1, i,ueq, ubit, n0; + unsigned int n1, i, ueq, ubit, n0; // count the number of 1-bits n1 = count1Bits(u); ueq = u; - if(n1 > 16) - { for(i=n1; i>16; i--) - { ubit = qd1Uint(puseed,i); - reset1Bit(ubit,&ueq); + if (n1 > 16) + { + for (i = n1; i > 16; i--) + { + ubit = qd1Uint(puseed, i); + reset1Bit(ubit, &ueq); } } - else if(n1 < 16) - { n0 = 32 - n1; - for(i=n0; i>16; i--) - { ubit = qd1Uint(puseed,i); - set0Bit(ubit,&ueq); + else if (n1 < 16) + { + n0 = 32 - n1; + for (i = n0; i > 16; i--) + { + ubit = qd1Uint(puseed, i); + set0Bit(ubit, &ueq); } } @@ -234,23 +257,23 @@ unsigned int equiDistribute1Bits(unsigned int u, unsigned int *puseed) #define M2 24 #define M3 10 -#define V0 STATE[ state_i ] -#define VM1 STATE[(state_i+M1) & 0x0000001fU] -#define VM2 STATE[(state_i+M2) & 0x0000001fU] -#define VM3 STATE[(state_i+M3) & 0x0000001fU] -#define VRm1 STATE[(state_i+31) & 0x0000001fU] -#define newV0 STATE[(state_i+31) & 0x0000001fU] -#define newV1 STATE[ state_i ] +#define V0 STATE[ state_i ] +#define VM1 STATE[(state_i+M1) & 0x0000001fU] +#define VM2 STATE[(state_i+M2) & 0x0000001fU] +#define VM3 STATE[(state_i+M3) & 0x0000001fU] +#define VRm1 STATE[(state_i+31) & 0x0000001fU] +#define newV0 STATE[(state_i+31) & 0x0000001fU] +#define newV1 STATE[ state_i ] unsigned int cRNG_WELL::random() { - z0 = VRm1; - z1 = Identity(V0) ^ MAT0POS( 8, VM1); - z2 = MAT0NEG (-19, VM2) ^ MAT0NEG(-14, VM3); - newV1 = z1 ^ z2; - newV0 = MAT0NEG(-11,z0) - ^ MAT0NEG( -7,z1) - ^ MAT0NEG(-13,z2); + z0 = VRm1; + z1 = Identity(V0) ^ MAT0POS( 8, VM1); + z2 = MAT0NEG (-19, VM2) ^ MAT0NEG(-14, VM3); + newV1 = z1 ^ z2; + newV0 = MAT0NEG(-11, z0) + ^ MAT0NEG( -7, z1) + ^ MAT0NEG(-13, z2); state_i = (state_i + 31) & 0x0000001fU; @@ -278,7 +301,7 @@ void cRNG_WELL::set(unsigned int useed) unsigned int u, uqd1seed; RNG = eRNG_WELL; - strcpy(szGen,pszRNGGen[RNG]); + strcpy(szGen, pszRNGGen[RNG]); /* initialize using specified seed, set state mixing 0 and 1 bits @@ -287,12 +310,13 @@ void cRNG_WELL::set(unsigned int useed) state_i = 0; u = uqd1seed = useed; for (j = 0; j < 32; j++) - { STATE[j] = equiDistribute1Bits(u,&useed); + { + STATE[j] = equiDistribute1Bits(u, &useed); u = qd1(&useed); } /* run the generator for a while to escape from the seeded state */ - for(j=0; j<50000; j++) + for (j = 0; j < 50000; j++) random(); } // cRNG_WELL::set @@ -303,7 +327,7 @@ void cRNG_WELL::set(unsigned int useed) void cRNG_Mother::set(unsigned int useed) { RNG = eRNG_MTHR; - strcpy(szGen,pszRNGGen[RNG]); + strcpy(szGen, pszRNGGen[RNG]); uSeed = useed; smthr[0] = 5115; @@ -311,37 +335,37 @@ void cRNG_Mother::set(unsigned int useed) smthr[2] = 1492; smthr[3] = 2111111111; - xm1 = (uint64)smthr[0]; - xm2 = (uint64)smthr[1]; - xm3 = (uint64)smthr[2]; - xm4 = (uint64)smthr[3]; + xm1 = static_cast(smthr[0]); + xm2 = static_cast(smthr[1]); + xm3 = static_cast(smthr[2]); + xm4 = static_cast(smthr[3]); - unsigned int sum = xm1 + xm2 + xm3 + xm4; + unsigned int sum = static_cast(xm1 + xm2 + xm3 + xm4); cRNG_WELL rng(uSeed); - mcarry = (uint64)rng.randomUint(sum); + mcarry = static_cast(rng.randomUint(sum)); } // cRNG_Mother::set unsigned int cRNG_Mother::random() { - static uint64 am1 = (uint64)2111111111; - static uint64 am2 = (uint64)1492; - static uint64 am3 = (uint64)1776; - static uint64 am4 = (uint64)5115; + static uint64 am1 = static_cast(2111111111); + static uint64 am2 = static_cast(1492); + static uint64 am3 = static_cast(1776); + static uint64 am4 = static_cast(5115); uint64 x = am1 * xm1 - + am2 * xm2 - + am3 * xm3 - + am4 * xm4 - + mcarry; - - xm1 = xm2; - xm2 = xm3; - xm3 = xm4; - xm4 = (x & 0x00000000ffffffffULL); + + am2 * xm2 + + am3 * xm3 + + am4 * xm4 + + mcarry; + + xm1 = xm2; + xm2 = xm3; + xm3 = xm4; + xm4 = (x & 0x00000000ffffffffULL); mcarry = (x >> 32); - return (unsigned int)xm4; + return static_cast(xm4); } // cRNG_Mother::random // ***************************************************************************** @@ -353,25 +377,25 @@ unsigned int cRNG_Mother::random() /* Period parameters */ #define N 624 #define M 397 -#define MATRIX_A 0x9908b0dfUL /* constant vector a */ +#define MATRIX_A 0x9908b0dfUL /* constant vector a */ #define UPPER_MASK 0x80000000UL /* most significant w-r bits */ #define LOWER_MASK 0x7fffffffUL /* least significant r bits */ -// static unsigned long mt[N]; /* the array for the state vector */ +// static unsigned long mt[N]; /* the array for the state vector */ // static int mti=N+1; /* mti==N+1 means mt[N] is not initialized */ /* initializes mt[N] with a seed */ void cRNG_MT19937::initBySeed(unsigned int useed) { - U[0]= useed & 0xffffffffUL; - for (mti=1; mti> 30)) + mti); + U[mti] = (1812433253UL * (U[mti - 1] ^ (U[mti - 1] >> 30)) + mti); /* See Knuth TAOCP Vol2. 3rd Ed. P.106 for multiplier. */ - /* In the previous versions, MSBs of the seed affect */ - /* only MSBs of the array p->U[]. */ - /* 2002/01/09 modified by Makoto Matsumoto */ + /* In the previous versions, MSBs of the seed affect */ + /* only MSBs of the array p->U[]. */ + /* 2002/01/09 modified by Makoto Matsumoto */ U[mti] &= 0xffffffffUL; /* for >32 bit machines */ } @@ -390,24 +414,34 @@ void cRNG_MT19937::initByArray(unsigned int lenkey, unsigned int key[]) initBySeed(19650218UL); - i=1; j=0; - k = (N>lenkey ? N : lenkey); + i = 1; + j = 0; + k = (N > lenkey ? N : static_cast(lenkey)); for (; k; k--) { - U[i] = (U[i] ^ ((U[i-1] ^ (U[i-1] >> 30)) * 1664525UL)) - + key[j] + j; /* non linear */ + U[i] = (U[i] ^ ((U[i - 1] ^ (U[i - 1] >> 30)) * 1664525UL)) + + key[j] + static_cast(j); /* non linear */ U[i] &= 0xffffffffUL; /* for WORDSIZE > 32 machines */ - i++; j++; - if (i>=N) { U[0] = U[N-1]; i=1; } - if (j>=(int)lenkey) j=0; + i++; + j++; + if (i >= N) + { + U[0] = U[N - 1]; + i = 1; + } + if (j >= static_cast(lenkey)) j = 0; } - for (k=N-1; k; k--) + for (k = N - 1; k; k--) { - U[i] = (U[i] ^ ((U[i-1] ^ (U[i-1] >> 30)) * 1566083941UL)) - - i; /* non linear */ + U[i] = (U[i] ^ ((U[i - 1] ^ (U[i - 1] >> 30)) * 1566083941UL)) + - static_cast(i); /* non linear */ U[i] &= 0xffffffffUL; /* for WORDSIZE > 32 machines */ i++; - if (i>=N) { U[0] = U[N-1]; i=1; } + if (i >= N) + { + U[0] = U[N - 1]; + i = 1; + } } U[0] = 0x80000000UL; /* MSB is 1; assuring non-zero initial array */ @@ -421,15 +455,15 @@ void cRNG_MT19937::set(unsigned int useed) uSeed = useed; RNG = eRNG_MT; - strcpy(szGen,pszRNGGen[RNG]); + strcpy(szGen, pszRNGGen[RNG]); cRNG_WELL rng(useed); mag01[0] = 0x0UL; mag01[1] = MATRIX_A; - for(i=0; i<624; i++) + for (i = 0; i < 624; i++) key[i] = rng.random(); - initByArray(624,key); + initByArray(624, key); } // cRNG_MT19937::set @@ -440,23 +474,26 @@ unsigned int cRNG_MT19937::random() unsigned long y; if (mti >= N) - { /* generate N words at one time */ + { + /* generate N words at one time */ int kk; - if (mti == N+1) /* if not initalized, */ - initBySeed(5489UL); /* a default initial seed is used */ + if (mti == N + 1) /* if not initalized, */ + initBySeed(5489UL); /* a default initial seed is used */ - for (kk=0;kk> 1) ^ mag01[y & 0x1UL]; + for (kk = 0; kk < N - M; kk++) + { + y = (U[kk] & UPPER_MASK) | (U[kk + 1] & LOWER_MASK); + U[kk] = U[kk + M] ^ (y >> 1) ^ mag01[y & 0x1UL]; } - for (;kk> 1) ^ mag01[y & 0x1UL]; + for (; kk < N - 1; kk++) + { + y = (U[kk] & UPPER_MASK) | (U[kk + 1] & LOWER_MASK); + U[kk] = U[kk + (M - N)] ^ (y >> 1) ^ mag01[y & 0x1UL]; } - y = (U[N-1]&UPPER_MASK)|(U[0]&LOWER_MASK); - U[N-1] = U[M-1] ^ (y >> 1) ^ mag01[y & 0x1UL]; + y = (U[N - 1] & UPPER_MASK) | (U[0] & LOWER_MASK); + U[N - 1] = U[M - 1] ^ (y >> 1) ^ mag01[y & 0x1UL]; mti = 0; } @@ -499,26 +536,26 @@ static long totalc = 0; /* Probabilities per bin for entropy */ static double prob[256]; -/* LOG2 -- Calculate log to the base 2 */ +/* LOG2 -- Calculate log to the base 2 */ //static double log2(double x) //{ -// return log2of10 * log10(x); +// return log2of10 * log10(x); //} /* Bytes used as Monte Carlo - co-ordinates. This should be no more + co-ordinates. This should be no more bits than the mantissa of your "double" floating point type. */ -#define MONTEN 6 +#define MONTEN 6 static int mp; static bool sccfirst; static unsigned int monte[MONTEN]; static long inmont, mcount; static double a, cexp, incirc, montex, montey, montepi, - scc, sccun, sccu0, scclast, scct1, scct2, scct3, - ent, chisq, datasum; + scc, sccun, sccu0, scclast, scct1, scct2, scct3, + ent, chisq, datasum; void initEnt(bool binmode) { @@ -529,19 +566,19 @@ void initEnt(bool binmode) /* Initialise for calculations */ - ent = 0.0; /* Clear entropy accumulator */ - chisq = 0.0; /* Clear Chi-Square */ - datasum = 0.0; /* Clear sum of bytes for arithmetic mean */ + ent = 0.0; /* Clear entropy accumulator */ + chisq = 0.0; /* Clear Chi-Square */ + datasum = 0.0; /* Clear sum of bytes for arithmetic mean */ - mp = 0; /* Reset Monte Carlo accumulator pointer */ - mcount = 0; /* Clear Monte Carlo tries */ - inmont = 0; /* Clear Monte Carlo inside count */ + mp = 0; /* Reset Monte Carlo accumulator pointer */ + mcount = 0; /* Clear Monte Carlo tries */ + inmont = 0; /* Clear Monte Carlo inside count */ incirc = 65535.0 * 65535.0; /* In-circle distance for Monte Carlo */ - sccfirst = true; /* Mark first time for serial correlation */ + sccfirst = true; /* Mark first time for serial correlation */ scct1 = scct2 = scct3 = 0.0; /* Clear serial correlation terms */ - incirc = pow(pow(256.0, (double) (MONTEN / 2)) - 1, 2.0); + incirc = pow(pow(256.0, static_cast (MONTEN / 2)) - 1, 2.0); for (i = 0; i < 256; i++) ccount[i] = 0; @@ -549,9 +586,9 @@ void initEnt(bool binmode) } // initEnt -void addEnt(unsigned char *buf, int buflen) +void addEnt(unsigned char * buf, int buflen) { - unsigned char *bp = buf; + unsigned char * bp = buf; int oc, c, bean; while (bean = 0, (buflen-- > 0)) @@ -564,26 +601,28 @@ void addEnt(unsigned char *buf, int buflen) c = !!(oc & 0x80); else c = oc; - ccount[c]++; /* Update counter for this bin */ + ccount[c]++; /* Update counter for this bin */ totalc++; /* Update inside/outside circle counts for Monte Carlo computation of PI */ if (bean == 0) { - monte[mp++] = oc; /* Save character for Monte Carlo */ + monte[mp++] = static_cast(oc); /* Save character for Monte Carlo */ if (mp >= MONTEN) - { /* Calculate every MONTEN character */ + { + /* Calculate every MONTEN character */ int mj; mp = 0; mcount++; montex = montey = 0; for (mj = 0; mj < MONTEN / 2; mj++) - { montex = (montex * 256.0) + monte[mj]; + { + montex = (montex * 256.0) + monte[mj]; montey = (montey * 256.0) + monte[(MONTEN / 2) + mj]; } - if ((montex * montex + montey * montey) <= incirc) + if ((montex * montex + montey * montey) <= incirc) inmont++; } } @@ -592,7 +631,8 @@ void addEnt(unsigned char *buf, int buflen) sccun = c; if (sccfirst) - { sccfirst = false; + { + sccfirst = false; scclast = 0; sccu0 = sccun; } @@ -602,13 +642,14 @@ void addEnt(unsigned char *buf, int buflen) scct3 = scct3 + (sccun * sccun); scclast = sccun; oc <<= 1; - } while (binary && (++bean < 8)); + } + while (binary && (++bean < 8)); } } // addEnt -void endEnt(double *r_ent, double *r_chisq, double *r_mean, - double *r_montepicalc, double *r_scc) +void endEnt(double * r_ent, double * r_chisq, double * r_mean, + double * r_montepicalc, double * r_scc) { int i; @@ -625,18 +666,20 @@ void endEnt(double *r_ent, double *r_chisq, double *r_mean, /* Scan bins and calculate probability for each bin and Chi-Square distribution */ - cexp = totalc / (binary ? 2.0 : 256.0); /* Expected count per bin */ + cexp = totalc / (binary ? 2.0 : 256.0); /* Expected count per bin */ for (i = 0; i < (binary ? 2 : 256); i++) - { prob[i] = (double) ccount[i] / totalc; + { + prob[i] = static_cast(ccount[i]) / totalc; a = ccount[i] - cexp; chisq = chisq + (a * a) / cexp; - datasum += ((double) i) * ccount[i]; + datasum += (static_cast(i)) * ccount[i]; } /* Calculate entropy */ for (i = 0; i < (binary ? 2 : 256); i++) - { if (prob[i] > 0.0) + { + if (prob[i] > 0.0) ent += prob[i] * log2(1 / prob[i]); } @@ -644,7 +687,7 @@ void endEnt(double *r_ent, double *r_chisq, double *r_mean, within the circle */ - montepi = 4.0 * (((double) inmont) / mcount); + montepi = 4.0 * ((static_cast(inmont)) / mcount); /* Return results through arguments */ @@ -661,40 +704,41 @@ void prtEnt(double r_chisq, double r_mean, { // probability that observed chi^2 will exceed the value chi^2 // by chance EVEN for a correct model: - // Q(chi^2,nu) = gammaq(nu/2,chi^2/2); + // Q(chi^2,nu) = gammaq(nu/2,chi^2/2); // - double probq = 100.0 * gammq(127.5,0.5*r_chisq); + double probq = 100.0 * gammq(127.5, 0.5 * r_chisq); - printf(" %ss,Entropy,Chi-square,Mean,Monte-Carlo-Pi,Serial-Correlation\n", + printf(" %ss,Entropy,Chi-square,Mean,Monte-Carlo-Pi,Serial-Correlation\n", binary ? "bit" : "byte"); - printf(" %ld,%f,%.1f(%.2f%%),%f,%f(%.2f%%),%f\n", - //totalc,ent,r_chisq,100.0*chip,r_mean, - totalc,ent,r_chisq,probq,r_mean, - r_montepicalc,100.0*(r_montepicalc-PI),r_scc); + printf(" %ld,%f,%.1f(%.2f%%),%f,%f(%.2f%%),%f\n", + //totalc,ent,r_chisq,100.0*chip,r_mean, + totalc, ent, r_chisq, probq, r_mean, + r_montepicalc, 100.0 * (r_montepicalc - PI), r_scc); } // prtEnt // ***************************************************************************** + double gammln(float xx) { double x, y, tmp, ser; static double cof[6] - = { 76.18009172947146, - -86.50532032941677, + = { 76.18009172947146, + -86.50532032941677, 24.01409824083091, -1.231739572450155, - 0.1208650973866179e-2, + 0.1208650973866179e-2, -0.5395239384953e-5 }; int j; - y=x=xx; - tmp=x+5.5; - tmp -= (x+0.5)*log(tmp); - ser=1.000000000190015; - for (j=0;j<=5;j++) - ser += cof[j]/++y; - return -tmp+log(2.5066282746310005*ser/x); + y = x = xx; + tmp = x + 5.5; + tmp -= (x + 0.5) * log(tmp); + ser = 1.000000000190015; + for (j = 0; j <= 5; j++) + ser += cof[j] / ++y; + return -tmp + log(2.5066282746310005 * ser / x); } // gammln // ***************************************************************************** @@ -702,36 +746,39 @@ double gammln(float xx) #define EPS 3.0e-7 #define FPMIN 1.0e-30 -void gcf(double *gammcf, double a, double x, double *gln) + +void gcf(double * gammcf, double aa, double x, double * gln) { int i; double an, b, c, d, del, h; - *gln=gammln(a); - b=x+1.0-a; - c=1.0/FPMIN; - d=1.0/b; - h=d; - for (i=1;i<=ITMAX;i++) - { an = -i*(i-a); + *gln = gammln(static_cast(aa)); + b = x + 1.0 - aa; + c = 1.0 / FPMIN; + d = 1.0 / b; + h = d; + for (i = 1; i <= ITMAX; i++) + { + an = -i * (i - aa); b += 2.0; - d=an*d+b; + d = an * d + b; if (fabs(d) < FPMIN) - d=FPMIN; - c=b+an/c; + d = FPMIN; + c = b + an / c; if (fabs(c) < FPMIN) - c=FPMIN; - d=1.0/d; - del=d*c; + c = FPMIN; + d = 1.0 / d; + del = d * c; h *= del; - if (fabs(del-1.0) < EPS) + if (fabs(del - 1.0) < EPS) break; } if (i > ITMAX) - { printf("*** error %s: a too large, ITMAX too small\n",__func__); + { + printf("*** error %s: a too large, ITMAX too small\n", "gcf"); exit(1); } - *gammcf=exp(-x+a*log(x)-(*gln))*h; + *gammcf = exp(-x + aa * log(x) - (*gln)) * h; } // gcf @@ -742,35 +789,39 @@ void gcf(double *gammcf, double a, double x, double *gln) #define ITMAX 100 #define EPS 3.0e-7 -void gser(double *gamser, double a, double x, double *gln) + +void gser(double * gamser, double aa, double x, double * gln) { int n; - double sum,del,ap; + double sum, del, ap; - *gln=gammln(a); + *gln = gammln(static_cast(aa)); if (x <= 0.0) { if (x < 0.0) - { printf("*** error %s: x less than 0\n",__func__); + { + printf("*** error %s: x less than 0\n", "gser"); exit(1); } - *gamser=0.0; + *gamser = 0.0; return; } else { - ap=a; - del=sum=1.0/a; - for (n=1;n<=ITMAX;n++) - { ++ap; - del *= x/ap; + ap = aa; + del = sum = 1.0 / aa; + for (n = 1; n <= ITMAX; n++) + { + ++ap; + del *= x / ap; sum += del; if (fabs(del) < fabs(sum)*EPS) - { *gamser=sum*exp(-x+a*log(x)-(*gln)); + { + *gamser = sum * exp(-x + aa * log(x) - (*gln)); return; } } - printf("*** error %s: a too large, ITMAX too small\n",__func__); + printf("*** error %s: a too large, ITMAX too small\n", "gser"); exit(1); } @@ -780,21 +831,23 @@ void gser(double *gamser, double a, double x, double *gln) #undef EPS // ***************************************************************************** -double gammq(double a, double x) +double gammq(double aa, double x) { double gamser, gammcf, gln; if (x < 0.0 || a <= 0.0) - { printf("*** error %s: invalid arguments\n",__func__); + { + printf("*** error %s: invalid arguments\n", "gammq"); exit(1); } - if (x < (a+1.0)) - { gser(&gamser,a,x,&gln); - return 1.0-gamser; + if (x < (aa + 1.0)) + { + gser(&gamser, aa, x, &gln); + return 1.0 - gamser; } else { - gcf(&gammcf,a,x,&gln); + gcf(&gammcf, aa, x, &gln); return gammcf; } diff --git a/rng.h b/rng.h index 66f958e..3df21ad 100644 --- a/rng.h +++ b/rng.h @@ -1,5 +1,5 @@ // ============================================================================= -/* rng.cpp RNG - random number generators +/* rng.cpp RNG - random number generators PMC 14-jun-2005 PMC 10-jul-2005 @@ -14,12 +14,12 @@ RNG 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 + 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 RNG; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ // ============================================================================= @@ -34,9 +34,9 @@ typedef unsigned long long uint64; // ----------------------------------------------------------------------------- void initEnt(bool binmode); -void addEnt(unsigned char *buf, int buflen); -void endEnt(double *r_ent, double *r_chisq, double *r_mean, - double *r_montepicalc, double *r_scc); +void addEnt(unsigned char * buf, int buflen); +void endEnt(double * r_ent, double * r_chisq, double * r_mean, + double * r_montepicalc, double * r_scc); void prtEnt(double r_chisq, double r_mean, double r_montepicalc, double r_scc); @@ -46,12 +46,12 @@ void prtEnt(double r_chisq, double r_mean, enum eRNG { - eRNG_QD1 = 0, // 'Quick and dirty' LCG - eRNG_MT = 1, // Mersenne Twister MT19937_02 (default) - eRNG_MTHR = 2, // 'Mother of all RNG' (Marsaglia) - eRNG_WELL = 3, // WELL1024a, single seed with run-in + eRNG_QD1 = 0, // 'Quick and dirty' LCG + eRNG_MT = 1, // Mersenne Twister MT19937_02 (default) + eRNG_MTHR = 2, // 'Mother of all RNG' (Marsaglia) + eRNG_WELL = 3, // WELL1024a, single seed with run-in - eRNG_COUNT = 4 + eRNG_COUNT = 4 }; // enum eRNG // ----------------------------------------------------------------------------- @@ -73,23 +73,23 @@ enum eRNG // // The acronym WELL means 'Well Equidistributed Long-period Linear' // The generator WELL1024a has been modified to: -// - initialize with a single seed -// - generate equidistributed initial values -// - run for 50,000 numbers to escape from the initial setup +// - initialize with a single seed +// - generate equidistributed initial values +// - run for 50,000 numbers to escape from the initial setup // // The generators mt/mthr are initialized from a single seed using a WELL. // // Speed (relative elapsed time for 10,000,000 numbers) -// qd1 1.00 -// mt 1.25 -// mthr 1.90 -// well 1.41 +// qd1 1.00 +// mt 1.25 +// mthr 1.90 +// well 1.41 // // ----------------------------------------------------------------------------- -extern const char *pszRNGGen[eRNG_COUNT]; -extern const char *pszRNGGenList; -extern const char *pszRNGGenDefault; +extern const char * pszRNGGen[eRNG_COUNT]; +extern const char * pszRNGGenList; +extern const char * pszRNGGenDefault; enum eRNG const eRNGGenDefault = eRNG_MT; // ----------------------------------------------------------------------------- @@ -108,47 +108,51 @@ class cRNG_MT19937; class cRNG { public: - virtual ~cRNG() - { } - - // set seed - virtual void set(unsigned int useed) = 0; - - // generator name - virtual char *getszRandom() = 0; - - // next random number - virtual unsigned int random() = 0; - - // return random unsigned int, where 0 <= unsigned int < uirange - virtual unsigned int randomUint(unsigned int urange); - - // creates an instance of cRNG, - // specifying either eRNG or a string identifier pszrng, - // if pszgen incorrectly specified creates a cRNG_MT - // - // erng pszrng - // --------- -------- - // eRNG_QD1 "qd1" - // eRNG_MT "mt" - // eRNG_MTHR "mthr" - // eRNG_WELL "well" - // - // note: the object must be deleted after use - - static cRNG *createRNG(eRNG erng, unsigned int useed); - static cRNG *createRNG(char *pszrng, unsigned int useed); - - enum eRNG getRNG() - { return RNG;} - - const char *getpszGen() - { return (const char*)szGen;} + virtual ~cRNG() + { } + + // set seed + virtual void set(unsigned int useed) = 0; + + // generator name + virtual char * getszRandom() = 0; + + // next random number + virtual unsigned int random() = 0; + + // return random unsigned int, where 0 <= unsigned int < uirange + virtual unsigned int randomUint(unsigned int urange); + + // creates an instance of cRNG, + // specifying either eRNG or a string identifier pszrng, + // if pszgen incorrectly specified creates a cRNG_MT + // + // erng pszrng + // --------- -------- + // eRNG_QD1 "qd1" + // eRNG_MT "mt" + // eRNG_MTHR "mthr" + // eRNG_WELL "well" + // + // note: the object must be deleted after use + + static cRNG * createRNG(eRNG erng, unsigned int useed); + static cRNG * createRNG(char * pszrng, unsigned int useed); + + enum eRNG getRNG() + { + return RNG; + } + + const char * getpszGen() + { + return static_cast(szGen); + } protected: - eRNG RNG; - char szGen[16]; - unsigned int uSeed; + eRNG RNG; + char szGen[16]; + unsigned int uSeed; }; // cRNG // ----------------------------------------------------------------------------- @@ -156,22 +160,28 @@ class cRNG class cRNG_QD1 : public cRNG { public: - cRNG_QD1(unsigned int useed=0) - { set(useed);} + cRNG_QD1(unsigned int useed = 0) + { + set(useed); + } - // set - virtual void set(unsigned int useed); + // set + virtual void set(unsigned int useed); - // generator name - virtual char *getszRandom() - { return "QD1";} + // generator name + virtual char * getszRandom() + { + return strdup("QD1"); + } - // next random number + // next random number virtual - unsigned int random(); + unsigned int random(); - unsigned int getSeed() - { return uSeed;} + unsigned int getSeed() + { + return uSeed; + } protected: @@ -181,22 +191,26 @@ class cRNG_QD1 : public cRNG class cRNG_WELL : public cRNG { public: - cRNG_WELL(unsigned int useed=0) - { set(useed);} + cRNG_WELL(unsigned int useed = 0) + { + set(useed); + } - // set - virtual void set(unsigned int useed); + // set + virtual void set(unsigned int useed); - // generator name - virtual char *getszRandom() - { return "WELL1024u";} + // generator name + virtual char * getszRandom() + { + return strdup("WELL1024u"); + } - // next random number + // next random number virtual - unsigned int random(); + unsigned int random(); protected: - unsigned int state_i, STATE[32], z0, z1, z2; + unsigned int state_i, STATE[32], z0, z1, z2; }; // cRNG_WELL // ----------------------------------------------------------------------------- @@ -204,23 +218,27 @@ class cRNG_WELL : public cRNG class cRNG_Mother : public cRNG { public: - cRNG_Mother(unsigned int useed=0) - { set(useed);} + cRNG_Mother(unsigned int useed = 0) + { + set(useed); + } - // set - virtual void set(unsigned int useed); + // set + virtual void set(unsigned int useed); - // generator name - virtual char *getszRandom() - { return "Mother";} + // generator name + virtual char * getszRandom() + { + return strdup("Mother"); + } - // next random number + // next random number virtual - unsigned int random(); + unsigned int random(); protected: - unsigned int smthr[4]; - uint64 xm4, xm3, xm2, xm1, mcarry; + unsigned int smthr[4]; + uint64 xm4, xm3, xm2, xm1, mcarry; }; // cRNG_Mother // ----------------------------------------------------------------------------- @@ -228,26 +246,30 @@ class cRNG_Mother : public cRNG class cRNG_MT19937 : public cRNG { public: - cRNG_MT19937(unsigned int useed=0) - { set(useed);} + cRNG_MT19937(unsigned int useed = 0) + { + set(useed); + } - // set - virtual void set(unsigned int useed); + // set + virtual void set(unsigned int useed); - // generator name - virtual char *getszRandom() - { return "MT19937";} + // generator name + virtual char * getszRandom() + { + return strdup("MT19937"); + } - // next random number + // next random number virtual - unsigned int random(); + unsigned int random(); protected: - unsigned int mti, U[624]; - unsigned long mag01[2]; + unsigned int mti, U[624]; + unsigned long mag01[2]; - void initBySeed(unsigned int useed); - void initByArray(unsigned int lenkey, unsigned int key[]); + void initBySeed(unsigned int useed); + void initByArray(unsigned int lenkey, unsigned int key[]); }; // cRNG_MT19937 diff --git a/timer.cpp b/timer.cpp index c632dd7..c21fabf 100644 --- a/timer.cpp +++ b/timer.cpp @@ -1,165 +1,174 @@ -/* ************************************************************************** - timer.cpp timer for C/C++ programs - 20-Jun-2006 PMC gettimeofday() not available on MingW, - changed this to pure elapsed time only, - to accomodate MingW and timing problems - on Windoze - - Copyright 2003-2006 P.M.Cronje - - This file is part of the Double Dummer Driver (DDD). - - DDD 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. - - DDD 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 DDD; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - ************************************************************************** */ - -#include -#include -#include -#include -#include -#include - -#include "timer.h" - -// ***************************************************************************** -// timer workaround for Windoze, -// must define _WIN32 for compilation -// ***************************************************************************** - -#if defined(_WIN32) - -typedef struct sFileTime -{ - unsigned int dwLowDateTime; - unsigned int dwHighDateTime; -}; - -extern "C" -{ - void _stdcall GetSystemTimeAsFileTime(struct sFileTime *pft); -} -void gettimeofday(struct timeval* p, void* pv); - -void gettimeofday(struct timeval* p, void* pv) -{ - union - { - long long ns100; // time since 1 Jan 1601 in 100ns units - struct sFileTime ft; - - } now; - - GetSystemTimeAsFileTime(&(now.ft)); - - p->tv_usec = (int)((now.ns100 / 10LL) % 1000000LL); - p->tv_sec = (int)((now.ns100 - (116444736000000000LL))/10000000LL); - -} - -#endif - -// ***************************************************************************** -// cTimer -// ***************************************************************************** - -cTimer::cTimer() -{ - bStarted = false; - - dElapsed = prevdElapsed = deltaElapsed = 0.0; - -} // cTimer::cTimer -// ***************************************************************************** - -cTimer::~cTimer() -{ - stop(); - -} // cTimer::~cTimer -// ***************************************************************************** - -void cTimer::check() -{ - // find elapsed statistics - - if(bStarted) - { - getTimerInfo(&dElapsed); - - deltaElapsed = dElapsed - prevdElapsed; - prevdElapsed = dElapsed; - - dElapsed -= dElapsed0; - } - else - start(); - -} // cTimer::check -// ***************************************************************************** - -void cTimer::getFormattedTime(char sztime[32]) -{ - // DD-MON-YYYY HH:MM:SS - - time_t timeval; - struct tm *ptm; - - // find the current date and time - time(&timeval); - ptm = localtime(&timeval); - strftime(sztime,21,"%d-%b-%Y %H:%M:%S",ptm); - -} // cTimer::getFormattedTime -// ***************************************************************************** - -void cTimer::getTimerInfo(double *pdelapsed) -{ - struct timeval tv; - - // elapsed - gettimeofday(&tv,0); - *pdelapsed = (double)tv.tv_sec + 0.000001 * (double)tv.tv_usec; - if(*pdelapsed < 0.000001) - *pdelapsed = 0.000001; - -} // cTimer::getTimerInfo -// ***************************************************************************** - -void cTimer::start() -{ - getTimerInfo(&dElapsed0); - - dElapsed = dElapsed0; - - prevdElapsed = dElapsed; - deltaElapsed = 0.0; - - bStarted = true; - -} // cTimer::start -// ***************************************************************************** - -void cTimer::stop() -{ - if(bStarted) - { - check(); - bStarted = false; - } - -} // cTimer::stop -// ***************************************************************************** - +/* ************************************************************************** + timer.cpp timer for C/C++ programs + 20-Jun-2006 PMC gettimeofday() not available on MingW, + changed this to pure elapsed time only, + to accomodate MingW and timing problems + on Windoze + + Copyright 2003-2006 P.M.Cronje + + This file is part of the Double Dummer Driver (DDD). + + DDD 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. + + DDD 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 DDD; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + ************************************************************************** */ + +#include +#include +#include +#include +#include + +#include "portab_DDD.h" +#include "timer.h" + +// ***************************************************************************** +// timer workaround for Windoze, +// must define _WIN32 for compilation +// ***************************************************************************** + +#if defined(_WIN32) + +struct sFileTime +{ + unsigned int dwLowDateTime; + unsigned int dwHighDateTime; +}; + +#ifdef _MSC_VER +struct timeval +{ + long tv_sec, tv_usec; +}; +#endif + +extern "C" +{ + void _stdcall GetSystemTimeAsFileTime(struct sFileTime *pft); +} +void gettimeofday(struct timeval* p, void* pv); + +void gettimeofday(struct timeval* p, void* pv) +{ + union + { + long long ns100; // time since 1 Jan 1601 in 100ns units + struct sFileTime ft; + + } now; + + GetSystemTimeAsFileTime(&(now.ft)); + + p->tv_usec = static_cast((now.ns100 / 10LL) % 1000000LL); + p->tv_sec = static_cast((now.ns100 - (116444736000000000LL))/10000000LL); + UNUSED(pv); + +} + +#endif + +// ***************************************************************************** +// cTimer +// ***************************************************************************** + +cTimer::cTimer() +{ + bStarted = false; + + dElapsed = prevdElapsed = deltaElapsed = 0.0; + +} // cTimer::cTimer +// ***************************************************************************** + +cTimer::~cTimer() +{ + stop(); + +} // cTimer::~cTimer +// ***************************************************************************** + +void cTimer::check() +{ + // find elapsed statistics + + if(bStarted) + { + getTimerInfo(&dElapsed); + + deltaElapsed = dElapsed - prevdElapsed; + prevdElapsed = dElapsed; + + dElapsed -= dElapsed0; + } + else + start(); + +} // cTimer::check +// ***************************************************************************** + +void cTimer::getFormattedTime(char sztime[32]) +{ + // DD-MON-YYYY HH:MM:SS + + time_t timeval; + struct tm *ptm; + + // find the current date and time + time(&timeval); + ptm = localtime(&timeval); + strftime(sztime,21,"%d-%b-%Y %H:%M:%S",ptm); + +} // cTimer::getFormattedTime +// ***************************************************************************** + +void cTimer::getTimerInfo(double *pdelapsed) +{ + struct timeval tv; + + // elapsed + gettimeofday(&tv,0); + *pdelapsed = static_cast(tv.tv_sec) + + 0.000001 * static_cast(tv.tv_usec); + if(*pdelapsed < 0.000001) + *pdelapsed = 0.000001; + +} // cTimer::getTimerInfo +// ***************************************************************************** + +void cTimer::start() +{ + getTimerInfo(&dElapsed0); + + dElapsed = dElapsed0; + + prevdElapsed = dElapsed; + deltaElapsed = 0.0; + + bStarted = true; + +} // cTimer::start +// ***************************************************************************** + +void cTimer::stop() +{ + if(bStarted) + { + check(); + bStarted = false; + } + +} // cTimer::stop +// ***************************************************************************** + diff --git a/timer.h b/timer.h index efaccdb..781644f 100644 --- a/timer.h +++ b/timer.h @@ -1,103 +1,110 @@ -/* ************************************************************************** - timer.h timer for C/C++ programs - 20-Jun-2006 PMC gettimeofday() not available on MingW, - changed this to pure elapsed time only, - to accomodate MingW and timing problems - on Windoze - - Copyright 2003-2006 P.M.Cronje - - This file is part of the Double Dummer Driver (DDD). - - DDD 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. - - DDD 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 DDD; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - ************************************************************************** */ - -#ifndef TIMER_H -#define TIMER_H - -// ----------------------------------------------------------------------------- -// Timer - elapsed seconds -// ----------------------------------------------------------------------------- - -class cTimer -{ - public: - // constructor - // sets elapsed variables to 0 - cTimer(); - - // destructor - ~cTimer(); - - // current date/time 'dd-mon-yyyy hh:mm:ss' - // - static void getFormattedTime(char sztime[32]); - - // start() - // - // sets start point of variables, - // sets elapsed variables to 0 - // - void start(); - - // check(...) - // - // if started - // gets elapsed time since start() or previous check() - // if not started - // calls start() - // - // may be called any number of times after start() - // - void check(); - - // stats available only after check()/stop() - // - double dblElapsed() { return dElapsed;} - double dblElapsed(double dmin) - { return (dElapsed