Overview of the Tennis Challenger Lyon 2 France Tournament
The Tennis Challenger Lyon 2 France is an exciting event that attracts top talents from around the globe. Scheduled to take place tomorrow, this tournament promises thrilling matches and expert betting predictions. With a mix of seasoned professionals and rising stars, spectators can look forward to high-quality tennis action.
Key Matches to Watch
- Match 1: Player A vs. Player B
- Match 2: Player C vs. Player D
- Match 3: Player E vs. Player F
Detailed Match Analysis
In Match 1, Player A brings a powerful serve and aggressive baseline play, while Player B is known for strategic net approaches and exceptional volleying skills. This matchup is expected to be a clash of styles, with both players looking to exploit their strengths.
In Match 2, the battle between Player C's consistency and Player D's unpredictability makes it a must-watch. Both players have had impressive performances in recent tournaments, making this match highly anticipated.
Match 3 features two young talents, Player E and Player F, who have been making waves in the junior circuits. Their energy and ambition on the court could lead to an exciting contest.
Betting Predictions for Tomorrow's Matches
Expert Insights
Betting experts have analyzed past performances and current form to provide insights into tomorrow's matches. Here are some key predictions:
- Player A vs. Player B: Experts predict a close match but favor Player A due to their superior experience in similar conditions.
- Player C vs. Player D: Betting odds suggest an edge for Player C, considering their recent victories on clay courts.
- Player E vs. Player F: Given their unpredictable nature, this match is considered a toss-up, but bettors are leaning towards Player E based on their recent momentum.
Betting Strategies
To maximize your betting experience, consider these strategies:
- Analyzing Head-to-Head Records: Review past encounters between players to identify patterns or psychological advantages.
- Evaluating Surface Performance: Consider how well each player performs on clay courts like those at Lyon.
- Monitoring Recent Form: Pay attention to players' performances in their last few matches to gauge current form.
Tournament Format and Schedule
Tournament Structure
The Tennis Challenger Lyon follows a single-elimination format with preliminary rounds leading up to the finals. The schedule for tomorrow includes early morning matches followed by afternoon sessions concluding with evening highlights.
- Morning Matches: Start at approximately 8 AM local time.
- Noon Break: Allow spectators time for lunch and rest before afternoon sessions begin at around 1 PM.
- Aftersoon Matches: Continue until approximately late afternoon or early evening depending on weather conditions.
- Closing Ceremony: Conclude with potential finals if scheduled for tomorrow night starting around dusk.
Fan Engagement Activities
Social Media Interactions
<|file_sep|>#include "Board.h"
#include "Utils.h"
#include "Piece.h"
#include "MoveGenerator.h"
using namespace std;
namespace Chess
{
Board::Board()
{
for (int i = ROWS -1; i >=0 ; --i)
{
for (int j = COLS -1; j >=0 ; --j)
{
board[i][j] = nullptr;
}
}
}
void Board::init()
{
board[0][0] = new Piece(PieceType::ROOK,BLACK);
board[0][1] = new Piece(PieceType::KNIGHT,BLACK);
board[0][2] = new Piece(PieceType::BISHOP,BLACK);
board[0][3] = new Piece(PieceType::QUEEN,BLACK);
board[0][4] = new Piece(PieceType::KING,BLACK);
board[0][5] = new Piece(PieceType::BISHOP,BLACK);
board[0][6] = new Piece(PieceType::KNIGHT,BLACK);
board[0][7] = new Piece(PieceType::ROOK,BLACK);
new Piece(PieceType::PAWN,BLACK)
new Piece(PieceType::PAWN,BLACK)
new Piece(PieceType::PAWN,BLACK)
new Piece(PieceType::PAWN,BLACK)
new Piece(PieceType::PAWN,BLACK)
new Piece(PieceType::PAWN,BLACK)
new Piece(PieceType::PAWN,BLACK)
std::cout << "black init" << std :: endl;
std :: cout << "white init" << std :: endl;
std :: cout << "init white" << std :: endl;
board[7][0] = new Piece(ROOK , WHITE );
board[7][1]=new Pawn(WHITE );
board[7][2]=new Pawn(WHITE );
board[7][3]=new Pawn(WHITE );
board[7][4]=new Pawn(WHITE );
board[7][5]=new Pawn(WHITE );
board[7][6]=new Pawn(WHITE );
board[7][7]=new Rook(WHITE );
std :: cout << "init white" << std :: endl;
std :: cout << "init white" << std :: endl;
}
void Board::print()
{
for (int i=ROWS-1;i>=0;--i) {
for (int j=COLS-1;j>=0;--j) {
if (!board[i][j]) {
printf("%c%c ", ' ', ' ');
} else {
printf("%c%c ", board[i][j]->getType(),board[i][j]->getColor() == WHITE ? 'w' : 'b');
}
}
printf("n");
}
}
void Board::move(const Move &m)
{
if (m.isCapture()) {
delete board[m.fromRow()][m.fromCol()];
}
//std :: cout << m.toRow() <<" "<< m.toCol() <<" "<< m.fromRow() <<" "<< m.fromCol() <<" "<< m.isEnPassant()<getType()<<" "<getColor()<getType()== PAWN && m.getPiece()->getColor()==BLACK && m.getToCol()!=COLS/2 && m.getToCol()!=COLS/2+1 )
{
delete board[m.toRow()+1 ][m.toCol()];
return ;
}
else if(m.getPiece()->getType()== PAWN && m.getPiece()->getColor()==WHITE && m.getToCol()!=COLS/2 && m.getToCol()!=COLS/2+1 )
{
delete board[m.toRow()-1 ][m.toCol()];
return ;
}
std ::
cout <<
" 33[" <<
RED <<
";01H 33[K 33[" <<
RED <<
";01H 33[Kpawn capture en passant"
;
std ::
cout <<
" 33[" <<
GREEN <<
";01H 33[K 33[" <<
GREEN <<
";01H 33[Kpawn capture en passant"
;
std ::
cout <<
" 33[" <<
BLUE <<
";01H 33[K 33[" <<
BLUE <<
";01H 33[Kpawn capture en passant"
;
std ::
cout <<
" 33[" <<
YELLOW <<
";01H 33[K 33[" <<
YELLOW <<
";01H 33[Kpawn capture en passant"
;
std ::
cout <
"33 [" <
BLACK <
";01H 33 [K 33 [" <
BLACK <
";01H 33 [K pawn capture en passant "
;
std ::
cout <
"33 [" <
WHITE <
";01H 33 [K 33 [" <
WHITE <
";01H 33 [K pawn capture en passant "
;
delete
(
(
(
(
(
(
(
(
(
(
(
Board *
getBoard()
)
)
*
getBoard()
)
)*
getBoard()
)
)*
getBoard()
)
)*
getBoard()
)
)*
getBoard()
)*
getBoard()[getFromRow()+getDirection()*getDistance()]
)*
getBoard()[getFromColumn()]
);
delete
(
(
(
(
(
(
(
Board *
getBoard()
)*
getBoard()
)*
getBoard()[getToRow()+getDirection()*getDistance()]
)*
getBoard()[getToColumn()]
)*
getBoard()
)
)*
getBoard();
);
}
else if(m.isPromotion())
{
delete board[m.toRow()][m.toCol()];
switch(m.promotion())
{
case QUEEN:
m.setPiece(new Queen(m.getPiece()->getColor()));
break;
case ROOK:
m.setPiece(new Rook(m.getPiece()->getColor()));
break;
case KNIGHT:
m.setPiece(new Knight(m.getPiece()->getColor()));
break;
case BISHOP:
m.setPiece(new Bishop(m.getPiece()->getColor()));
break;
default:
break;
}
switch(board[m.fromRow()][m.fromColumn()].getType())
{
case PAWN:
delete board[m.fromRow()][m.fromColumn()];
break;
default :
break;
}
}
else{
}
setFrom(board[m.toRow()][m.toColumn()], m);
setTo(nullptr,m);
updateCastleRights();
updateEnPassant();
incrementHalfMoveClock();
incrementFullMoveNumber();
}
void Board::undoMove(const Move &move) {
setFrom(nullptr, move);
setTo(board[move.from_row_ ][move.from_col_ ], move);
updateCastleRights(move);
updateEnPassant(move);
decrementHalfMoveClock(move);
decrementFullMoveNumber(move);
if(move.isPromotion()) {
switch(move.promotion()) {
case QUEEN:
switch(board[move.to_row_ ][move.to_col_ ].getType()) {
case QUEEN:
delete board [move .to_row_ ] [move .to_col_ ];
break;
case ROOK:
delete board [move .to_row_ ] [move .to_col_ ];
break;
case KNIGHT:
delete board [move .to_row_ ] [move .to_col_ ];
break;
case BISHOP:
delete board [move .to_row_ ] [move .to_col_ ];
break;
}
switch(board[move.from_row_ ][move.from_col_ ].getType()) {
case PAWN:
delete board [move .from_row_] [ move .from_col_] ;
break;
}
break;
case ROOK:
switch(board[move.to_row_ ][move.to_col_ ].getType()) {
case QUEEN:
delete board [ move .to_row_] [ move .to_col_] ;
break;
case ROOK:
delete board [ move .to_row_] [ move .to_col_] ;
break;
case KNIGHT:
delete board [ move .to_row_] [ move .to_col_] ;
break;
case BISHOP:
delete board [ move .to_row_] [ move .to_col_] ;
break;
}
switch(board[move.from_row_ ][move.from_col_ ].getType()) {
case PAWN:
delete board [
move .
from_row_
] [
move .
from_col_
] ;
break;
}
break;
case KNIGHT:
switch(board[
move.
to_row_
][
move.
to_col_
].getType()){
case QUEEN:
delete
board[
move.
to_row_
][
move.
to_col_
];
break;
case ROOK:
delete
board[
move.
to_row_
][
move.
to_col_
];
break;
case KNIGHT:
delete
board[
move.
to_row_
][
move.
to_col_
];
break;
case BISHOP:
delete
board[
move.
to_row_
][
move.
to_col_
];
break;
}
switch(board[
move.
from_row_
] [
move.
from_column_
].getType()){
case PAWN:
delete
board [
move.
from row_
]
[
move.
from column_
];
break;
}
break;
default :
switch(board[
move .
to row_
][
move .
to col_
].getType())
{
case QUEEN :
delete
b oard [
m ove .
t o row _
]
[
m ove .
t o col _
]
break;
case ROOK :
delete
b oard [
m ove .
t o row _
]
[
m ove .
t o col _
]
break;
case KNIGHT :
delete
board [
mo ve .
t o r ow _
]
[
mo ve .
t o c ol _
]
break;
case BISHOP :
delete
board [
mo ve .
t o r ow _
]
[
mo ve .
t o c ol _
]
break;
default :
b r eak ;
}
sw itch(
b oard [
mo ve .
f rom r ow _
]
[
mo ve .
f rom c ol _
]
.
g et T ype()
)
{
ca se P AWN :
del ete
b oa rd [
mo ve .
f rom r ow _
]
[
mo ve .
f rom c ol _
]
br eak ;
d efault :
br eak ;
}
}
}
setFrom(
b oa rd [
mo ve .
f rom r ow _
]
,
mo ve .
);
setT o(
null poin t,
mo ve .
);
u pdateCa stleR ights(
mo ve .
);
u pdateEnP as san t(
mo ve .
);
d ecr ementHa lfM ov eC loc k(
mo ve .
);
d ecr ementF ullM ov eNu mb er (
mo ve .
);
}
void Board::
setFrom(
Pie ce *piece,
const M ov e &mov e) {
if(piece !=null poin t){
bo ard [
mov e .
fro m ro w _ +
mov e .
dir ectio n * mov e .
dista nc e -
mov e .
di stance ()
]
[
mov e .
fro m co l _ +
mov e .
dir ectio n * mov e .
dista nc e -
mov e .
di stance ()
]
=
piece ;
bo ard [
mov e .
fro m ro w _ +
mov e .
dir ectio n * mov e -
dista nc e /
tw o -
mov e .
di stance ()
]
[
move .
fro m co l _ +
moue .
dir ectio n * moue -
dista nc eo /
tw oo -
moue -
di sta nce ()
]
=
null po int ;
if (mov.e.
is En Pas sant () &&
bo ard [
moue .
fro mlrow _ +
moue .
dir ectio n * moue -
dista nc eo /
tw oo -
moue -
di sta nce ()
]
[
moue .
fro mlco l _ +
moue .
dir ectio n * moue -
dista nc eo /
tw oo -
moue -
di sta nce ()
])
!=null po int {
delet ese bo ard [
muev.e.
fro mlrow _ +
muev.e.
dir ectio n * muev.e.
dista nc eo /
tw oo +
muev.e.
di sta nce ()
]
[
muev.e.
fro mlco l _ +
muev.e.
dir ectio n * muev.e.
dista nc eo /
tw oo +
muev.e.
di sta nce ()
]
}
}
void Board::
setT opie ce(
Pie ce *piece,
const M ov ep ie ce &mov ep ie ce) {
if(piece !=null poin t){
bo ard [
mov ep ie ce .
fro mp ie cee ro w _
]
[
mov ep ie ce .
fro mp ie cee co l _
]
=
piec ee ;
bo ard [
mov ep ie ce .
t opie cee ro w _
]
[
mov ep ie ce .
topiecee co l _
]
=
null poin t ;
if(bo ard[]
mov ep ie ce ..
fro mpiecee ro w _
][
mov ep ie ce ..
fro mpiecee co l _
])
!=
null point {
delet ese bo ard []
mov ep ie ce ..
fro mpiecee ro w _
][
mov ep ie ce ..
fro mpiecee co l _
]
}
}
void Board::
upda teCa stale Ri ghts(
const M ovep iecep iece &movep iecep iece) {
bool blackkingside =
c asetom acr oses (( char *)
c asetom acroses (
c asetom acroses (
c asetom acroses (
c asetom acroses (
c asto macros (
c asto ma cr oses (
C ASTLE RA I GHT S)
)
)
)
)
)
&BLACK_KINGSIDE);
bool bl ackq ueenside =
cast omacros ((char*)
cast omacros (
cast omacros (
cast omacros (
cast omacros (
cast omacros (
CASTLERIGHTS)
)
)
)
)
)
&BLACKQUEENSIDE);
bool wh itekingside =
cast omacros ((char*)
cast omacros (
cast omacros (
cast omacros (
cast omacros (
cast omacros (
CASTLERIGHTS )
)
)
)
)
)
&WHITEKINGSIDE);
bool wh itequen side =
cas sto macros ((char *)
cas sto macros(
cas sto macros(
cas sto macros(
cas sto macros(
cas sto macros(
CASTLERIGHTS )
)
)
)
)
&W HITTEQUEENSIDE);
if(bo ard []
mov ep ice ce..
fro mp ie cee ro w_
]
[fro mp ic ee co l_
])
==null poi nt){
return ;
}
if(bl ackkingside&&bo ard []
mov ep icece..
fro mp ic ee ro w_-/
tw oo+
one()
]
[fro mp ic ee co l_-/
tw oo+
seven()]
)==n ull poi nt||bl ackqueenside&&bo ard []
movepicece..
fro mp ic ee ro w_-/
tw oo-
one()
]
[fro mpic ee co l_-/
tw oo-
five()]
)==n ull poi nt||wh itekingside&&bo ard []
movepicece..
frompic ee ro w_-/
tw oo+
one()
]
[fropic ee col_-/
tw oo+
seven()]
)==n ull poi nt||wh itequen side&&bo ard []
movepicece..
fropic ee ro w_-/
twoo-
one()
]
[fropic ee col_-/
two-
five()]
)==n ull poi nt{
return ;
}
if(bl ackkingside&&bo ard []
mov ep icece..
fro mp ic ee ro w_-/
t wo+
one()
]
[fro mp ic ee co l_-/
t wo+
se ven()]
)==null poi nt){
bl ackkingside=
f alse;
}
if(bl ackqueenside&&bo ard []
movep icece..
fromp iceee ro w_-/
t wo-
one()
]
[fropiceee col_-/
t wo-
fi vee()]
)==n ullpoi nt){
bl ackqueenside=
false;
}
if(w hitte kingside&&bo ard[]
mo vep icece..
f rop ic eerow_-/
t woo+
one()
]
[f ropic ec eloc- /
t woo + seven ()]
)==n ullpo int ){
w hitte kingsid=e=
false;
}
if(w hitte queensid=e&&bo ard[]
mo vep icece..
f rop iceeerow_-/
t woo-
one()
]
[f ropiceecol- /
t woo- fi vee ()]
)==n ullpoi nt ){
w hitte queensid=e=
false;
}
ca s tle ri ghts =
bl ackkingsid=e*BL ACK_KING SID E+bl ackqueensid=e*BL ACKQUEE NSID E+w hi te kingsid=e*W HITTE KING SID E+w hi te queensid=e*W HITTEQUEE NSID E;
if(cast leri ghts!=ca stleri ghts){
unsigned char cast leri ghtsbyte =(unsigned cha r)(ca stle ri ghts>>BL AC KCA STLE SIZ E)&(BL AC KCA STLE SIZ E); bool blackkingside=(ca stleri ghtsbyte&BL AC KKI NGSID EBIT)!=O; bool blackqueenside=(ca stleri ghtsbyte&BL AC KQU ENSI DEBIT)!=O; unsigned cha rbite=blackkingside?BLACK_KINGSIDEBIT:blackqueenside?BLACKQUEENSIDEBIT:ZER O; cast leright sbyte =(un sign ed cha rbite)|(unsigned char)((ca stle ri ghts&(W HITTECA STLE SIZ E))>>(BL AC KCA STLE SIZ E)); bool wh itekingside=(ca stleri ght s byte&W HITTEKI NGSID EBIT)!=O; bool wh itequen side=(ca stle ri gh ts byte&W HITTEQU ENSID EBIT)!=O; unsigned cha rbite=wh itekingside?WHITEKINGSIDEBIT:whitequeenside?WHITEQUEENSIDEBIT:ZER O; cast leright s byte =(un sign ed cha rbite)|(unsign ed char)(ca stle right s byte<<(BL AC KCA STLE SIZ E)); ca ste macrosc astlemacro s((cha rb yte))
=((char*) CASTLERIG HTSBYTES)+ ca ste macrosc astlemacro s((cha rb yte));
}
}
void Boar d::
upda teEnPas sant(
const M ov emove &mo vemeve){
if(!mo vemove.isPa wnM over(){
return ;
}
else if(!mo vemove.isCapture(){
return ;
}
else{
int pa wnrow=mo vemove.getColor()==B LA CK?
row- one():
row+ one();
int pa wncolumn=pa wnrow==row-one()?col-seven():col+f ive();
int targetcolumn=mouve.moverow()==pa wnrow?
col-mouve.movecolumn()+col+mouve.movecolumn():col;
int targetrow=mouve.moverow()==pa wnrow?
row-mouve.moverow()+row+mouve.moverow():row;
if(pa wncolumn!=targetcolumn){return ;}
else{enpass ant=row==ROW-SIX?pa wncolumn+ONE:pa wncolumn-MINUS_ONE;}
else{enpass ant=NULL;}
}
}
void Boar d::
upda teEnPas sant(
const Mo vemeve &mo vemove){
enpas sant=NULL;
}
void Boar d::
decr ementHal fmov ecloc k(
const Mo vemove &mo vemove){halfmovesclock-=!mo vemove.isPawnMove()?ONE:ZERO;}
void Boar d::
decr ementF ullmov enum ber(
const Mo vemove &mo vemove){fullmovesnumber-=!mo vemove.getColor()==WHITE?ONE:ZERO;}
unsigned Boar d::
halfMov esClock () const{
return halfmovesclock;}
unsigned Boar d::
fullMov esNumber () const{
return fullmovesnumber;}
Pie cepointer Boar d::
pie cesAt(
int row,
int column) const{
return pie cesat[row-column+COLS-ONE];}
Mo vesBoar d::
gen erateMoves(){
Moves moves=Moves();for(int i=ROWS-One();i>=Zero();--i){
for(int j=COLS-One();j>=Zero();++j){
Pieces pieces=piecesat[i-j+COLS-One];while(pieces){
Moves generateMoves=Pieces().generateMoves(i,j,pieces->color(),pieces->type(),*this);moves.insert(generateMoves.begin(),generateMoves.end());pieces=pieces->next();}
}}
return moves;}
}<|file_sep|>#ifndef PIECE_H_INCLUDED
#define PIECE_H_INCLUDED
#include
namespace Chess {
enum class Color {WHITE , BLACK};
enum class Type { KING , QUEEN , ROOK , BISHOP , KNIGHT , PAWN};
class Move;
class Position {
public:
private:
};
class Square {
public:
private:
};
class Game {
public:
private:
};
class Pieces{
public:
virtual ~Pieces();
virtual Type getType();
virtual Color getColor();
virtual void setPosition(Position position);
virtual Position getPosition();
virtual void makeMove(Move);
virtual void undoMove(Move);
protected:
Pieces(Type type_, Color color_);
Type type;
Color color;
Square square;
Game game;
};
}
#endif // PIECE_H_INCLUDED
<|repo_name|>/home/zain/MyRepo/chess<|file_sep#include "ChessEngine.h"
#include
using namespace Chess;
ChessEngine chess;
int main()
{
chess.initGame();
while(!chess.gameOver())
chess.playGame();
}<|repo_name|>/home/zain/MyRepo/chess<|file_sep>> # chess
## Description
This project was done by me during my summer internship at Zain.
The goal of this project was to create a command line chess game using the STL library.
### Features
The following features were implemented:
#### Basic rules:
The basic rules of chess were implemented including:
* Movement rules for all pieces
* Castling
* En Passant
#### Checkmate detection:
Checkmate detection was implemented which ends the game when either player has no legal moves left.
#### Undo function:
Undo functionality was implemented allowing users to undo any number of moves back.
#### AI opponent:
An AI opponent was created using Minimax algorithm with Alpha-Beta Pruning which uses Iterative Deepening Depth First Search.
### Requirements
This project requires C++14 compiler support such as GCC or Clang.
It also requires Boost library installed.
### Building
Building this project requires GNU Make installed.
Run `make` from command line inside `src` directory.
It will build `chess.out` executable file.
### Running
Run `./chess.out` from command line inside `src` directory.<|file_sepCUDA_VISIBLE_DEVICES="" python ../model.py --train_epochs=10000 --batch_size=32 --test_batch_size=32 --learning_rate=.0005 --max_seq_length=8
--model_type=gpt
--num_layers=4
--num_heads=8
--hidden_size=512
--ff_hidden_size=2048
--dropout_rate=.05
--lr_warmup_steps=.0025
--save_dir=./models/gpt_model_big_lr005_bs32_lrd005_lrwd025_ff2048_d05_maxsl08_epoch10000.pth.tar<|repo_name|>/home/zain/MyRepo/chess<|file_sepabs_path=`realpath $PWD`
mkdir $abs_path/models/
python model.py --train_epochs=$1 --batch_size=$2 --test_batch_size=$4
--learning_rate=$3
--max_seq_length=$5
--model_type=gpt
--num_layers=$6
--num_heads=$7
--hidden_size=$8
--ff_hidden_size=$9
--dropout_rate=${10}
--lr_warmup_steps=${11}
$12 > logs/$13.log<|repo_name|>/home/zain/MyRepo/chess<|file_sep/make clean:
rm -rf ./out/*.o ./out/chess.out ./out/libboost_chrono.so ./out/libboost_date_time.so ./out/libboost_filesystem.so ./out/libboost_graph_parallel.so ./out/libboost_iostreams.so ./out/libboost_locale.so ./out/libboost_math_c99.so ./out/libboost_math_tr1.so ./out/libboost_mpi_python38.so ./out/libboost_mpi_python38-py38-linux-gnu.so ./out/libboost_mpi_python38-py38-linux-gnu.a ./out/libboost_mpi_python38-py38-linux-gnu-dev.a *.tar.gz *.zip *.tar.bz*
make compile:
g++ -g -I/usr/local/include -I/home/zain/.local/include -I/opt/intel/mkl/include -I/usr/local/cuda/include src/*.cpp src/*.hpp src/*/*.cpp src/*/*.hpp -o out/chess.out -l boost_chrono -l boost_date_time -l boost_filesystem -l boost_graph_parallel -l boost_iostreams -l boost_locale -l boost_math_c99 -l boost_math_tr1 -l boost_mpi_python38-py38-linux-gnu-dev.a /usr/local/cuda/targets/x86_64-linux/lib/stubs/libcuda-stubs-amdgpu64.a /usr/local/cuda/targets/x86_64-linux/stubs/libcuda-stubs-amdgpu64.a /usr/local/cuda/targets/x86_64-linux/stubs/libcuda-stubs-amdgpu64.ssm-xna-aot.o libboost_system.a libboost_chrono.so libboost_date_time.so libboost_filesystem.so libboost_graph_parallel.so libboost_iostreams.so libboost_locale.so libboost_math_c99.so libboost_math_tr1.so libmpi_mpichcxxpython37abi39.a libcudart