1- import os
2- import sys
31import inspect
42import dispy
53
64import pyeq3
75
86
9- # Standard lowest sum-of-squared errors in this example, see IModel.fittingTargetDictionary
10- fittingTargetString = 'SSQABS'
7+ # Standard lowest sum-of-squared errors in this example,
8+ # see IModel.fittingTargetDictionary
9+ fittingTargetString = "SSQABS"
1110
1211#####################################################
1312# this value is used to make the example run faster, you
1413# will very likely want equations with more than 2 coefficients
1514#####################################################
1615smoothnessControl = 2
1716
18- textData = '''
17+ textData = """
1918 X Y
20195.357 0.376
21205.457 0.489
28278.442 4.744
29289.769 7.068
30299.861 7.104
31- '''
30+ """
3231
3332
3433# this is the function to be run on the cluster
35- def SetParametersAndFit (equationString , inFittingTargetString , inExtendedVersionString , inTextData ):
34+ def SetParametersAndFit (
35+ equationString , inFittingTargetString , inExtendedVersionString , inTextData
36+ ):
3637
3738 # individual cluster nodes must be able to import pyeq3
3839 import pyeq3
3940
40- equation = eval ('equationString +' ("' + inFittingTargetString + '" , "' + inExtendedVersionString + '" )')
41- pyeq3 .dataConvertorService ().ConvertAndSortColumnarASCII (inTextData , equation , False )
41+ equation = eval (
42+ equationString
43+ + '("'
44+ + inFittingTargetString
45+ + '", "'
46+ + inExtendedVersionString
47+ + '")'
48+ )
49+
50+ pyeq3 .dataConvertorService ().ConvertAndSortColumnarASCII (
51+ inTextData , equation , False
52+ )
4253
4354 try :
4455 # check for number of coefficients > number of data points to be fitted
45- if len (equation .GetCoefficientDesignators ()) > len (equation .dataCache .allDataCacheDictionary ['DependentData' ]):
56+ if len (equation .GetCoefficientDesignators ()) > len (
57+ equation .dataCache .allDataCacheDictionary ["DependentData" ]
58+ ):
4659 return None
4760
4861 # check for functions requiring non-zero nor non-negative data such as 1/x, etc.
@@ -52,69 +65,92 @@ def SetParametersAndFit(equationString, inFittingTargetString, inExtendedVersion
5265 equation .Solve ()
5366
5467 fittedTarget = equation .CalculateAllDataFittingTarget (
55- equation .solvedCoefficients )
56- if fittedTarget > 1.0E290 : # error too large
68+ equation .solvedCoefficients
69+ )
70+ if fittedTarget > 1.0e290 : # error too large
5771 return None
58- except :
72+ except AttributeError :
5973 return None
6074
61- return [fittedTarget , equation .GetDisplayName (), equation .solvedCoefficients , equationString , inExtendedVersionString ]
75+ return [
76+ fittedTarget ,
77+ equation .GetDisplayName (),
78+ equation .solvedCoefficients ,
79+ equationString ,
80+ inExtendedVersionString ,
81+ ]
6282
6383
6484print ()
65- print (' Creating dispy JobCluster' )
85+ print (" Creating dispy JobCluster" )
6686cluster = dispy .JobCluster (SetParametersAndFit )
6787
6888jobs = []
6989
70- # this example has named equations only, for simplicity it has no polyrationals or polyfunctions
90+ # this example has named equations only,
91+ # for simplicity it has no polyrationals or polyfunctions
7192for submodule in inspect .getmembers (pyeq3 .Models_2D ):
7293 if inspect .ismodule (submodule [1 ]):
7394 for equationClass in inspect .getmembers (submodule [1 ]):
7495 if inspect .isclass (equationClass [1 ]):
7596
7697 # ignore these special classes for simplicity
77- if equationClass [1 ].splineFlag or \
78- equationClass [1 ].userSelectablePolynomialFlag or \
79- equationClass [1 ].userCustomizablePolynomialFlag or \
80- equationClass [1 ].userSelectablePolyfunctionalFlag or \
81- equationClass [1 ].userSelectableRationalFlag or \
82- equationClass [1 ].userDefinedFunctionFlag :
98+ if (
99+ equationClass [1 ].splineFlag
100+ or equationClass [1 ].userSelectablePolynomialFlag
101+ or equationClass [1 ].userCustomizablePolynomialFlag
102+ or equationClass [1 ].userSelectablePolyfunctionalFlag
103+ or equationClass [1 ].userSelectableRationalFlag
104+ or equationClass [1 ].userDefinedFunctionFlag
105+ ):
83106 continue
84107
85- for extendedVersionString in [' Default' , ' Offset' ]:
108+ for extendedVersionString in [" Default" , " Offset" ]:
86109
87- if (extendedVersionString == 'Offset' ) and (equationClass [1 ].autoGenerateOffsetForm is False ):
110+ if (extendedVersionString == "Offset" ) and (
111+ equationClass [1 ].autoGenerateOffsetForm is False
112+ ):
88113 continue
89114
90115 equationInstance = equationClass [1 ](
91- fittingTargetString , extendedVersionString )
116+ fittingTargetString , extendedVersionString
117+ )
92118
93- if len (equationInstance .GetCoefficientDesignators ()) > smoothnessControl :
119+ if (
120+ len (equationInstance .GetCoefficientDesignators ())
121+ > smoothnessControl
122+ ):
94123 continue
95124
96- equationString = equationInstance .__module__ + \
97- "." + equationInstance .__class__ .__name__
125+ equationString = (
126+ equationInstance .__module__
127+ + "."
128+ + equationInstance .__class__ .__name__
129+ )
98130
99131 job = cluster .submit (
100- equationString , fittingTargetString , extendedVersionString , textData )
132+ equationString ,
133+ fittingTargetString ,
134+ extendedVersionString ,
135+ textData ,
136+ )
101137 jobs .append (job )
102138
103139
104- print (' Waiting on jobs to complete and collecting results' )
140+ print (" Waiting on jobs to complete and collecting results" )
105141allResultList = []
106142for job in jobs :
107143 results = job ()
108144 if job .exception : # can also use job.status
109- print (' Remote Exception in one of the jobs\n ' , str (job .exception ))
145+ print (" Remote Exception in one of the jobs\n " , str (job .exception ))
110146 else :
111147 if results :
112148 print ("Remotely fitted" , results [1 ])
113149 allResultList .append (results )
114150
115151
116152print ()
117- print (' Done. Fitted named equations only.' )
153+ print (" Done. Fitted named equations only." )
118154print ()
119155
120156
@@ -127,8 +163,14 @@ def SetParametersAndFit(equationString, inFittingTargetString, inExtendedVersion
127163equationString = topResult [3 ]
128164extendedVersionString = topResult [4 ]
129165
130- equation = eval ('equationString +' ("' + fittingTargetString + '" , "' + extendedVersionString + '" )')
166+ equation = eval (
167+ equationString + '("' + fittingTargetString + '", "' + extendedVersionString + '")'
168+ )
131169
132- print ('Lowest fitting target result was ' +
133- fittingTargetString + " of " + str (fittedTargetValue ))
170+ print (
171+ "Lowest fitting target result was "
172+ + fittingTargetString
173+ + " of "
174+ + str (fittedTargetValue )
175+ )
134176print ('for the equation "' + equationDisplayName + '"' )
0 commit comments