Statistics
| Revision:

root / tmp / org.txm.groovy.core / src / groovy / org / txm / macro / stats / Specif2ThrowMacro.groovy @ 479

History | View | Annotate | Download (7.3 kB)

1
// Copyright © 2016 ENS de Lyon, CNRS, University of Franche-Comté
2
// Licensed under the terms of the GNU General Public License (http://www.gnu.org/licenses)
3
// @author sheiden
4

    
5
/* --------------   Specif2Throw    --------------
6

7
FR:
8

9
Macro affichant la probabilité a priori (avant de faire les lancés ou les tirages) d'obtenir N succès consécutifs
10
dans des jeux de lancés ou de tirages simples en regard avec des valeurs de spécificités.
11
Il s'agit de jeux de lancés ou tirages connus de tous : le lancé de pièce pour obtenir pile ou face, le lancé de dé
12
à 6 faces, tirer une carte dans un jeu de 32 ou 52 cartes, etc.
13
On considère qu'une pièce a 50% de chances (1 chance sur 2) de tomber sur la face 'pile' à chaque lancé.
14
On considère qu'un dé a 16,6% de chances (1 chance sur 6) de tomber sur '6' à chaque lancé.
15
On considère qu'on a 3,1% de chances (1 chance sur 32) de tirer un as de trèfle à chaque tirage dans un jeu de 32 cartes.
16
On considère qu'on a 1,9% de chances (1 chance sur 52) de tirer un as de trèfle à chaque tirage dans un jeu de 52 cartes.
17
etc.
18
On considère que les lancés ou les tirages sont indépendants et que les objets ne sont pas biaisés (eg le dé n'est pas pipé).
19

20
La probabilité est mise en regard avec la spécificité équivalente pour mettre en lien
21
des valeurs de spécificités calculées par TXM et l'intuition que l'on a de chances de succès
22
dans un jeu de lancé ou de tirage.
23
Il s'agit bien sûr uniquement d'illustrer l'ordre de grandeur de la surprise à avoir en
24
interprétant directement le modèle des spécificités. Il ne s'agit en aucun cas d'illustrer
25
une quelconque assimilation de l'apparition de mots dans des textes à un jeu de hasard.
26

27
La macro prend deux paramètres :
28

29
* cardOmega : le nombre d'issues possibles pour le jeu de lancé ou de tirage considéré
30
              (Omega est l'univers de l'expérience aléatoire, cardOmega son cardinal)
31
 - pour un lancé de pièce : choisir 2 pour cardOmega
32
   (Omega = {pile, face})
33
 - pour un lancé de dé : choisir 6 pour cardOmega
34
   (Omega = {1, 2, 3, 4, 5, 6})
35
 - pour un tirage de carte dans un jeu de 32 cartes : choisir 32 pour cardOmega
36
   (Omega = {1 de trèfle, 2 de trèfle, 3 de trèfle, 4 de trèfle, 5 de trèfle, 6 de trèfle, 7 de trèfle,
37
   8 de trèfle, 9 de trèfle, 10 de trèfle, valet de trèfle, dame de trèfle, roi de trèfle, 1 de carreau,
38
   2 de carreau, etc.})
39
 - pour un tirage de carte dans un jeu de 52 cartes : choisir 52 pour cardOmega
40
 - etc.
41
* nthrows : le nombre maximum de lancés ou de tirages avec succès consécutifs
42

43
La macro affiche - selon les options :
44

45
* displayProba : toutes les probabilités de 1 à nthrows lancés ou tirages en détaillant :
46
-  n : le nombre de succès consécutifs
47
-  p : la probabilité correspondante
48
-  % : le pourcentage correspondant
49
- pe : la probabilité exprimée en notation avec exposant en base 10
50
-  s : la spécificité équivalente (l'exposant de la probabilité, soit son logarithme en base 10)
51

52
* onlyMainRanks : s'utilise avec l'option displayProba pour n'afficher que les probabilités des rangs décimaux principaux (1, 2..., 10, 20..., 100, 200...)
53

54
* displayThrows : plutôt que le détail de la probabilité, liste pour une spécificité S- donnée, le nombre équivalent de lancés ou de tirages avec succès consécutifs correspondants exprimé sous la forme d'un intervalle : nombre de lancés ou tirages minimum - nombre de lancés ou tirages maximum
55
Par exemple '-10 = 30-33' signifie : une spécificité S- de '-10' équivaut à entre 30 et 33 lancés ou tirages avec succès consécutifs (cas du lancé de pièce, cardOmega = 2)
56

57
Les limites du calcul sont liées au modèle de la mémoire de la machine. Une machine 64-bit peut typiquement calculer la probabilité de 1023 lancés de pièce avec succès consécutifs.
58

59
*/
60

    
61
// STANDARD DECLARATIONS
62
package org.txm.macro.stats
63

    
64
import org.kohsuke.args4j.*
65
import groovy.transform.Field
66
import org.txm.rcpapplication.swt.widget.parameters.*
67
import org.eclipse.ui.console.*
68

    
69
// BEGINNING OF PARAMETERS
70

    
71
@Field @Option(name="cardOmega", usage="card(Ω): 2=coin, 6=dice, 32=32-card deck, 52=52-card deck, etc.", widget="Integer", required=true, def="2")
72
def cardOmega
73

    
74
@Field @Option(name="nthrows", usage="maximum number of successful throws or draws", widget="Integer", required=true, def="99")
75
def nthrows
76

    
77
@Field @Option(name="displayProba", usage="display probabilities", widget="Boolean", required=false, def="true")
78
def displayProba
79

    
80
@Field @Option(name="onlyMainRanks", usage="only display main rank lines", widget="Boolean", required=false, def="false")
81
def onlyMainRanks
82

    
83
@Field @Option(name="displayThrows", usage="display equivalent specificity value for each number or interval number of throws or draws", widget="Boolean", required=false, def="true")
84
def displayThrows
85

    
86
// Open the parameters input dialog box
87
if (!ParametersDialog.open(this)) return
88

    
89
// END OF PARAMETERS
90

    
91
def clearConsole = { ->
92
        // clear the console
93
        (ConsolePlugin.getDefault().getConsoleManager().getConsoles())[0].clearConsole()
94
}
95

    
96
clearConsole()
97

    
98
min = [:]
99
max = [:]
100

    
101
pow = cardOmega**(nthrows)
102
powd = pow.doubleValue()
103

    
104
if (powd == Double.POSITIVE_INFINITY || powd == Double.NEGATIVE_INFINITY) {
105
        println sprintf("** Impossible to calculate probabilities for this value, try a lower value (impossible to represent cardOmega to the power of %d with this machine). Aborting.", nthrows)
106
        return
107
}
108

    
109
d = 1/powd
110

    
111
significandSize = ((-java.lang.Math.log10(d) as double)-1 as int)+4
112

    
113
format = sprintf("%%4d = %%%d.%df = %%0%d.%df%%%% = %%9.2e = %%4d", significandSize, significandSize-2, significandSize-1, significandSize-4)
114

    
115
unit = 1
116
dec = 1
117

    
118
println "cardOmega = "+cardOmega
119

    
120
if (displayProba) {
121
        println """Légende :
122
-  n : le nombre de lancés ou tirages avec succès consécutifs
123
-  p : la probabilité correspondante
124
-  % : le pourcentage correspondant
125
- pe : la probabilité exprimée en notation avec exposant en base 10
126
-  s : la spécificité équivalente (l'exposant de la probabilité, soit son logarithme en base 10)
127
"""
128
        spc = ' ' * (significandSize+2)
129
        println "   n    p"+spc+" %"+spc+"  pe         s"
130
}
131

    
132
nthrows.times {
133
    n = it+1
134
        p = (1/cardOmega)**(n) as double
135
        s = java.lang.Math.log10(p)-1 as int
136
        if (min[s]) { if (min[s] > n) min[s] = n } else min[s] = n
137
        if (max[s]) { if (max[s] < n) max[s] = n } else max[s] = n
138
        if (displayProba) {
139
                s = sprintf(format, n, p, p*100, p, s).replaceAll(/ = 0([^,])/, ' =  $1')
140
                m0 = s =~ /(....)0+ = ([^-])/
141
                if (m0.count > 0) {
142
                        spc0 = m0[0][1] + (' ' * (m0[0][0].size()-8)) + ' = ' + m0[0][2]
143
                        s = m0.replaceFirst(spc0)
144
                }
145
                m0p = s =~ /(....)0+% = /
146
                if (m0p.count > 0) {
147
                        spc0p = m0p[0][1] + '%' + (' ' * (m0p[0][0].size()-8)) + ' = '
148
                        s = m0p.replaceFirst(spc0p)
149
                }
150

    
151
                if (!onlyMainRanks || ((n % dec) == 0) || (n == nthrows)) {
152
                        println s
153
                }
154
                
155
                unit = unit+1
156
                if (unit >= dec * 10) {
157
                        dec = dec * 10
158
                        unit = 1
159
                }
160
        }
161
}
162

    
163
if (displayThrows) {
164

    
165
        if (displayProba) {
166
                println ""
167
        }
168

    
169
        def x = []
170
        def y = []
171
        
172
        println """Légende :
173
- -S      : spécificité équivalente
174
-  lancés : intervalle des nombres de lancés ou tirages avec succès consécutifs correspondant
175
"""
176
        println " -S   lancés"
177
        min.each { key, value ->
178
         if (min[key] != max[key]) println sprintf("%3d = %d-%d", key, min[key], max[key])
179
         else println sprintf("%3d = %d", key, min[key])
180
         x.push(key)
181
         y.push(min[key])
182
        }
183
        
184
//        println "x = "+x
185
//        println "y = "+y
186

    
187
}