Spaces:
Running
Running
#! /usr/bin/python | |
"""Copyright 2014 - 2015 Foppe HEMMINGA | |
Licensed under the Apache License, Version 2.0 (the "License"); | |
you may not use this file except in compliance with the License. | |
You may obtain a copy of the License at | |
http://www.apache.org/licenses/LICENSE-2.0 | |
Unless required by applicable law or agreed to in writing, software | |
distributed under the License is distributed on an "AS IS" BASIS, | |
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
See the License for the specific language governing permissions and | |
limitations under the License.""" | |
import os | |
from ctypes import * | |
script_path = os.path.abspath(__file__) | |
# このファイルがあるディレクトリ(つまり 'dds' フォルダ)のパスを取得 | |
script_dir = os.path.dirname(script_path) | |
# 1つ上の階層(プロジェクトルート)にあるはずのdllへのパスを構築 | |
# これにより、実行場所に関わらず、常に正しい場所のdllを探しに行きます。 | |
dll_path = os.path.join(script_dir, "libdds.so") | |
# パスを正規化(例: C:\path\dds\..\dds.dll -> C:\path\dds.dll) | |
dll_path = os.path.normpath(dll_path) | |
dds = cdll.LoadLibrary(dll_path) | |
print("Loaded lib {0}".format(dds)) | |
DDS_VERSION = 20700 | |
DDS_HANDS = 4 | |
DDS_SUITS = 4 | |
DDS_STRAINS = 5 | |
MAXNOOFBOARDS = 200 | |
RETURN_NO_FAULT = 1 | |
class futureTricks(Structure): | |
_fields_ = [ | |
("nodes", c_int), | |
("cards", c_int), | |
("suit", c_int * 13), | |
("rank", c_int * 13), | |
("equals", c_int * 13), | |
("score", c_int * 13), | |
] | |
class deal(Structure): | |
_fields_ = [ | |
("trump", c_int), | |
("first", c_int), | |
("currentTrickSuit", c_int * 3), | |
("currentTrickRank", c_int * 3), | |
("remainCards", c_int * DDS_HANDS * DDS_SUITS), | |
] | |
class dealPBN(Structure): | |
_fields_ = [ | |
("trump", c_int), | |
("first", c_int), | |
("currentTrickSuit", c_int * 3), | |
("currentTrickRank", c_int * 3), | |
("remainCards", c_char * 80), | |
] | |
class boards(Structure): | |
_fields_ = [ | |
("noOfBoards", c_int), | |
("deals", deal * MAXNOOFBOARDS), | |
("target", c_int * MAXNOOFBOARDS), | |
("solutions", c_int * MAXNOOFBOARDS), | |
("mode", c_int * MAXNOOFBOARDS), | |
] | |
class boardsPBN(Structure): | |
_fields_ = [ | |
("noOfBoards", c_int), | |
("deals", dealPBN * MAXNOOFBOARDS), | |
("target", c_int * MAXNOOFBOARDS), | |
("solutions", c_int * MAXNOOFBOARDS), | |
("mode", c_int * MAXNOOFBOARDS), | |
] | |
class solvedBoards(Structure): | |
_fields_ = [ | |
("noOfBoards", c_int), | |
("solvedBoards", futureTricks * MAXNOOFBOARDS), | |
] | |
class ddTableDeal(Structure): | |
_fields_ = [("cards", c_uint * DDS_HANDS * DDS_SUITS)] | |
class ddTableDeals(Structure): | |
_fields_ = [ | |
("noOfTables", c_int), | |
("deals", ddTableDeal * (MAXNOOFBOARDS >> 2)), | |
] | |
class ddTableDealPBN(Structure): | |
_fields_ = [("cards", c_char * 80)] | |
class ddTableDealsPBN(Structure): | |
_fields_ = [ | |
("noOfTables", c_int), | |
("deals", ddTableDealPBN * (MAXNOOFBOARDS >> 2)), | |
] | |
class ddTableResults(Structure): | |
# _fields_ = [("resTable", c_int * DDS_STRAINS * DDS_HANDS)] | |
_fields_ = [("resTable", c_int * DDS_HANDS * DDS_STRAINS)] | |
class ddTablesRes(Structure): | |
_fields_ = [ | |
("noOfBoards", c_int), | |
("results", ddTableResults * (MAXNOOFBOARDS >> 2)), | |
] | |
class parResults(Structure): | |
"""index = 0 is NS view and index = 1 | |
is EW view. By 'view' is here meant | |
which side that starts the bidding.""" | |
_fields_ = [ | |
("parScore", ((c_char * 16) * 2)), | |
("parContractsString", ((c_char * 128) * 2)), | |
] | |
class allParResults(Structure): | |
_fields_ = [("presults", parResults * MAXNOOFBOARDS)] | |
class parResultsDealer(Structure): | |
_fields_ = [ | |
("number", c_int), | |
("score", c_int), | |
("contracts", c_char * 10 * 10), | |
] | |
class contractType(Structure): | |
"""undertricks: 0 = make; 1-13 = sacrifice | |
overTricks: 0-3; e.g. 1 for 4S + 1 | |
level: 1-7 | |
denom: 0 = No Trumps, 1 = trump Spades, 2 = trump Hearts | |
3 = trump Diamonds, 4 = trump Clubs | |
seats: One of the cases N, E, S, W, NS, EW; | |
0 = N, 1 = E, 2 = S, 3 = W, 4 = NS, 5 = EW""" | |
_fields_ = [ | |
("underTricks", c_int), | |
("overTricks", c_int), | |
("level", c_int), | |
("denom", c_int), | |
("seats", c_int), | |
] | |
class parResultsMaster(Structure): | |
"""score: Sign acccording to NS iew | |
number: Number of contracts giving the par score""" | |
_fields_ = [ | |
("score", c_int), | |
("number", c_int), | |
("contracts", contractType * 10), | |
] | |
class parTextResults(Structure): | |
"""parText: Short text for par information, e.g. | |
Par -110: EW 2S EW 2D+1 | |
equal: TRUE in the normal case when it does not matter who | |
starts the bidding. Otherwise, FALSE.""" | |
_fields_ = [("parTextResults", c_char * 2 * 128), ("equal", c_int)] | |
class playTraceBin(Structure): | |
_fields_ = [("number", c_int), ("suit", c_int * 52), ("rank", c_int * 52)] | |
class playTracePBN(Structure): | |
_fields_ = [("number", c_int), ("cards", c_char * 106)] | |
class solvedPlay(Structure): | |
_fields_ = [("number", c_int), ("tricks", c_int * 53)] | |
class playTracesBin(Structure): | |
_fields_ = [ | |
("noOfBoards", c_int), | |
("plays", playTraceBin * (MAXNOOFBOARDS // 10)), | |
] | |
class playTracesPBN(Structure): | |
_fields_ = [ | |
("noOfBoards", c_int), | |
("plays", playTracePBN * (MAXNOOFBOARDS // 10)), | |
] | |
class solvedPlays(Structure): | |
_fields_ = [ | |
("noOfBoards", c_int), | |
("solved", solvedPlay * (MAXNOOFBOARDS // 10)), | |
] | |
SetMaxThreads = dds.SetMaxThreads | |
"""int userThreads""" | |
SetMaxThreads.argtypes = [c_int] | |
SetMaxThreads.restype = None | |
FreeMemory = dds.FreeMemory | |
FreeMemory.argtypes = None | |
FreeMemory.restype = None | |
SolveBoard = dds.SolveBoard | |
"""deal dl | |
int target | |
int solutions | |
int mode, | |
pointer to struct futureTricks * futp | |
int threadIndex""" | |
SolveBoard.argtypes = [deal, c_int, c_int, c_int, POINTER(futureTricks), c_int] | |
SolveBoard.restype = c_int | |
SolveBoardPBN = dds.SolveBoardPBN | |
"""dealPBN dlpbn | |
int target | |
int solutions | |
int mode | |
pointer to struct futureTricks * futp | |
int thrId""" | |
SolveBoardPBN.argtypes = [ | |
dealPBN, | |
c_int, | |
c_int, | |
c_int, | |
POINTER(futureTricks), | |
c_int, | |
] | |
SolveBoardPBN.restype = c_int | |
CalcDDtable = dds.CalcDDtable | |
"""struct ddTableDeal tableDeal | |
pointer to struct ddTableResults * tablep""" | |
CalcDDtable.argtypes = [ddTableDeal, POINTER(ddTableResults)] | |
CalcDDtable.restype = c_int | |
CalcDDtablePBN = dds.CalcDDtablePBN | |
"""srtuct ddTableDealPBN tableDealPBN | |
pointer to struct ddTableResults * tablep""" | |
CalcDDtablePBN.argtypes = [ddTableDealPBN, POINTER(ddTableResults)] | |
CalcDDtablePBN.restype = c_int | |
CalcAllTables = dds.CalcAllTables | |
"""pointer to struct dd TableDeals * dealsp | |
int mode | |
int trumpFilter[DDS_STRAINS] | |
poiter to struct ddTablesRes * resp | |
pointer to struct allParResults'* presp""" | |
CalcAllTables.argtypes = [ | |
POINTER(ddTableDeals), | |
c_int, | |
c_int * DDS_STRAINS, | |
POINTER(ddTablesRes), | |
POINTER(allParResults), | |
] | |
CalcAllTables.restype = c_int | |
CalcAllTablesPBN = dds.CalcAllTablesPBN | |
"""pointer to struct ddTableDealsPBN * dealsp | |
int mode | |
int trumpFilter[DDS_STRINS] | |
pointer to struct ddTablesRes *resp | |
pointer to struct allParResults * presp""" | |
CalcAllTablesPBN.argtypes = [ | |
POINTER(ddTableDealsPBN), | |
c_int, | |
c_int * DDS_STRAINS, | |
POINTER(ddTablesRes), | |
POINTER(allParResults), | |
] | |
CalcAllTablesPBN.restype = c_int | |
SolveAllBoards = dds.SolveAllBoards | |
"""pointer to struct boardsPBN * bop | |
pointer to struct solvedBoards * solvedp""" | |
SolveAllBoards.argtypes = [POINTER(boardsPBN), POINTER(solvedBoards)] | |
SolveAllBoards.restype = c_int | |
SolveAllChunks = dds.SolveAllChunks | |
"""pointer to struct boardsPBN * bop | |
pointer to struct solvedBoards * solvedP | |
int chunkSize""" | |
SolveAllChunks.argtypes = [POINTER(boardsPBN), POINTER(solvedBoards), c_int] | |
SolveAllChunks.restype = c_int | |
solveAllChunksBin = dds.SolveAllChunksBin | |
"""pointer to struct boards * bop | |
pointer to struct solvedBoards * solvedp | |
int chunkSize""" | |
solveAllChunksBin.argtypes = [POINTER(boards), POINTER(solvedBoards), c_int] | |
solveAllChunksBin.restype = c_int | |
solveAllChunksPBN = dds.SolveAllChunksPBN | |
"""pointer to struct boardsPBN * bop | |
pointer to struct solvedBoards * solvedp | |
int chunkSize""" | |
solveAllChunksPBN.argtypes = [POINTER(boardsPBN), POINTER(solvedBoards), c_int] | |
solveAllChunksPBN.restype = c_int | |
SolveAllChunksPBN = dds.SolveAllChunksPBN | |
"""pointer to struct boardsPBN * bop | |
pointer to struct solvedBoards * solvedp | |
int chunkSize""" | |
SolveAllChunksPBN.argtypes = [POINTER(boardsPBN), POINTER(solvedBoards), c_int] | |
SolveAllChunksPBN.restype = c_int | |
Par = dds.Par | |
"""pointer to struct ddTableResults * tablep | |
pointer to struct parResults * presp | |
int vulnerable""" | |
Par.argtypes = [POINTER(ddTableResults), POINTER(parResults), c_int] | |
Par.restype = c_int | |
CalcPar = dds.CalcPar | |
"""struct ddTableDeal | |
int ulnerable | |
pointer to struct ddTablesRes * tablep | |
pointer to parResults * presp""" | |
CalcPar.argtypes = [ | |
ddTableDeal, | |
c_int, | |
POINTER(ddTableResults), | |
POINTER(parResults), | |
] | |
CalcPar.restype = c_int | |
CalcPar = dds.CalcPar | |
"""struct ddTableDeal tableDeal | |
int vulnerable | |
pointer to struct ddTableResults * tablep | |
pointer to parResults * presp""" | |
CalcPar.argtypes = [ | |
ddTableDeal, | |
c_int, | |
POINTER(ddTableResults), | |
POINTER(parResults), | |
] | |
CalcPar.restype = c_int | |
CalcParPBN = dds.CalcParPBN | |
"""struct ddTableDealPBN tableDealPBN | |
pointer tostruct ddTableResults * tablep | |
int vulnerable | |
pointer to struct parResults * presp""" | |
CalcParPBN.argtypes = [ | |
ddTableDealPBN, | |
POINTER(ddTableResults), | |
c_int, | |
POINTER(parResults), | |
] | |
CalcParPBN.restype = c_int | |
SidesPar = dds.SidesPar | |
"""pointer to struct ddTableResults * tablep, | |
array struct parResultsDealer sidesRes[2], | |
int vulnerable""" | |
SidesPar.argtypes = [POINTER(ddTableResults), parResultsDealer * 2, c_int] | |
SidesPar.restypes = c_int | |
DealerPar = dds.DealerPar | |
"""pointer to struct ddTableResults * tablep | |
pointer to struct parResultsDealer * presp | |
int dealer | |
int vulnerable""" | |
DealerPar.argtypes = [ | |
POINTER(ddTableResults), | |
POINTER(parResultsDealer), | |
c_int, | |
c_int, | |
] | |
DealerPar.restype = c_int | |
DealerParBin = dds.DealerParBin | |
"""pointer to struct ddTableResults * tablep | |
pointer to struct parResultsMaster * presp | |
int dealer | |
int vulnerable""" | |
DealerParBin.argtypes = [ | |
POINTER(ddTableResults), | |
POINTER(parResultsMaster), | |
c_int, | |
c_int, | |
] | |
DealerParBin.restype = c_int | |
SidesParBin = dds.SidesParBin | |
"""pointer to struct ddTableResults * tablep | |
array struct parResultsMaster sidesRes[2] | |
int vulnerable""" | |
SidesParBin.argtypes = [POINTER(ddTableResults), parResultsMaster * 2, c_int] | |
SidesParBin.restype = c_int | |
ConvertToDealerTextFormat = dds.ConvertToDealerTextFormat | |
"""pointer to struct parResultsMaster *pres | |
pointer to char *resp""" | |
ConvertToDealerTextFormat.argtypes = [POINTER(parResultsMaster), c_char_p] | |
ConvertToDealerTextFormat.restype = c_int | |
ConvertToSidesTextFormat = dds.ConvertToSidesTextFormat | |
"""pointer to struct parResultsMaster * pres, | |
pointer to struct parTextResults * resp""" | |
ConvertToSidesTextFormat.argtypes = [ | |
POINTER(parResultsMaster), | |
POINTER(parTextResults), | |
] | |
ConvertToSidesTextFormat.restype = c_int | |
AnalysePlayBin = dds.AnalysePlayBin | |
"""struct deal dl | |
struct playTraceBin play | |
pointer to struct solvedPlay * solved | |
int thrId""" | |
AnalysePlayBin.argtypes = [deal, playTraceBin, POINTER(solvedPlay), c_int] | |
AnalysePlayBin.restype = c_int | |
AnalysePlayPBN = dds.AnalysePlayPBN | |
"""struct dealPBN dlPBN | |
struct playTracePBN playPBN | |
pointer to struct solvedPlay * solvedp | |
int thrId""" | |
AnalysePlayPBN.argtypes = [dealPBN, playTracePBN, POINTER(solvedPlay), c_int] | |
AnalysePlayPBN.restype = c_int | |
AnalyseAllPlaysBin = dds.AnalyseAllPlaysBin | |
"""pointer to struct boards * bop | |
pointer to struct playTracesBin * plp | |
pointer to struct solvedPlays * solvedp | |
int chunkSize""" | |
AnalyseAllPlaysBin.argtypes = [ | |
POINTER(boards), | |
POINTER(playTracesBin), | |
POINTER(solvedPlays), | |
c_int, | |
] | |
AnalyseAllPlaysBin.restype = c_int | |
AnalyseAllPlaysPBN = dds.AnalyseAllPlaysPBN | |
"""pointer to struct boardsPBN * bopPBN | |
pointer to struct playTracesPBN * plpPBN | |
pointer to struct solvedPlays * solvedp | |
int chunkSize""" | |
AnalyseAllPlaysPBN.argtypes = [ | |
POINTER(boardsPBN), | |
POINTER(playTracesPBN), | |
POINTER(solvedPlays), | |
c_int, | |
] | |
AnalyseAllPlaysPBN.restype = c_int | |
ErrorMessage = dds.ErrorMessage | |
"""int code | |
char * 80""" | |
ErrorMessage.argtypes = [c_int, POINTER(c_char)] | |
ErrorMessage.restype = c_int | |