#501 Le 13/01/2013, à 19:26
- tshirtman
Re : /* Topic des codeurs [8] */
Ça je sais bien
C'est juste que j'ai du mal à voir l'intérêt de préciser « si tu a bien mis ton main dans un bloc if __name__ == '__main__' » quand tu parles de concaténer tout dans un même fichier :
– Soit il y a du code en vrac et il sera lu dans tous les cas lors de l'exécution du gros fichier,
– Soit le code est dans un bloc main, mais comme tout le gros fichier se retrouve en main, il sera lu aussi.Dans les deux cas, si tu concatènes tout dans un seul fichier, tout le code est lu, test du bloc main ou pas. Non ?
Oui, en fait tu as raison, cette précision était inutile.
Tremblez mortels…
Meuporg arrive dans les chaumières
\O/
Hors ligne
#502 Le 14/01/2013, à 01:12
- Pylades
Re : /* Topic des codeurs [8] */
(C'est quoi, ce que tu lui reprochais, à mon système de notes, déjà ?)
L’impossibilité de cliquer sur les liens.
“Any if-statement is a goto. As are all structured loops.
“And sometimes structure is good. When it’s good, you should use it.
“And sometimes structure is _bad_, and gets into the way, and using a goto is just much clearer.”
Linus Torvalds – 12 janvier 2003
Hors ligne
#503 Le 14/01/2013, à 01:48
- Elzen
Re : /* Topic des codeurs [8] */
Ah, ouais, ça. Ouaip, le nouveau système règle ça, en plus d'être (je trouve) plus sympa à utiliser.
Sinon, j'viens de faire un article de plus dans la partie informatique, si quelqu'un veut relire.
Elzen : polisson, polémiste, polymathe ! (ex-ArkSeth)
Un script pour améliorer quelques trucs du forum.
La joie de t'avoir connu surpasse la peine de t'avoir perdu…
timezone[blocklist]
Hors ligne
#504 Le 14/01/2013, à 05:34
- grim7reaper
Re : /* Topic des codeurs [8] */
It is practically impossible to teach good programming to students that have had a prior exposure to BASIC: as potential programmers they are mentally mutilated beyond hope of regeneration.
Hors ligne
#505 Le 14/01/2013, à 06:39
- Pylades
Re : /* Topic des codeurs [8] */
^^
“Any if-statement is a goto. As are all structured loops.
“And sometimes structure is good. When it’s good, you should use it.
“And sometimes structure is _bad_, and gets into the way, and using a goto is just much clearer.”
Linus Torvalds – 12 janvier 2003
Hors ligne
#506 Le 14/01/2013, à 08:04
- Dr Le Rouge
Re : /* Topic des codeurs [8] */
Tremblez mortels…
Meuporg arrive dans les chaumières
D'ailleurs, est-ce qu'il y a un équivalent à org-mode pour vim ? Je devrais pouvoir rajouter le support pour ce format facilement s'il y en a un.
C'est deux suites de Cauchy qui veulent aller à la soirée 'no limit'. Hélas, à l'entrée le videur leur dit : "désolé, c'est complet !".
mon site perso (π²/6.fr) et mon blog
Hors ligne
#507 Le 14/01/2013, à 08:17
- grim7reaper
Re : /* Topic des codeurs [8] */
Hors ligne
#508 Le 14/01/2013, à 08:35
- Dr Le Rouge
Re : /* Topic des codeurs [8] */
Ok, mais pas de format spécifique donc. Tant mieux pour eux remarque : vu que mon programme ne dépend pas d'emacs, ils peuvent aussi l'utiliser pour générer des fichiers org-mode-de-vim.
Pas de minor-mode pour rendre ça plus sympa par contre
C'est deux suites de Cauchy qui veulent aller à la soirée 'no limit'. Hélas, à l'entrée le videur leur dit : "désolé, c'est complet !".
mon site perso (π²/6.fr) et mon blog
Hors ligne
#509 Le 14/01/2013, à 17:46
- Blabla404
Re : /* Topic des codeurs [8] */
Bon les threads c'est vraiment dur.
{ x=0; y=0; }
P0 | P1 ;
MOV [x],$1 | MOV [y],$1 ;
MOV EAX,[y] | MOV EBX,[x] ;
En gros les adresses x,y sont initialisés à 0. J'ai deux threads, un qui met 1 dans x puis EBX à y l'autre le contraire.
On peut penser que je ne peux pas avoir EAX et EBX a 0. Et ben non, ça arrive. En plus c'est compliqué à trouver comme problème.
Hors ligne
#510 Le 14/01/2013, à 17:58
- grim7reaper
Hors ligne
#511 Le 14/01/2013, à 18:13
- tshirtman
Re : /* Topic des codeurs [8] */
Le Rouge a écrit :Tremblez mortels…
Meuporg arrive dans les chaumières
D'ailleurs, est-ce qu'il y a un équivalent à org-mode pour vim ? Je devrais pouvoir rajouter le support pour ce format facilement s'il y en a un.
N'ayant pas utilisé org-mode, je ne sais pas si c'est équivalent, mais j'utilise vim-wiki pour noter les trucs à faire (et autres trucs à noter).
Hors ligne
#512 Le 14/01/2013, à 18:53
- Blabla404
Re : /* Topic des codeurs [8] */
Tu fais du multithread en assembleur ?
Non, mais c'est un cas assez pathologique que j'ai montré, il se peut parfaitement de le compilo génère le même genre de code. Après pour trouver un exemple petit et compréhensible de ce problème c'est compliqué. Donc j'ai écris du pseudo-assembleur.
C'est pas évident à expliquer, mais en gros le model de shared memory n'est pas vrai en pratique. Les vrais processeurs (e.g. celui de ma machine) utilisent un cache d'écriture avant d'acceder à la shared memory. Pour une intro à partir du slide 49 de ça:
http://www.di.ens.fr/~zappa/teaching/lyon13/lec1.pdf
Pour tester sur sa machine j'ai utilisé litmus:
http://diy.inria.fr/doc/litmus.html
Notez que pour tester il faut mieux avoir une machine multi-core, les changements de contexte introduisent pas mal de memory barrière qui résolvent le problème.
Il permet aussi de générer un testcase C du problème.
Hors ligne
#513 Le 14/01/2013, à 19:11
- Dr Le Rouge
Re : /* Topic des codeurs [8] */
N'ayant pas utilisé org-mode, je ne sais pas si c'est équivalent, mais j'utilise vim-wiki pour noter les trucs à faire (et autres trucs à noter).
Ça a l'air suffisamment proche. Est-ce que les liens peuvent pointer vers une ligne particulière d'un fichier existant ?
C'est deux suites de Cauchy qui veulent aller à la soirée 'no limit'. Hélas, à l'entrée le videur leur dit : "désolé, c'est complet !".
mon site perso (π²/6.fr) et mon blog
Hors ligne
#514 Le 14/01/2013, à 20:35
- Dr Le Rouge
Re : /* Topic des codeurs [8] */
Bon, j'ai implémenté le support de vimwiki mais github fait la gueule >_<"
edit : ayé \o/
@ tshirtman : vu que j'ai un peu la flemme d'installer vim, d'apprendre à l'utiliser, d'installer le plugin vimwiki et d'apprendre à l'utiliser aussi, est-ce que tu pourrais regarder si les fichiers vimwiki que meuporg génère ont une bonne tronche ?
Dernière modification par Dr Le Rouge (Le 15/01/2013, à 07:58)
C'est deux suites de Cauchy qui veulent aller à la soirée 'no limit'. Hélas, à l'entrée le videur leur dit : "désolé, c'est complet !".
mon site perso (π²/6.fr) et mon blog
Hors ligne
#515 Le 15/01/2013, à 09:24
- tshirtman
Re : /* Topic des codeurs [8] */
Je vais regarder ça merci
Hors ligne
#516 Le 15/01/2013, à 09:52
- Mindiell
Re : /* Topic des codeurs [8] */
@Le Rouge: Si j'ai bien compris, ton truc c'est simplement un bête TODO list plus "pratique" ?
Je veux dire que j'utilise TaskFreak actuellement. L'avantage de ton machin c'est qu'il me mets des liens vers le fichier et l'emplacement exact si j'ai bien compris. Par contre, ton fichier final, tu en fais quoi ? Ca te crées des liens dans vim/emacs ?
Hors ligne
#517 Le 15/01/2013, à 10:47
- Dr Le Rouge
Re : /* Topic des codeurs [8] */
@ Mindiell : oui, on peut voir ça comme ça. L'idée c'est que tu n'aies pas besoin d'ouvrir un fichier spécifique quand quelque chose te traverse la tête. Par exemple, si tu te dis « Oulà, il faudrait que je vérifie ma condition de sortie de boucle mais là j'ai pas le temps » ; tu mets :
while condition_douteuse
// !TODO! Vérifier la condition de sortie de boucle
{
// bla bla
}
et meuporg te placera un lien dans ton « fichier principal » (meup.org, meuporg.md ou meuporg.wiki) vers cette ligne de ce fichier. L'autre fonctionnalité principale est qu'il est très facile de trier les items par fichiers. Par exemple, si tu as cette arborescence :
src/
+ class1
++ bla.hpp
++ bla.cpp
++ test
+++ bla.cpp
+ class2
++ bli.hpp
++ bli.cpp
++ test_class2.cpp
+ code
++ global_test.cpp
et que tu mets ça dans ton meup.org (ou meuporg.wiki, ou meuporg.md) :
* test
** Items
* Items
tous les items dans des fichiers dont le chemin relatif contient la chaîne « test » (donc src/class1/test/bla.cpp, src/class2/test_class2.cpp et src/code/global_test.cpp) iront dans la sous-section « Items » de la section « test ». Tu peux même utiliser des regex si ça t'amuse ^^
Le fichier principale est juste destiné à être ouvert avec ton éditeur préféré.
edit : d'ailleurs, il y a peut-être moyen de générer une todo-list pour taskfreak (je vais regarder).
edit 2 : euh non en fait, je vais pas me battre avec une BDD
Dernière modification par Dr Le Rouge (Le 15/01/2013, à 11:17)
C'est deux suites de Cauchy qui veulent aller à la soirée 'no limit'. Hélas, à l'entrée le videur leur dit : "désolé, c'est complet !".
mon site perso (π²/6.fr) et mon blog
Hors ligne
#518 Le 15/01/2013, à 11:17
- Mindiell
Re : /* Topic des codeurs [8] */
@tous : Ayé ! J'ai une lib de résolution de problèmes de contraintes ! Mon parcours de l'arbre est pas mal optimisé, je suis assez content. Maintenant, il faut que je bosse un peu, mon algo de Force Brute (est vraiment un algo ? ) me résout le "send+more=money" en 12 minutes, la lib modèle pour mes comparaisons mets environ 0.04 secondes Mais la lib utilise un algo de BackTracking avec tri des variables en amont. Bref, je dois bosser sur ce solveur là maintenant
Première version d'algorithme de BackTracking mise en place !
Je suis passé de 12 minutes à moins de 3 secondes...
Il me reste encore à optimiser l'algo lui-même. Après je m'attaquerais au "tri" des contraintes et des domaines pour être encore plus performant que la lib sur laquelle je prends modèle en espérant faire mieux
@Le Rouge: Mais en faire une page web ? C'est possib' ? Parce qu'une fois que tu as ton fichier dans lequel tout y est, ça sert à quoi ? Juste à tout avoir au même endroit ? Dans ce cas, une page web me serait utile Je regarderai si je peux l'utiliser ton machin.
Dernière modification par Mindiell (Le 15/01/2013, à 11:18)
Hors ligne
#519 Le 15/01/2013, à 12:00
- Dr Le Rouge
Re : /* Topic des codeurs [8] */
@Le Rouge: Mais en faire une page web ? C'est possib' ?
Ça devrait être jouable, mais pas mal de modif' seraient nécessaires. Par contre, transformer du markdown en html ne doit pas être trop dur. Du coup je pense que le plus simple serait d'avoir un fichier markdown mis à jour par meuporg et transformé en html par un autre parseur. Un petit
meuporg -u
pandoc meuporg.md -o meuporg.html
et hop, c'est parti mon kiki ^^ Par contre, il faut que je bidouille deux trois trucs au niveau de la sortie en markdown, pandoc n'aime pas trop mes fichiers pour l'instant D'ailleurs, je suis pas convaincu qu'un lien HTML avec numéro de ligne soit très apprécié non plus.
Parce qu'une fois que tu as ton fichier dans lequel tout y est, ça sert à quoi ? Juste à tout avoir au même endroit ?
Voilà. À avoir tout au même endroit : commandes utiles pour le projet, lien vers une doc, liens vers des sites utiles et liste de chose à faire mise à jour automatiquement. Quand il met à jour un fichier, meuporg ne touche que au contenu qui est dans une section « Items » (il le vire et mets le nouveau à la place). Le reste n'est pas touché. Du coup, même si tu laisses un projet de côté pendant un moment, ce n'est pas dur de t'y remettre : tu sais ce que tu as faire et tu sais où sont les données utiles
Dans ce cas, une page web me serait utile Je regarderai si je peux l'utiliser ton machin.
Cool
C'est deux suites de Cauchy qui veulent aller à la soirée 'no limit'. Hélas, à l'entrée le videur leur dit : "désolé, c'est complet !".
mon site perso (π²/6.fr) et mon blog
Hors ligne
#520 Le 15/01/2013, à 13:53
- The Uploader
Re : /* Topic des codeurs [8] */
Voilà. À avoir tout au même endroit : commandes utiles pour le projet, lien vers une doc, liens vers des sites utiles et liste de chose à faire mise à jour automatiquement. Quand il met à jour un fichier, meuporg ne touche que au contenu qui est dans une section « Items » (il le vire et mets le nouveau à la place). Le reste n'est pas touché. Du coup, même si tu laisses un projet de côté pendant un moment, ce n'est pas dur de t'y remettre : tu sais ce que tu as faire et tu sais où sont les données utiles
Mais j'ai vim.
va falloir que je creuse vim-wiki (si c'est équivalent ?)
- Oldies PC : Intel Pentium 3 @ 800 Mhz sur CM ASUS P2B-F, GeForce 4 Ti4800 SE, Disque Dur Hitachi 160 Go, 512 Mo de RAM, 3DFX Voodoo 2, Sound Blaster 16 ISA PnP, Windows 98 SE / XP)
- Desktop : Intel Core i7 6700K @ 4 GHz sur CM ASUS Z170-P, GeForce GTX 1070, SSD Samsung 850 EVO 1 To, 16 Go de RAM, Disque Dur Seagate Barracuda 3 To, Windows 10
Hors ligne
#521 Le 15/01/2013, à 14:14
- Dr Le Rouge
Re : /* Topic des codeurs [8] */
Ça a l'air d'avoir le même esprit que l'org-mode d'emacs et j'ai implémenté la gestion du format correspondant. Le seul problème c'est que je peux pas tester si ça marche bien ^^ Dites moi ce que ça donne et je réparerai ce qui doit l'être !
C'est deux suites de Cauchy qui veulent aller à la soirée 'no limit'. Hélas, à l'entrée le videur leur dit : "désolé, c'est complet !".
mon site perso (π²/6.fr) et mon blog
Hors ligne
#522 Le 15/01/2013, à 14:32
- Mindiell
Re : /* Topic des codeurs [8] */
Première version d'algorithme de BackTracking mise en place !
Je suis passé de 12 minutes à moins de 3 secondes...
Il me reste encore à optimiser l'algo lui-même. Après je m'attaquerais au "tri" des contraintes et des domaines pour être encore plus performant que la lib sur laquelle je prends modèle en espérant faire mieux
Bon l'algo de base de tri des variables me fait passer à 0.1 seconde. C'était plus rapide à implémenter que l'optimisation de mon algo de parcours de noeuds que j'ai modifié pour le BackTracking et que j'ai donc du ralentir en conséquence.
To be continued...
EDIT:
Voilà, l'algo a été amélioré. Je suis désormais sous les 0.04 secondes (0.036 en moyenne). L'algo de la librairie modèle stagne à 0.065 sans vérification en avant (j'ai pas encore mis ça en place). Avec vérification en avant, la lib descend à 0.04, je l'ai donc réellement battue C'est couillon, mais je suis content.
Reste donc à mettre en place la "vérification en avant", et puis après je m'occuperai de la "propagation"...
\o/
Dernière modification par Mindiell (Le 15/01/2013, à 18:53)
Hors ligne
#523 Le 15/01/2013, à 23:16
- Rolinh
Re : /* Topic des codeurs [8] */
Tiens, Rolinh si tu as 5 min tu peux jeter un œil ici si tu veux.
Ah ouais, j'irais y jeter un coup d’œil.
J'ai une question tricky. Je me suis remis un petit peu sur Lincopier et je fais face à un problème.
A la compilation, je génère 2 exécutables: un pour la version CLI du programme et un pour la version GUI. Lors du ccmake, on peut choisir de builder la GUI ou non. Si on choisit de builder la GUI, alors cmake génère le header extern.h avec la définition de la macro GUI à partir du extern.h.in. Jusqu'ici rien de particulier. Sauf que, j'ai une fonction qui est appelée lorsque l'on build la CLI et la GUI à la différence que l'on doit faire une chose supplémentaire dans le cas de la GUI mais pas dans la CLI. J'avais donc mis un #ifdef GUI /* code */ #endif sauf que... GUI est définit quand même si on build la CLI et la GUI d'une traite.
En bref, je ne sais pas comment tester si je suis dans le cas de la GUI ou pas. Une piste quelqu'un ?
EDIT: en fait, faudrait pas que je génère la macro statiquement mais dynamiquement. Je pense que je vois comment corriger mon problème.
EDIT2: m’énerve, je ne vois pas comment le faire via le CMakeLists.txt pour qu'il me fasse un -DGUI seulement lorsqu'il build la target GUI et pas la CLI
EDIT3: j'ai trouvé cette solution dans la mailing liste mais je trouve moche. Pas moyen de faire mieux à votre avis ?
Dernière modification par Rolinh (Le 15/01/2013, à 23:42)
Hors ligne
#524 Le 16/01/2013, à 10:55
- Dr Le Rouge
Re : /* Topic des codeurs [8] */
@ Mindiell : on peut voir ? Ça m'intéresse
@ux vimeux : meuporg a fait explosé vos PC ?
C'est deux suites de Cauchy qui veulent aller à la soirée 'no limit'. Hélas, à l'entrée le videur leur dit : "désolé, c'est complet !".
mon site perso (π²/6.fr) et mon blog
Hors ligne
#525 Le 16/01/2013, à 11:27
- Mindiell
Re : /* Topic des codeurs [8] */
@Le Rouge: Tu veux voir quoi ? L'algo en python ? Je ne sais pas si ça sera très parlant
Ici est construite la liste des contraintes à utilser suivant le nombre de variables assignées (elles sont assignées dans l'ordre, l'arbre est trié uniquement en amont de la recherche) :
def set_problem(self, problem):
super().set_problem(problem)
# List usable constraints by nodes
self._var_cons = list()
for i in range(len(self._variables)+1):
self._var_cons.append(list())
for constraint in self._constraints:
for variable in constraint.get_variables():
if variable not in self._variables[:i]:
break
else:
for j in range(i+1):
if constraint in self._var_cons[j]:
break
else:
self._var_cons[i].append(constraint)
if JIBOIA_DEBUG:
for i in range(len(self._var_cons)):
print(i,":",len(self._var_cons[i]),self._var_cons[i])
Et ici, la recherche d'une solution. Le temps de réponse dont je parle dans les précédents posts est celui de la première réponse. Mon problème benchmark (SEND+MORE=MONEY) n'en connait qu'une (avec M>0), il faudra donc que je fasse aussi le bench sur la liste de toutes les solutions (et donc le parcours de l'arbre complet) pour mieux cerner les différences.
def _get_solution_iter(self):
# Iterator initialization
self._leaf_count = 0
self._node_count = 0
assignment = {}
length = {}
solution = {}
for v in self._variables:
length[v] = len(self._domains[v])
size = len(self._variables)-1
i = 0
v = self._variables[i]
assignment[v] = 0
# Creation of the possible solution
for a in assignment:
solution[a] = self._domains[a][assignment[a]]
while True:
# Counting for stats
if i<size:
self._node_count += 1
if JIBOIA_DEBUG:
print("node : {0}".format(solution))
else:
self._leaf_count += 1
if JIBOIA_DEBUG:
print("leaf : {0}".format(solution))
# Testing node
for constraint in self._var_cons[i+1]:
if not constraint(solution):
# This node is not a solution, go to the next node
assignment[v] += 1
if assignment[v]<length[v]:
solution[v] = self._domains[v][assignment[v]]
break
else:
if i==size:
yield solution.copy()
# A solution was found, go to the next node
assignment[v] += 1
if assignment[v]<length[v]:
solution[v] = self._domains[v][assignment[v]]
else:
# This node is a possible partial solution
i = i + 1
v = self._variables[i]
assignment[v] = 0
solution[v] = self._domains[v][0]
# Maximum value reached, get back to the previous node
if assignment[v]>=length[v]:
while assignment[v]>=length[v]:
del(assignment[v])
del(solution[v])
i = i-1
if i<0:
return
v = self._variables[i]
assignment[v] += 1
if assignment[v]<length[v]:
solution[v] = self._domains[v][assignment[v]]
Et donc, pour ceux qui auraient essayé de lire, on voit apparaitre le nom de la lib : jiboia, c'est du portugais/brésilien, ça veut dire Boa Constricteur. Je me suis dit que comme le boa et le python sont voisins, et "Constr"icteur est proche de "Constr"aint... Voilà, voilà
EDIT :
Benchmark modifié pour trouver toutes les solutions, je suis deux fois plus rapide
All solutions found : [{'e': 5, 'd': 7, 'm': 1, 'o': 0, 'n': 6, 's': 9, 'r': 8, 'y': 2}]
in : 0.117416143417 seconds
Stats : nodes=>28748 leaves=>0
First solution found : {'e': 5, 'd': 7, 'm': 1, 'o': 0, 'n': 6, 's': 9, 'r': 8, 'y': 2}
in : 0.0537660121918 seconds
Stats : nodes=>41871 leaves=>0
All solutions found : [{'d': 7, 'e': 5, 'm': 1, 'n': 6, 'o': 0, 'r': 8, 's': 9, 'y': 2}]
in : 0.06633973121643066 seconds
Stats : nodes=>5600 leaves=>8000
First solution found : {'d': 7, 'e': 5, 'm': 1, 'n': 6, 'o': 0, 'r': 8, 's': 9, 'y': 2}
in : 0.037271976470947266 seconds
Stats : nodes=>3103 leaves=>4343
Dernière modification par Mindiell (Le 16/01/2013, à 11:33)
Hors ligne