Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
134 commits
Select commit Hold shift + click to select a range
1be72de
Included boost in SolveBoard, speed unchanged
sorenhein Mar 11, 2018
492587e
Cygwin OpenMP (or no multi-threading) works
sorenhein Mar 11, 2018
91829de
Split out SolveBoard. Works: CL WinAPI/Boost/none, Cygwin g++ OpenMP…
sorenhein Mar 11, 2018
9112031
Now OpenMP works with mingw64 as well
sorenhein Mar 11, 2018
9f7ccd9
Moved Scheduler to atomic int. Several TODOs to delete later
sorenhein Mar 12, 2018
5396853
Intermediate check-in of System, doesn't quite compile for Visual C++
sorenhein Mar 13, 2018
c8a6481
dtest works again, at least for Visual C++ / basic + WinAPI
sorenhein Mar 14, 2018
66897a1
Cygwin works with basic, boost, openmp
sorenhein Mar 14, 2018
181248e
Some cleanup, still only works for cygwin
sorenhein Mar 14, 2018
db92e40
Now Visual C++ with basic, boost, openmp, winapi
sorenhein Mar 15, 2018
567533b
Visual C++ and Cygwin work on PC and laptop for solve, calc and play
sorenhein Mar 15, 2018
f34257e
Moved part of Init to System
sorenhein Mar 16, 2018
27bb150
TimerList, TimerGroup, Timer are now clean and work with Visual C++
sorenhein Mar 17, 2018
d7928d6
Removed Stats
sorenhein Mar 17, 2018
c81f4b8
Update Visual Makefiles
sorenhein Mar 17, 2018
712c022
Scheduler works with new timing code
sorenhein Mar 18, 2018
1f45bfb
Took out some Visual warning, checking on notebook
sorenhein Mar 18, 2018
ea02070
Now warnings work on notebook as well
sorenhein Mar 18, 2018
35417e4
System no longer has InitThreads functions
sorenhein Mar 18, 2018
4ca30e7
System a bit cleaner
sorenhein Mar 18, 2018
fb14924
Clean Makefile for Visual C++
sorenhein Mar 18, 2018
7862d0f
Now Makefile_Cygwin works for all threading systems
sorenhein Mar 18, 2018
91d662f
Can't easily get mingw to work
sorenhein Mar 18, 2018
6835b13
Now also does STL threading
sorenhein Mar 18, 2018
c5fc69a
Added PPL to Visual and Cygwin Makefiles
sorenhein Mar 18, 2018
5c5aaa8
Works on Linux
sorenhein Mar 18, 2018
51179df
Temp files
sorenhein Mar 18, 2018
dc0484c
Now does Mac clang and g++ as well
sorenhein Mar 21, 2018
bd500de
mingw works, but not yet pretty
sorenhein Mar 21, 2018
46bac58
Cleaner src Makefiles
sorenhein Mar 22, 2018
1153b92
Better timers in dtest (a start, at least)
sorenhein Mar 22, 2018
d4dc32d
test Makefiles for cygwin and Visual are now cleaner
sorenhein Mar 22, 2018
8c98191
Drafted Makefiles for linux and Mac (dtest), added cores field to DDS…
sorenhein Mar 22, 2018
7eaf573
Small scheduler change
sorenhein Mar 23, 2018
88a6309
Changed the Register functions in Scheduler
sorenhein Mar 24, 2018
ec6b04f
Global variable noOfThreads now limited to Init.cpp
sorenhein Mar 24, 2018
608fdd9
Starting to pull thrId out of ABsearch.cpp
sorenhein Mar 24, 2018
2184bc4
One less thrId in ABsearch
sorenhein Mar 24, 2018
62e9c69
More on thrId
sorenhein Mar 24, 2018
bf7729e
More thrp
sorenhein Mar 24, 2018
7057911
Pushed thrId as far as reasonable
sorenhein Mar 24, 2018
148037a
Introduced Memory.cpp, not yet connected to anything
sorenhein Mar 24, 2018
56c9586
Seems to work with new Memory.cpp class
sorenhein Mar 24, 2018
d22c93e
Combined the run modes into a dds.h enum
sorenhein Mar 24, 2018
42d936a
More cleanup
sorenhein Mar 24, 2018
002385f
More cleanup
sorenhein Mar 24, 2018
c667548
Bye-bye threadmem.h
sorenhein Mar 24, 2018
724e691
Added TBB (in principle, doesn't work on my systems)
sorenhein Mar 25, 2018
64e1418
Cleanup, mostly of include files
sorenhein Mar 25, 2018
1b0df9b
MAXNOOFTHREADS is now gone, thread number is dynamic
sorenhein Mar 25, 2018
39fd933
Cleanup of calls
sorenhein Mar 25, 2018
34c6905
Made SolverIF more C++ like
sorenhein Mar 25, 2018
1e8e6fe
PlayAnalyser more C++ like
sorenhein Mar 25, 2018
ec76f0d
Had broken the DDS_DEBUG_ALL flag
sorenhein Mar 25, 2018
20fd8d8
Fixed small scheduler bug
sorenhein Mar 25, 2018
00ac5b7
Changed Moves function headers
sorenhein Mar 25, 2018
1e6c08a
More interfacing
sorenhein Mar 25, 2018
798b724
More Moves cleanup
sorenhein Mar 25, 2018
9a364fb
Starting on QuickTricks
sorenhein Mar 25, 2018
69a26c5
QT cleaner now
sorenhein Mar 25, 2018
98837a8
Scheduler consts
sorenhein Mar 25, 2018
f7eed3e
Small checkin
sorenhein Mar 25, 2018
d453d56
Intermediate changes to ABstats
sorenhein Mar 25, 2018
a89be38
Another intermediate step
sorenhein Mar 25, 2018
2c0fdda
Further step
sorenhein Mar 25, 2018
6c3d59b
Further step
sorenhein Mar 25, 2018
b1a1625
Further step
sorenhein Mar 25, 2018
c1a46b9
Cleanup
sorenhein Mar 25, 2018
ac9f419
Deletions
sorenhein Mar 25, 2018
7280f7d
Update Visual Makefiles
sorenhein Mar 26, 2018
6ce8510
parallel for_each for STL now works for Solve at least
sorenhein Mar 27, 2018
e2b075f
Now also Play
sorenhein Mar 27, 2018
36b95da
Moved some code to CalcTables. Bizarre play bug?
sorenhein Mar 27, 2018
22c721f
Calc runs with STLIMPL as well (still Play buglet)
sorenhein Mar 27, 2018
0880d60
Seems to work
sorenhein Mar 27, 2018
ec1a73f
Added PPL, but segfaults non-deterministically
sorenhein Mar 27, 2018
e9f8830
Makefiles
sorenhein Mar 27, 2018
6a45719
Made parallel.h
sorenhein Mar 28, 2018
21307d4
Competing push, does this work?
sorenhein Mar 28, 2018
9ff33d5
Merge branch 'windows_boost' of https://github.com/sorenhein/dds into…
sorenhein Mar 28, 2018
5bd4f7c
Cleanup
sorenhein Mar 28, 2018
f4f29b2
Working on ABstats
sorenhein Mar 29, 2018
5094d49
Done with ABstats
sorenhein Mar 29, 2018
93aa60f
Moved code to new dump.cpp
sorenhein Mar 29, 2018
46953b3
Starting on dump.cpp, now slow (too many open/close?)
sorenhein Mar 29, 2018
aee865e
Got rid of RankToText (used PrintDeal)
sorenhein Mar 29, 2018
8f3b000
Refactoring dump.cpp
sorenhein Mar 29, 2018
7ce299c
More refactoring
sorenhein Mar 29, 2018
842c866
More refactoring
sorenhein Mar 30, 2018
04348e2
Added a small File class
sorenhein Mar 30, 2018
4a63ae6
Cleanup
sorenhein Mar 30, 2018
144f1c7
More cleanup
sorenhein Mar 30, 2018
d7c267e
Moved macros from debug to Scheduler
sorenhein Mar 30, 2018
8020024
More cleanup
sorenhein Mar 30, 2018
f7c4340
Cleanup
sorenhein Mar 30, 2018
e6b4284
Worked on Moves debug output
sorenhein Mar 30, 2018
3782866
Done with Moves
sorenhein Mar 30, 2018
0a3ba63
Cleanup
sorenhein Mar 30, 2018
78d3f02
TransTable small option was broken
sorenhein Mar 30, 2018
70e2bdf
TransTable S and L now separate
sorenhein Mar 31, 2018
a6607a6
memory.transTable is now a pointer to either table type
sorenhein Mar 31, 2018
ab1dc23
Added bit size and thread size to info output
sorenhein Mar 31, 2018
309d8d7
Dynamic selection of TT works
sorenhein Mar 31, 2018
672bff8
Cleanup
sorenhein Mar 31, 2018
daa0dcb
TransTableL output fixed
sorenhein Mar 31, 2018
a386cf9
Fixed debug output of TransTableS
sorenhein Mar 31, 2018
ad049eb
Worked on DealerPar
sorenhein Apr 1, 2018
d4d564b
Used C++ instead of own Min, Max macros
sorenhein Apr 1, 2018
60f2b72
Fixed some rare too-short plays in the reference data
sorenhein Apr 1, 2018
3d9a594
Fixed doc typo (CallAllTables) and signed/unsigned char reliance bug …
sorenhein Apr 1, 2018
110c024
Documentation weakness (score == -2) fixed
sorenhein Apr 1, 2018
1ac7086
Cleanup, fewer TODOs
sorenhein Apr 1, 2018
224a56f
Removed throw's in Par.cpp (not permitted in DLL)
sorenhein Apr 1, 2018
54e3db5
Typo in return code
sorenhein Apr 1, 2018
375c26a
Started to update some documentation, moved to 2.9.0
sorenhein Apr 1, 2018
e4d15fa
Updated documentation
sorenhein Apr 1, 2018
f7a3d37
Removed testStats
sorenhein Apr 1, 2018
ac0b1e8
Added args.cpp and .h to dtest
sorenhein Apr 1, 2018
6c64e5c
Split testcommon.cpp part off into parse.cpp
sorenhein Apr 2, 2018
f89cd68
New C++ parse seems to work
sorenhein Apr 2, 2018
315ee1c
Now does GIB as well
sorenhein Apr 2, 2018
f63dbd7
Split out compare.cpp
sorenhein Apr 2, 2018
298aa8f
Split out print.cpp
sorenhein Apr 2, 2018
86a1caa
Moved set_constants to print.cpp
sorenhein Apr 2, 2018
752545e
Split out loop.cpp
sorenhein Apr 2, 2018
c624096
Test program more or less done
sorenhein Apr 2, 2018
5be8568
Now Visual and Cygwin work (dtest and itest)
sorenhein Apr 2, 2018
d54f2d0
Works on mings (dtest and itest)
sorenhein Apr 2, 2018
5ec1910
Small doc updates
sorenhein Apr 2, 2018
47a474b
Might now work with Visual C++, cygwin, mingw, Linux, Mac (clang/g++)…
sorenhein Apr 2, 2018
af8c984
Added ThreadMgr and fixed bug in STLIMPL/PPLIMPL (static int)
sorenhein May 22, 2018
d2466cb
Limited IMPL threads to number of cores
sorenhein May 22, 2018
3fc1a75
Changed documentation to 2.9.0 beta and May 2018
sorenhein May 22, 2018
2b45088
Merge remote-tracking branch 'dds-bridge/develop' into develop
sorenhein May 22, 2018
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -14,3 +14,7 @@ test/itest
*.exe
*.swp
*.bak

*.exp
*.lib
*.res
45 changes: 45 additions & 0 deletions ChangeLog
Original file line number Diff line number Diff line change
@@ -1,3 +1,48 @@
Release Notes DDS 2.9.0 beta
----------------------------
Included code for a number of multi-threading systems:
- Windows API (was already there)
- OpenMP (was already there)
- GCD (new, intended for Mac, not really tested)
- Boost (new, works on many systems, but you may have to install it)
- STL (new, should work on most systems with a modern compiler)
- TBB (new, not so broadly available, but portable in principle)
- STLIMPL (new, experimental)
- PPLIMPL (new, experimental)

Tested combinations include:
- Visual C++ with Windows API, OpenMP, Boost, STL
- Cygwin g++ with Windows API, OpenMP, Boost, STL
- mingw g++ with OpenMP, Boost, STL
- Linux g++ with OpenMP, Boost, STL
- MacOS clang with GCD, Boost, STL (static and shared library)
- MacOS GNU g++ with OpenMP, Boost, STL

The number of threads is now unlimited in principle, although the
DLL will not let you go beyond the number of processor cores.

Enabled the transposition-table code for both the large and the small
versions in the same DLL. Therefore there is only a single DLL
distributed now for both. The SMALL_MEMORY compile switch is gone.

Enabled the DLL to pick the best combination of large and small
transposition tables for a given resource set-up consisting of
available memory and number of threads. Yes, the DLL can choose to
run 4 large and 2 small threads, for example.

Expanded the DDSInfo systemString (which now needs 1024 chars as
stated in the new dll.h).

MAXNOOFTABLES was increased from 32 to 40.

Fixed a reliance that char == signed char (not the case on Android,
which caused a bug).

Dealt with the reported issues on the GitHub issues list.

Lots of clean-up of internal code. The code also looks more like C++.


Release Notes DDS 2.8.4
-----------------------
Added a lower-memory DLL version with a compile flag. This is about
Expand Down
155 changes: 102 additions & 53 deletions INSTALL
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ know what you're doing and you'll figure it out :-).

The first step is to compile the library.

If you have trouble, read the Makefile. They all have the compiler
If you have trouble, read the Makefiles. They all have the compiler
warning levels set rather high, and they are set to fail even on
warnings. You can turn this off. The Visual C++ version also
requires a couple of tools that you may not have, but this too is
Expand All @@ -24,14 +24,14 @@ Generally speaking:
the Makefile, then modify the Makefile.

Once you've tested the source, you'll need the library file, the
dll.h include from the include directory, and possibly other files
dll.h include file from the include directory, and possibly other files
such as dll.lib, depending on the exact system. You don't need
include/portab.h, although you're welcome to use it. The library
files needed are:

Microsoft Visual C++: dds.dll, dds.lib
mingw and cygwin: dds.dll, dds.def
Mac and linux: libdds.a
Mac and linux: libdds.a or libdds.so depending on compilation


General instructions
Expand All @@ -41,88 +41,139 @@ General instructions

2. Copy the right Makefile_... from the Makefiles sub-directory
to the src directory and call it Makefile, see below. (Or use make -f)
So for example "cp Makefiles/Makefile_Visual Makefile".
See "System-specific data" below.

3. If your compiler does not have the name assumed in the Makefile
(see below), modify the Makefile.
3. Check the configuration section and make any changes you need.
- Section (1) has to do with paths for certain multi-threading systems
which you may or may not want/have. If you set a certain compiler
flag, it is your own responsibility that you have the corresponding
threading system available -- otherwise the code will not compile.
- Section (2) sets the threading systems with which you want to compile
the DLL. Note that you can have as many as you like (see below).
- Section (3) has to do with certain debugging flags etc. which you
normally shouldn't set.

4. If you don't have the "windres" and "cvtres" programs,
then you can also manage without. These are just used for
getting version information into the DLL. Delete the corresponding
lines.
3. Check the "Often OK" section, in particular the name of the
compiler you want to use.

5. If you want OpenMP rather than Windows multi-threading for
some reason, find the right place in the Makefile and uncomment
one line and comment the other.
4. If you're on Windows and you don't have the "windres" and
"cvtres" programs, then you can also manage without. These are
just used for getting version information into the DLL. Delete
the corresponding lines.

6. make clean (not necessary if you're starting clean).
6. "make clean" (not necessary if you're starting clean).

7. make depend (ditto).
7. There is a "make depend" target, but DO NOT USE IT. The Makefile
is set up to read the dependencies from Makefiles/depends_*.txt.

8. make (produces dds.dll on Windows, libdds.a on Linux and Mac).
8. "make" (produces dds.dll on Windows, libdds.a or libdds.so on
Linux and Mac).

9. make install (if you want to run tests; this is only a
local install to ../lib, not a system-wide one).
9. "make install" (if you want to run tests; this is only a
local install to ../test and ../examples, not a system-wide one).


System-specific data
====================

Microsoft Visual C++ (Unix-like, so Cygwin and mingw)
Microsoft Visual C++
--------------------
Makefile: Makefile_Visual
Compiler: cl

If you don't have a Cygwin-like set-up with access to commands
such as "cp", see the last lines of that Makefile.

Microsoft Visual C++ (Windows-like, so no "mV", different "make")
--------------------
Makefile: Makefile_Visual_Windows
Compiler: cl


Mingw
-----
Windows Mingw
-------------
Makefile: Makefile_mingw
Compiler: i686-w64-mingw32-g++

32-bit and 64-bit variants for the tdc compiler are available.
Compiler: g++


Cygwin
------
Windows Cygwin
--------------
Makefile: Makefile_cygwin
Compiler: g++


Linux (static library .a)
=====
Makefile: Makefile_linux
-----
Makefile: Makefile_linux_static
Compiler: g++


Linux (dynamic library .ld)
=====
Linux (dynamic library .so)
-----
Makefile: Makefile_linux_shared
Compiler: g++


Apple
=====
Makefile: Makefile_Mac_clang (for clang compiler, single-threaded)
MacOS clang (static library .a)
-----
Makefile: Makefile_Mac_clang_static
Compiler: g++
Supports both OpenMP and GDD multi-threading.

Makefile: Makefile_Mac_gcc (for GNU g++ compiler, multi-threaded)
Makefile: Makefile_Mac_shared (for GNU g++ compiler, multi-threaded)

MacOS clang (shared library .a)
-----
Makefile: Makefile_Mac_clang_static
Compiler: g++


MacOS GNU g++ (static library .a)
-----
Makefile: Makefile_Mac_clang_static
Compiler: gcc-4.9


MacOS GNU g++ (shared library .a)
-----
Makefile: Makefile_Mac_clang_static
Compiler: gcc-4.9


Multi-threading
===============

As of v2.9.0 this works differently. It is possible to have
multiple threading systems in the same library. There is a new
DLL function called SetThreading() to select the one you want,
in case there is more than one. If the DLL is compiled only
single-threaded, that is what you'll get. If there are multiple
options, the DLL will default to the multi-threaded one with the
lowest number (among those compiled in, of course). The numbers
can be found in ../include/dll.h.

It is NOT recommended to use STLIMPL and PPLIMPL as they are today.
You cannot control the number of threads that they will want, nor
the memory that they will consume. But maybe some day...

The others are very equivalent in terms of speed, but you might as
well use STL if you have it, as this is probably the most portable.

If you don't have a C++17 compiler, you will not get STLIMPL or
PPLIMPL.

The *IMPL versions let the system handle threads autonomously
(up to the number of threads set by the user), whereas the others
are handled by DDS internally. The *IMPL version are similar in
speed, except if there is some near-duplication in the input hands
(say, instances of the same distribution played in the same
denomination from different side). The non-IMPL version handle
this more efficiently.


Testing
=======

The step "make install" above should have put the library file
in ../lib.
in ../test.

test
----
In the test directory you can compile the dtest program.
This program tests five main modes of DDS:

* solve, the solution of a hand for a given declarer and strain.
Expand All @@ -135,9 +186,11 @@ The program can use a number of pre-defined input files in the
../hands directory.

To compile the program, you follow the same steps as for the library,
except that you don't do a "make install".
except that you don't do a "make install". So you copy the right
Makefile from Makefiles (e.g. "cp Makefiles/Makefile_Visual Makefile"),
then type "make".

You now have a program called "dtest" or "dtest.exe". Let us
You should now have a program called "dtest" or "dtest.exe". Let us
assume dtest.exe. Let us also assume that your system is set up
in such a way that your path does not include the current working
directory.
Expand All @@ -147,19 +200,15 @@ You can invoke the program as
./dtest.exe

which should just give a brief usage message. If that works, then
you can invoke the program like this:

./dtest.exe file.txt mode [number of threads]

file.txt has to be the name of a file EITHER in the current
directory OR in ../hands. The program checks first in the current
directory. A good starting example is list100.txt.
you can invoke the program like this, for example:

mode has to be one of solve, calc, play, parand dealerpar.
./dtest.exe -f ../hands/list100.txt -s solve -n 4 -m 1000

The number of threads is optional. If it is not supplied, DDS
figures one out itself. If it is supplied, then it is passed to
SetMaxThreads().
SetMaxThreads(). You can also use SetResources() instead of
SetMaxThreads() to set the memory consumption as well. If you use
SetResources(), there is no need to use SetMaxThreads().

Generally speaking, the test program first shows some information
about how it was compiled. Then it shows some ongoing timing
Expand All @@ -179,7 +228,7 @@ minimally to support a multi-threaded DLL. However, it doesn't
use the full capabilities of DDS, as it was written at a time when
functions such as CalcAllTables and SolveAllBoards were not yet
available. Therefore it is rather slow, but it does have a nice
hand generator built in.
hand generator built in. It has not been updated since v2.8.4.


examples
Expand Down
16 changes: 9 additions & 7 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,11 @@ DDS offers a wide range of functions, including par-score calculations.

Please refer to the [home page](http://privat.bahnhof.se/wb758135) for details.

The current version is DDS 2.8.4 released in March 2016 and licensed under the Apache 2.0 license in the LICENSE FILE.
The current version is DDS 2.9.0 beta, released in May 2018 and licensed under the Apache 2.0 license in the LICENSE FILE.

Release notes are in the ChangeLog file.

(c) Bo Haglund 2006-2014, (c) Bo Haglund / Soren Hein 2014-2016.
(c) Bo Haglund 2006-2014, (c) Bo Haglund / Soren Hein 2014-2018.


Credits
Expand All @@ -27,7 +27,7 @@ Foppe Hemminga maintains DDS on ArchLinux. He also contributed a version of the

Pierre Cossard contributed the code for multi-threading on the Mac using GDS.

Soren Hein made a number of contributions before becoming a co-author starting in v2.8 in 2014.
Soren Hein made a number of contributions before becoming a co-author starting with v2.8 in 2014.


Overview
Expand All @@ -52,7 +52,7 @@ Supported systems
=================
The DLLs work out of the box on Windows systems. There is a single-threaded version for old Windows versions, and there is a multi-threaded version that works on all modern Windows systems. This is the one you should use if in doubt.

The Windows versions use the Windows multi-threading. The code compiles on windows (see INSTALL) with at least:
The distributed Windows DLL uses Windows multi-threading. The code compiles on windows (see INSTALL) with at least:

* Visual C++ 2010 Express editions or later.
* The TDM-GCC/Mingw port of g++.
Expand All @@ -73,20 +73,22 @@ The `without-multilib` is important because you won't get OpenMP otherwise, and

Thanks for Pierre Cossard's contribution, the Mac port now also supports GCD multi-threading with LLVM.

There's an example .Net wrapper on https://github.com/anorsich/dds.net (not supported by us).

Usage
=====

DDS tries to figure out the available number of cores and the available memory. Based on this, DDS calculates a reasonable number of threads to use. The user can override this by calling the `SetMaxThreads()` function. In principle SetMaxThreads can be called multiple times, but there is overhead associated with this, so only call it at the beginning of your program unless you really want to change the number of threads dynamically.
DDS tries to figure out the available number of cores and the available memory. Based on this, DDS calculates a reasonable number of threads to use. The user can override this by calling the `SetMaxThreads()` or the `SetResources()` function. In principle these functions can be called multiple times, but there is overhead associated with this, so only call it at the beginning of your program unless you really want to change the number of threads dynamically.

DDS on Windows calls SetMaxThreads itself when it is attached to a process, so you don't have to. On Unix-like systems we use an equivalent mechanism, but we have had a report that this does not always happen in the right order of things, so you may want to call SetMaxThreads explicitly.

Docs
====
The DDS library interface is very well documented. You find the docs, including a Markdown version which you can read online, in the /doc folder.
The DDS library interface is documented. You find the docs, including a Markdown version which you can read online, in the /doc folder. The Markdown version has not been updated since v2.8.4.

Bugs
====
Version 2.8.4 has no known bugs.
Version 2.9.0 beta has no known bugs.

Please report bugs to bo.haglund@bahnhof.se and soren.hein@gmail.com.

4 changes: 2 additions & 2 deletions doc/DLL-dds_x.htm
Original file line number Diff line number Diff line change
Expand Up @@ -7448,7 +7448,7 @@ <h3 style='page-break-after:avoid'><span lang=EN-US style='font-family:"Calibri"
color:black'><o:p>&nbsp;</o:p></span></p>

<p class=MsoNormal style='text-align:justify'><span lang=EN-US
style='font-family:"Calibri",sans-serif;color:black'>CallAllTables calculates the
style='font-family:"Calibri",sans-serif;color:black'>CalcAllTables calculates the
double dummy values of the denomination/declarer hand combinations in </span><b
style='mso-bidi-font-weight:normal'><span lang=EN-US style='font-size:11.0pt;
font-family:"Courier New";color:black'>�*dealsp�</span></b><span lang=EN-US
Expand Down Expand Up @@ -7516,7 +7516,7 @@ <h3 style='page-break-after:avoid'><span lang=EN-US style='font-family:"Calibri"

<p class=MsoNormal style='text-align:justify'><span lang=EN-US
style='font-family:"Calibri",sans-serif;color:black'>The maximum number of DD
tables in a CallAllTables call depends on the number of strains required, see
tables in a CalcAllTables call depends on the number of strains required, see
the following table:<o:p></o:p></span></p>

<p class=MsoNormal style='text-align:justify'><span lang=EN-US
Expand Down
Loading