Voir les contributions

Cette section vous permet de consulter les contributions (messages, sujets et fichiers joints) d'un utilisateur. Vous ne pourrez voir que les contributions des zones auxquelles vous avez accès.


Messages - Cujo

Pages: [1] 2 3 ... 12
1
Par contre les differents canaux ne changent rien, c'est les differentes AP qui font des perfs differentes. Pt'etre eventuellement si tout est open tu peux retrouver de la fiente avec plusieurs AP sur le mm canal. J'ai souvenir d'un TP en mobility IPv6 ou on avait constaté ce genre de fiente avant de passer en WEP...

2


transmission ou deluge sur arch


Combien de slot de connexion au total et par torrent ? Tu fais surement tilter le routeur, surtout si t'es en WIFI ca doit pas aider à la stabilité de la ligne...

3
Je suis en train de reecrire tout mon code §§

Pour rendre ma fonction d'évaluation plus facile d'accès en prévision de l'important saut en complexité que je vais lui infliger je viens de pondre ce squelette :|

[cpp]// Evaluation of material and piece-square tables
int lazy_eval(Pieces& pieces) {
   int score = 0;
   for (pieces.iterator = pieces.begin(); pieces.iterator != pieces.end(); pieces.iterator++) {
      Piece* ptr_piece = pieces.get_ptr_piece();
      score += ptr_piece->get_value() + eval_bonus_position(ptr_piece);
   }
   return score;
}

class Evaluation {
   // Evaluation object initialization
   int nb_pieces_type[6] = {0};
   int nb_rooks_file[8] = {0};
   int nb_rooks_rank[8] = {0};
   int nb_pawns_file[8] = {0};
   Pieces& pieces;


   // Building pieces statistics for better evaluation
   void Evaluation::build(Board& board) {
      for (pieces.iterator = pieces.begin(); pieces.iterator != pieces.end(); pieces.iterator++) {
         Piece* ptr_piece = pieces.get_ptr_piece();
         PieceType type = ptr_piece->get-type();
         ++nb_pieces_type[type];
         if (type == ROOK) {
            Square position = ptr_piece->get_position();
            ++nb_rooks_file[board.get_file(position)];
            ++nb_rooks_rank[board.get_rank(position)];
         }
         else if (type == PAWN) {
            Square position = ptr_piece->get_position();
            ++nb_pawns_file[board.get_file(position)];
         }         
      }
   }
   
   int king_eval(Board& board) {
      int score = 0;
      // King Safety in the middlegame
      // Centralization in the endgame
      // Penalty for standing on a wing with no pawns present in the endgame
      // Pins/xrays
      // Castling Rights
      return score;
   }
   
   int queens_eval(Board& board) {
      int score = 0;
      // Penality for early developpement
      return score;
   }
   int rooks_eval(Board& board) {
      int score = 0;
      // Increasing value as pawns disappear
      // Rook on open file
      // Rook on seventh (possibly also eigth) rank
      // Rook behind Passed Pawn
      // Penalty for a Rook blocked by an uncastled King
      return score;
   }
   int bishops_eval(Board& board) {
      int score = 0;
      // Bishop pair
      // Bad Bishop
      // Color Weakness
      // Fianchetto
      // Returning Bishop
      // Bishop trapped by enemy pawns on A2/H2/A7/H7 or on A3/H3/A6/H6
      return score;
   }
   int knights_eval(Board& board) {
      int score = 0;
      // Decreasing value as pawns disappear
      // Outposts
      // Knight trapped on A8/H8/A7/H7 or A1/H1/A2/H2
      // Penalty for blocking a "c" pawn in closed openings
      // (Crafty defines it as follows: white knight on c3, white pawns on c2 and d4, no white pawn on e4)
      // When calculating knight mobility, it is advisable to omit squares controlled by enemy pawns
      return score;
   }
   int pawns_eval(Board& board) {
      int score = 0;
      // Pawn Structure
      // Pawn Center
      // penalty for "d" and "e" pawns blocked on their initial squares
      return score;
   }
}



// Main
int eval(Board& board, Pieces& engine_pieces, Pieces& opponent_pieces) {
   int score = 0;
   
   // Lazy eval
   score += lazy_eval(engine_pieces);
   score -= lazy_eval(opponent_pieces);
   if (score > alpha) return score;
   
   // Build stats   
   Evaluation engine(engine_pieces), opponent(opponent_pieces);
   engine.build(board);
   opponent.build(board);
   
   // Draw eval
   if (is_draw(board, engine, opponent)
   
   // Pieces eval
   score += engine.king_eval(board);
   score -= opponent.king_eval(board);
   
   score += engine.queens_eval(board);
   score -= opponent.queens_eval(board);
   
   score += engine.rooks_eval(board);
   score -= opponent.rooks_eval(board);
   
   score += engine.bishops_eval(board);
   score -= opponent.bishops_eval(board);
   
   score += engine.knights_eval(board);
   score -= opponent.knights_eval(board);
   
   score += engine.pawns_eval(board);
   score -= opponent.pawns_eval(board);
   
   return score;
}[/cpp]

4
Apres avoir lurké deux fonctions magiques en hexa pour calculer les distances et directions entre deux cases je viens de pondre ca :

[cpp]Pieces is_attacked_by(Square s, Color c) {
   Pieces attackers;
   Pieces opponent_pieces = board.get_pieces(c);
   for (Piece p = opponent_pieces.first(); p != opponent_pieces.last(); ++p) {
      Square position = p->get_position();
      MoveDirection direction = board.get_direction(position, s);
      int distance = board.get_distance(p->get_position(), s);
      switch (direction) { // Si la case s est atteignable depuis la position de la piece
         case UP:
         case DOWN:
         case LEFT:
         case RIGHT:
            if (p->get_type() == QUEEN || p->get_type() == ROOK) {
               if (distance == 1) {
                  attackers.add(p);
                  break;
               }
               else {
                  // C'est un slider, il faut boucler
                  // pour voir si qlq chose ne s'interpose pas
                  while (position != s) {
                     position = Square(position + direction);
                     if (board.get_ptr_piece()) {
                        break;
                     }
                  }
                  // Si rien ne s'est interposé on l'ajoute
                  attackers.add(p);
                  break;
               }
            }
            break;
         case UP_LEFT:
         case UP_RIGHT:
            if (distance == 1 && c == WHITE && p->get_type() == PAWN) {
               attackers.add(p);
               break;
            }
         case DOWN_RIGHT:
         case DOWN_LEFT:
            if (distance == 1 && c == BLACK && p->get_type() == PAWN) {
               attackers.add(p);
               break;
            }
            else if (p->get_type() == QUEEN || p->get_type() == BISHOP) {
               if (distance == 1) {
                  attackers.add(p);
                  break;
               }
               else {
                  // C'est un slider, il faut boucler
                  // pour voir si qlq chose ne s'interpose pas
                  while (position != s) {
                     position = Square(position + direction);
                     if (board.get_ptr_piece()) {
                        break;
                     }
                  }
                  // Si rien ne s'est interposé on l'ajoute
                  attackers.add(p);
                  break;
               }
            }
            break;
         case UP_UP_RIGHT:
         case RIGHT_UP_RIGHT:
         case RIGHT_DOWN_RIGHT:
         case DOWN_DOWN_RIGHT:
         case DOWN_DOWN_LEFT:
         case LEFT_DOWN_LEFT:
         case LEFT_UP_LEFT:
         case UP_UP_LEFT:
            if (distance == 2 p->get_type() == BISHOP) {
               attackers.add(p);
               break;
            }
            break;
      }
   return attackers;
}[/cpp]

Destiné à avoir la liste des pieces d'une couleur attaquant une case... Utile par exemple pour savoir si le roi est échec mais aussi pour bien plus de chose !

En gros je pars d'une liste des pieces adverses et je regarde si elles peuvent attaquer la case.

Avant je partais de la case et suivait l'échiquier pour voir qui pouvait m'attaquer... Normalement la version que je viens de pondre devrait etre plus perf... A voir. En tout cas c'est plus simple je trouve mm s'il manque un ou deux trucs. Ca remplace ca :

[cpp]Pieces is_attacked_by(Board& b, Square s, Color c) {
   Pieces pieces;
   Piece* ptr_piece = 0;
   Square to;

   // Search for knights attacking s
   for (int i = 0; i < NB_KNIGHT_MOVES; ++i) {
      to = Square(s + KNIGHT_MOVES);
      if (!b.is_off_the_board(to)) {
         ptr_piece = b.get_ptr_piece(to);
         if (ptr_piece && ptr_piece->get_type() == KNIGHT && ptr_piece->get_color() == c) {
            //cout << *ptr_piece << " in " << hex << to << " is attacking " << hex << s << "! ";
            pieces.insert(*ptr_piece, BACK);
         }
      }         
   }
   
   // Search for others pieces attackings s
   for (int i = 0; i < NB_QUEEN_MOVES; ++i) {
      MoveOrientation offset = QUEEN_MOVES;
      to = Square(s + offset);
      if (!b.is_off_the_board(to)) {
         ptr_piece = b.get_ptr_piece(to);
         
         if (ptr_piece && ptr_piece->get_color() == c) {
            // Pawn's attack
            if (ptr_piece->get_type() == PAWN && (
               (c == BLACK && (offset == UP_LEFT || offset == UP_RIGHT)) ||
               (c == WHITE && (offset == DOWN_LEFT || offset == DOWN_RIGHT))
               )) {
               //cout << *ptr_piece << " in " << hex << to << " is attacking " << hex << s << "! ";
               pieces.insert(*ptr_piece, BACK);
            }
            
            // Rook's attack
            else if (ptr_piece->get_type() == ROOK && (
               b.get_rank(s) == b.get_rank(to) || b.get_file(s) == b.get_file(to)
               )) {
               //cout << *ptr_piece << " in " << hex << to << " is attacking " << hex << s << "! ";
               pieces.insert(*ptr_piece, BACK);
            }
            
            // Bishop's attack
            else if (ptr_piece->get_type() == BISHOP && (
                  b.get_rank(s) != b.get_rank(to) && b.get_file(s) != b.get_file(to)
                  )) {
               //cout << *ptr_piece << " in " << hex << to << " is attacking " << hex << s << "! ";
               pieces.insert(*ptr_piece, BACK);
            }
            
            // Queen's or king's attack
            else if (ptr_piece->get_type() == QUEEN || ptr_piece->get_type() == KING) {
               //cout << *ptr_piece << " in " << hex << to << " is attacking " << hex << s << "! ";
               pieces.insert(*ptr_piece, BACK);
            }
         }
         else {
            while (!ptr_piece && !b.is_off_the_board(Square(to + offset))) {
               to = Square(to + offset);
               ptr_piece = b.get_ptr_piece(to);
            }
            ptr_piece = b.get_ptr_piece(to);
            if (ptr_piece && ptr_piece->get_color() == c) {

               //TODO Weird stuff here, piece's position should be Square to, but sometime it's not.
               if (ptr_piece->get_position() != to) {
                  cout << *ptr_piece << " " << hex << ptr_piece->get_position() << " " << hex << to << endl;
               }

               
               // Rook's attack
               if (ptr_piece->get_type() == ROOK && (
                  b.get_rank(s) == b.get_rank(to) || b.get_file(s) == b.get_file(to)
                  )) {
                  //cout << *ptr_piece << " in " << hex << to << " is attacking " << hex << s << "! ";
                  pieces.insert(*ptr_piece, BACK);
               }
            
               // Bishop's attack
               else if (ptr_piece->get_type() == BISHOP && (
                  b.get_rank(s) != b.get_rank(to) && b.get_file(s) != b.get_file(to)
                  )) {
                  //cout << *ptr_piece << " in " << hex << to << " is attacking " << hex << s << "! ";
                  pieces.insert(*ptr_piece, BACK);
               }
            
               // Queen's attack
               else if (ptr_piece->get_type() == QUEEN) {
                  //cout << *ptr_piece << " in " << hex << to << " is attacking " << hex << s << "! ";
                  pieces.insert(*ptr_piece, BACK);
               }
            }
         }
      }
   }
   return pieces;   
}[/cpp]

5
Ca dit quoi ?

6
Et si je ne répond pas à ta question c'est que je ne sais pas, j'ai pas utilisé xfce depuis 4 ans au moins et je ne l'installerais pas juste pour lurker à ta place comment remettre un dock sur le bureau ! D'autant que moins il y en a et mieux c'est !

7
The more sooner. C'est le signe qu eje dois faire une pause la §§

8
Tient moi aussi je fais des belles paroles !

[cpp]case QUEEN:
               if (board.positions_history.size() < 10 && ptr_piece->get_nb_moves() > 0) {
                  // The more the queen is moved
                  // and the more sooner in the game
                  // the bigger the malus is.
                  score += MALUS_QUEEN_OPENING * (5 - board.positions_history.size() / 2) * ptr_piece->get_nb_moves();
               }
               break;[/cpp]

9
[cpp]int bonus = (color_player == WHITE ? WEAK_PAWN_PCSQ[pawn_position] : WEAK_PAWN_PCSQ[FLIP[pawn_position]]);[/cpp]

Parfois c'est un peu lourd ma facon de coder je trouve :|

10
:D

Sans mon optimisation :
    +---+---+---+---+---+---+---+---+
   8 |-R-|-N-|-B-|-Q-|-K-|-B-|-N-|-R-|
     +---+---+---+---+---+---+---+---+
   7 |-P-|-P-|-P-|-P-|-P-|-P-|-P-|-P-|
     +---+---+---+---+---+---+---+---+
   6 |   | . |   | . |   | . |   | . |
     +---+---+---+---+---+---+---+---+
   5 | . |   | . |   | . |   | . |   |
     +---+---+---+---+---+---+---+---+
   4 |   | . |   | . |   | . |   | . |
     +---+---+---+---+---+---+---+---+
   3 | . |   | . |   | . |   | . |   |
     +---+---+---+---+---+---+---+---+
   2 | P | P | P | P | P | P | P | P |
     +---+---+---+---+---+---+---+---+
   1 | R | N | B | Q | K | B | N | R |
     +---+---+---+---+---+---+---+---+
       a   b   c   d   e   f   g   h  

     depth      time     score     moves
         1         0       -12      1/20  a3 Nc6
         1      0.01       -11      6/20  c4 Nc6
         1      0.01        -5      8/20  d4 Nc6
         1      0.01         0     17/20  Nc3 Nc6
         2      0.01        12      1/20  Nc3 Nc6 Nf3
         3      0.03         0      1/20  Nc3 Nc6 Nf3 Nf6
         4      0.13         5      1/20  Nc3 e5
         4      0.37         6     20/20  Nf3 d5
         5      0.54         7      1/20  Nf3 Nc6 d4 Nf6 Nc3
         6      1.18        -3      1/20  Nf3 Nc6
         6      1.94         0      2/20  Nc3 Nc6 e4
         7      7.76         0      1/20  Nc3 Nc6 a3 Nf6
         8       287         3      1/20  Nc3 d5


287 secondes pour chercher et évaluer 84 998 978 956 positions meme si en fait avec le pruning et les reductions c'est beaucoup moins que ca bien qu'il y ait aussi quelques extensions.

Avec :
    depth      time     score     moves
         1         0       -12      1/20  a3 Nc6
         1         0       -11      6/20  c4 Nc6
         1         0        -5      8/20  d4 Nc6
         1         0         0     17/20  Nc3 Nc6
         2         0        12      1/20  Nc3 Nc6 Nf3
         3      0.02         0      1/20  Nc3 Nc6 Nf3 Nf6
         4      0.09         5      1/20  Nc3 e5
         4      0.28         6     20/20  Nf3 d5
         5      0.38         7      1/20  Nf3 Nc6 d4 Nf6 Nc3
         6      0.77        -3      1/20  Nf3 Nc6
         6      1.19         0      2/20  Nc3 Nc6 e4
         7      4.41         0      1/20  Nc3 Nc6 a3 Nf6
         8       108         3      1/20  Nc3 d5


Soit sur la position de départ un gain de 60% !!

A noter qu'ici on flirte allègrement avec l'impraticabilité du coup la profondeur 8 est toujours inatteignable en pratique... A noter également que sans la somme d'optimisation que j'ai mis dans mon algo (apres lecture de 30 ans de recherche sur le sujet) il faut 16 secs pour atteindre la profondeur 5 contre 0.38 ici ! Et que donc la 6 est impraticable initialement ! Et encore la je suis en C++ alors que mon premier moteur en Java lui n'allait pas plus loin que la profondeur 4 !

Il me reste encore beaucoup de chemin à parcourir... Ca devrait surement m'occuper jusqu'à la fin de ma vie ce truc... Mais déjà pour quelque chose commencé il y a 2 noel de ca et sur seulement 2 mois au total c'est fou l'avancée !

11
Arrete j'ai fait attention à pas utiliser le jargon genre pas parler de quiescence search ni rien !

12
VICTORY IS MINE §§

Je continuais de passer un peu en revue mon code voir ce que je pouvais améliorer facilement... Et en changeant un truc d'une trentaine de lignes répartie un peu partout j'ai pu faire un générateur de capture seule qui est 5x plus rapide que le générateur de mouvement standard. Et comme à la fin de chaque serie de coup que j'analyse si ca se termine par une capture alors je continue à regarder plus loin jusqu'à ce que ce ne soit plus des captures... Ce truc entraine une petite explosion combinatoire qui fait qu'on y passe un max de temps...

Et bien du coup utiliser mon nouveau générateur fait qu'au total mon moteur est 25% plus rapide :| Ca claque pour une si petite modification ! A peine une heure de taf !

13
Bah c'est exactement ca, c'est fait pour les utilisateurs venant du monde windows...

14
source est un array qui doit aussi contenir mon patch, voila qui répond à ma question, je suis près à upper le truc !

15
Ca : # Contributor: *

pkgname=b*o
pkgver=0056
pkgrel=1
pkgdesc="A tool to estimate Elo ratings."
arch=('i686' 'x86_64')
url="http://*/"
license=('GPL')
source=(http://*/$pkgname.tar.bz2)
noextract=()
md5sums=(50e0c6c686a4622209034fd35bd3cba9)

build() {
  cd $srcdir/B*o
  patch -Np1 -i ../../cstdio.patch || return 1
  make || return 1
  install -Dm755 $pkgname $pkgdir/usr/bin/$pkgname
}


Fait ca :

.-(~/chess/b*o)-----------------------------------------------------------------------(*@*)-
`--> makepkg                
==> Création du paquet b*o 0056-1 i686 (mar. déc. 29 20:54:12 CET 2009)
==> Vérification des dépendances...
==> Vérification des dépendances pour la compilation...
==> Récupération des sources...
  -> Téléchargement de b*o.tar.bz2...
--2009-12-29 20:54:13--  http://*.tar.bz2
Résolution de *.fr... 212.27.63.149
Connexion vers *.fr|212.27.63.149|:80...connecté.
requête HTTP transmise, en attente de la réponse...200 OK
Longueur: 35476 (35K) [application/x-tar]
Sauvegarde en : «b*o.tar.bz2.part»

100%[======================================================================>] 35 476      28,9K/s   ds 1,2s    

2009-12-29 20:54:15 (28,9 KB/s) - «b*o.tar.bz2.part» sauvegardé [35476/35476]

==> Validation des fichiers sources avec md5sums...
    b*o.tar.bz2 ... Réussite
==> Extraction des sources...
  -> Extraction de b*o.tar.bz2 avec bsdtar
==> Entre dans l'environnement fakeroot...
==> Début de la compilation...
patching file move.cpp
patching file pgnlex.cpp
g++ -o b*o -O3 -Wall elomain.cpp
==> Nettoyage de l'installation...
  -> Suppression d'autres fichiers...
  -> Compression des man/info pages...
  -> Strip des symboles de débogage dans les binaires et les bibliothèques...
==> Création du paquet...
  -> Génération du fichier .PKGINFO...
  -> Compression du paquet...
==> Quitte l'environnement fakeroot.
==> Création finie: b*lo 0056-1 i686 (mar. déc. 29 20:55:39 CET 2009)


Et ca marche ! Maintenant faut que je vois comment on intègre le patch proprement et si je fais bien tout comme il faut et ensuite je pourrais l'upper ! Grand moment pour moi, depuis le temps que je dois me sortir les doigts du cul pour m'impliquer un peu la dedans :d

16
J'ai fait mon premier package, c'est émouvant ! Il va dl l'archive, applique le patch que j'ai codé, compile et installe le logiciel tout seul !

17
J'ai enlevé les erreurs et les warnings, je mail l'auteur pour lui soumettre le patch et lurke comment devenir le maintainer de ce petit logiciel §§ :D

18
Bon avec la version de GCC d'Arch il faut faire un patch pour que ca passe... Je suis en train de l'écrire :D Ca m'a remotivé de me remettre à coder du C++ :D

19
$ ./b***o
version 0056, Copyright (C) 1997-2007 ***.
compiled Dec 29 2009 13:40:44.
This program comes with ABSOLUTELY NO WARRANTY.
This is free software, and you are welcome to redistribute it
under the terms and conditions of the GNU General Public License.
See http://www.gnu.org/copyleft/gpl.html for details.
ResultSet>readpgn tournament-2009-12-28-0.pgn
144 game(s) loaded, 1 game(s) with unknown result ignored.
ResultSet>elo
ResultSet-EloRating>mm
00:00:00,00
ResultSet-EloRating>exactdist
00:00:00,00              
ResultSet-EloRating>ratings
Rank Name              Elo    +    - games score oppo. draws
   1 Faile 1.4         368   99   92    49   85%   -81   18%
   2 Aldebaran 0.7.0   319   94   90    49   80%   -71   20%
   3 GNU Chess 5.07    302  100   97    45   77%   -60   16%
   4 Kace 0.88        -167  105  107    48   34%    35    6%
   5 Tiffanys         -308  107  111    48   22%    61    6%
   6 Marquis 0.1.6    -513  112  144    49    4%    98    8%

La pour le moment faut que je laisse mon script de tournoi tourner encore un moment pour avoir une mini base de donnée puis je lancerais mon moteur dans l'arène voir ou il se positionnera. Le but étant dans un premier temps d'isoler un bon panel diversifié en niveau de moteur sans bugs.

Par contre je n'ai qu'un core2duo sous la main... Et la il faudrait au strict mini un core i7 860 à tourner pendant une semaine pour obtenir quelque chose de significatif au niveau stat...

Mais à moins de 32 ou 64 cores ca se trainera quoi qu'il arrive... Il faut le plus de core possible pour paralléliser les affrontement et pas n'en faire qu'un ou deux à la fois...

20
Il parcours un fichier pgn de tournoi de moteur d'échec et estime les ELO rating à partir de la méthode bayésienne §§ C'est un logiciel très reconnu dans sa niche §§

21
Je viens de trouver un nouveau petit logiciel non présent dans AUR !! Bon, faut vraiment que je fasse une liste des logiciels que je pourrais maintenir car si je le fais pour moi ca serait con de ne pas le faire pour les autres en même temps !

22
Bah oué !

23
Non mais fiente winamp la derniere fois c'était pas ca du tout !

24
Ya quoi dans la crontab ?

25
Non mais j'exagère à fond, j'avais pas encore pensé jusqu'à cet instant à foutre mon interface en lojban ;miam:

26
Si vraiment elle insiste, un petit tour sur le windows manager Awesome en disposition clavé bépo avec une interface en lojban et hop, plié !

27



Tu lui montres ton pc sous Seven pour lui montrer la réactivité de la chose ou sinon tu lui dis de pas t'appeler la prochaine fois [:spamafote]

:jap:

Je montre mon netbook et ensuite la personne ne m'en reparle plus jamais !

28

pluzun et encore je touche pas a tout loin de là sinon je pète un cable direct :o


TKT, une fois l'ascension réalisée ils comprennent que tu n'es plus sur le meme plan d'existence et ne te font plus chier §§ La seule solution a vos emmerdes c'est de pousser plus loin la connaissance :d

29

Par rapport à mon argument:

Winamp:
http://static.pcinpact.com/images/bd/news/47212-winamp-5-5-beta.png

OMFG, c'est quoi cette saloperie :| :rofl:

30
Petite question pour les bobys windowsiens (personne n'est parfait) : l'ordi de mon frangin en wifi flood voir dos complètement la livebox avec des paquets logical link control ce qui la rend incapable de faire autre chose que traiter ces paquets, en tout cas en wifi.

Ca se produit des que la connexion est franchement utilisée, par exemple avec un bittorrent mal configuré mais je viens de voir que ca arrive aussi quand il écoute la radio en streaming...

Vu les faibles possibilités d'admin de la QoS sur cette box de fiente ya pas moyen de corriger ce comportement dans l'os et/ou le driver de la carte wifi ?

Pages: [1] 2 3 ... 12