OSDN Git Service

First commit
[minimpy2/mp2.git] / trial.py
1 import math
2
3 BIASED_COIN = 0
4 NAIVE = 1
5 MARGINAL_BALANCE = 0
6 RANGE = 1
7 SD = 2
8 VARIANCE = 3
9 NUMERIC = 0
10 ALPHA = 1
11 MIX = 2
12 SEQUENTIAL = 0
13 RANDOM = 1
14 LETTERS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
15 NUMBER_LETTERS = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
16
17 class Trial:
18     def __init__(self, setting):
19         self.id = setting.value('id')
20         self.title = setting.value('title')
21         self.code = setting.value('code')
22         self.created = setting.value('created')
23         self.modified = setting.value('modified')
24         self.prob_method = setting.value('prob_method')
25         self.base_prob = setting.value('base_prob')
26         self.dist_method = setting.value('dist_method')
27         self.identifier_type = setting.value('identifier_type')
28         self.identifier_order = setting.value('identifier_order')
29         self.identifier_length = setting.value('identifier_length')
30         self.recycle_ids = setting.value('recycle_ids')
31         self.new_subject_random = setting.value('new_subject_random')
32         self.arms_weight = setting.value('arms_weight')
33
34     def get_max_sample_size(self):
35         base = 10
36         if self.identifier_type == ALPHA:
37             base = 26
38         elif self.identifier_type == MIX:
39             base = 36
40         ss = math.pow(base, self.identifier_length)
41         return ss, self.format_unit(ss)
42
43     def format_unit(self, size):
44         power = 1000
45         n = 0
46         power_labels = {0: '', 1: ' K', 2: ' M', 3: ' G', 4: ' T', 5: ' P'}
47         while size > power:
48             size //= power
49             n += 1
50         size = int(size)
51         return '{}{}'.format(size, power_labels[n])
52
53     def format_subject_identifier(self, value):
54         length = int(self.identifier_length)
55         if self.identifier_type == NUMERIC:
56             return str(value).zfill(length)
57         base = [10, 26, 36][self.identifier_type]
58         z = ['0', 'A', '0'][self.identifier_type]
59         lst = number_to_base(value, base)
60         w = ['', LETTERS, NUMBER_LETTERS][self.identifier_type]
61         lst = ''.join(list(map(lambda x: w[x], lst)))
62         lst = lst.zfill(length)
63         lst = lst.replace('0', z)
64         return lst
65
66
67 def number_to_base(n, b):
68     if n == 0:
69         return [0]
70     digits = []
71     while n:
72         digits.append(int(n % b))
73         n //= b
74     return digits[::-1]
75
76