1
2
3
4 """ the COM server for Composite models
5
6 """
7
8 from rdkit import RDConfig
9 import string
10 from rdkit.ML.Composite import Composite
11 import cPickle
12 import sys
13 import winerror
14 from win32com.server import exception
15
17 """ exposes an interface for composite COM servers
18
19 This interface does not support modifying the composite, only
20 classifying new examples
21
22 **Public Methods**
23
24 - LoadComposite
25
26 - ClassifyExample
27
28 - ShowComposite
29
30 - GetVoteDetails
31
32 - SetInputOrder
33
34 - GetDescriptorNames
35
36 - Close
37
38 **Public Attributes**
39
40 None
41
42 **ProgID**
43
44 RD.Composite
45
46 """
47 _public_methods_ = ['LoadComposite','ClassifyExample','ShowComposite',
48 'GetVoteDetails','SetInputOrder','GetDescriptorNames',
49 'Close']
50 _public_attrs_ = []
51 _reg_clsid_ = '{9F62358E-9043-4BF9-93C7-47BED8BE522F}'
52 _reg_progid_ = "RD.Composite"
53
55 """ Blows out the local composite
56
57 **Note**
58
59 _LoadComposite()_ must be called after this for further use of the
60 composite
61
62 """
63 self._composite = None
64
66 """ Loads a (pickled) composite from a file
67
68 **Arguments**
69 - fileName: the name of the file to load
70
71 """
72 try:
73 f = open(str(fileName),'rb')
74 except:
75 raise exception.COMException('The file %s could not be opened'%(fileName),
76 winerror.ERROR_FILE_NOT_FOUND)
77 try:
78 self._composite = cPickle.load(f)
79 except:
80 raise exception.COMException('The composite could not be loaded',
81 winerror.ERROR_INVALID_HANDLE)
82
83 return fileName
84
86 """ returns a string representation of the composite
87
88 """
89 try:
90 c = self._composite
91 except AttributeError:
92 raise exception.COMException('The composite has not yet been loaded',
93 winerror.ERROR_INVALID_HANDLE)
94 else:
95 return str(c)
96
98 """ returns a list of the results of the last vote
99
100 """
101 try:
102 c = self._composite
103 except AttributeError:
104 raise exception.COMException('The composite has not yet been loaded',
105 winerror.ERROR_FILE_NOT_FOUND)
106 else:
107 try:
108 return c.GetVoteDetails()
109 except:
110 raise exception.COMException('VoteDetails unavaliable',winerror.ERROR_INVALID_HANDLE)
111
141
143 """ returns a list of the descriptor names the composite expects
144
145 """
146 try:
147 c = self._composite
148 except AttributeError:
149 raise exception.COMException('The composite has not yet been loaded',
150 winerror.ERROR_INVALID_HANDLE)
151 else:
152 try:
153 return c.GetDescriptorNames()
154 except:
155 raise exception.COMException('GetDescriptorNames failed.',winerror.ERROR_INVALID_HANDLE)
156
158 """ classifies a new example
159
160 **Arguments**
161
162 - example: a list containing the example to be classified
163
164 - threshold: the threshold to be used for high-confidence predictions
165
166 **Returns**
167
168 a list two elements long:
169
170 1) the classification (this will be -1 if the confidence of the prediction
171 was below _threshold_
172
173 2) the confidence
174
175 """
176 try:
177 c = self._composite
178 except AttributeError:
179 raise exception.COMException('The composite has not yet been loaded',
180 winerror.ERROR_INVALID_HANDLE)
181 if 0:
182 try:
183 res = c.ClassifyExample(example,threshold=threshold)
184 except:
185 import traceback,sys
186 outF = open(RDConfig.RDCodeDir+'/ml/composite/log.txt','a+')
187 outF.write('#------------------------------\n')
188 outF.write('ex: %s\n'%str(example))
189 traceback.print_tb(sys.exc_info()[2],file=outF)
190 outF.close()
191 res = []
192 else:
193 try:
194 res = c.ClassifyExample(example,threshold=threshold)
195 except:
196 raise exception.COMException('ClassifyExample failed.',winerror.ERROR_INVALID_HANDLE)
197 return list(res)
198
199 if __name__=='__main__':
200 from win32com.server import register
201 register.UseCommandLine(CompositeServer)
202