meplib / binaries / bin / checkSolutions-02.pl @ master
Historique | Voir | Annoter | Télécharger (13,17 ko)
1 | 08aa5d9e | Serge Torres | #! /usr/bin/perl |
---|---|---|---|
2 | 08aa5d9e | Serge Torres | |
3 | 08aa5d9e | Serge Torres | # checkSolutions-02.pl - ST - 2006-03-15 |
4 | 08aa5d9e | Serge Torres | # |
5 | 08aa5d9e | Serge Torres | # Check the quality of and sort a set of solutions with the Maple infnorm. |
6 | 08aa5d9e | Serge Torres | # |
7 | 08aa5d9e | Serge Torres | # COMMAND LINE SYNTAX: |
8 | 08aa5d9e | Serge Torres | # checkSolutions-01.pl digitsFile solutionsFile function lowerBound upperBound |
9 | 08aa5d9e | Serge Torres | |
10 | 08aa5d9e | Serge Torres | # NOTE(S): |
11 | 08aa5d9e | Serge Torres | # Changes from checkSolutions-02.pl: This versions can use several bit sizes |
12 | 08aa5d9e | Serge Torres | # ---------------------------------- instead of a single one for all |
13 | 08aa5d9e | Serge Torres | # coefficients |
14 | 08aa5d9e | Serge Torres | # |
15 | 08aa5d9e | Serge Torres | # This version checks the solutions produced by the "gp" PARI utility |
16 | 08aa5d9e | Serge Torres | # Use only for "monochunk" coefficients. For multiple chunks |
17 | 08aa5d9e | Serge Torres | # coefficients use the "checkSimpleSolutions" utilities family. |
18 | 08aa5d9e | Serge Torres | |
19 | 08aa5d9e | Serge Torres | ############################################################################## |
20 | 08aa5d9e | Serge Torres | # PROGRAM DECLARATIONS |
21 | 08aa5d9e | Serge Torres | ############################################################################## |
22 | 08aa5d9e | Serge Torres | |
23 | 08aa5d9e | Serge Torres | BEGIN |
24 | 08aa5d9e | Serge Torres | { |
25 | 08aa5d9e | Serge Torres | # Modify @INC here if necessary |
26 | 08aa5d9e | Serge Torres | my $scriptDirName = `dirname $0`; |
27 | 08aa5d9e | Serge Torres | chomp($scriptDirName); |
28 | 08aa5d9e | Serge Torres | unshift(@INC,$scriptDirName); |
29 | 08aa5d9e | Serge Torres | unshift(@INC, '../utils'); |
30 | 08aa5d9e | Serge Torres | }; |
31 | 08aa5d9e | Serge Torres | |
32 | 08aa5d9e | Serge Torres | # core modules |
33 | 08aa5d9e | Serge Torres | use strict; # must be first to force strict in all others |
34 | 08aa5d9e | Serge Torres | use Carp; |
35 | 08aa5d9e | Serge Torres | use Getopt::Long; |
36 | 08aa5d9e | Serge Torres | use Math::BigInt; |
37 | 08aa5d9e | Serge Torres | use Math::BigRat; |
38 | 08aa5d9e | Serge Torres | use Math::BigFloat; |
39 | 08aa5d9e | Serge Torres | |
40 | 08aa5d9e | Serge Torres | # custom modules |
41 | 08aa5d9e | Serge Torres | # Uncomment if you want to use standard exit error codes. |
42 | 08aa5d9e | Serge Torres | # the stdExitErrors.pm file must be available around. |
43 | 08aa5d9e | Serge Torres | use stdExitErrors; |
44 | 08aa5d9e | Serge Torres | |
45 | 08aa5d9e | Serge Torres | ############################################################################## |
46 | 08aa5d9e | Serge Torres | # PROGRAM CONSTANT DECLARATIONS |
47 | 08aa5d9e | Serge Torres | ############################################################################## |
48 | 08aa5d9e | Serge Torres | my $bigIntZero = Math::BigInt->new('0'); |
49 | 08aa5d9e | Serge Torres | my $debug = 1; |
50 | 08aa5d9e | Serge Torres | my $variableName = "x"; |
51 | 08aa5d9e | Serge Torres | my $mapleApplication = "/usr/local/maple/bin/maple"; |
52 | 08aa5d9e | Serge Torres | ############################################################################## |
53 | 08aa5d9e | Serge Torres | # PROGRAM VARIABLE DECLARATIONS |
54 | 08aa5d9e | Serge Torres | ############################################################################## |
55 | 08aa5d9e | Serge Torres | my $digitsFileName = ""; |
56 | 08aa5d9e | Serge Torres | my $solutionsFileName = ""; |
57 | 08aa5d9e | Serge Torres | my $positionsFileName = ""; |
58 | 08aa5d9e | Serge Torres | my $numDigits = 0; |
59 | 08aa5d9e | Serge Torres | my $numDigitsData = 0; |
60 | 08aa5d9e | Serge Torres | my @digits = (); |
61 | 08aa5d9e | Serge Torres | my $function = ""; |
62 | 08aa5d9e | Serge Torres | my $lowerBound = ""; |
63 | 08aa5d9e | Serge Torres | my $upperBound = ""; |
64 | 08aa5d9e | Serge Torres | my $elem = ""; |
65 | 08aa5d9e | Serge Torres | my $line = ""; |
66 | 08aa5d9e | Serge Torres | my $lineNum = 0; |
67 | 08aa5d9e | Serge Torres | my @line = (); |
68 | 08aa5d9e | Serge Torres | my $isFirstLine = 1; |
69 | 08aa5d9e | Serge Torres | my $powerOfTen = 0; |
70 | 08aa5d9e | Serge Torres | my $solutionVectorRef = 0; |
71 | 08aa5d9e | Serge Torres | my @solutionMatrix = (); |
72 | 08aa5d9e | Serge Torres | my @positionsVector = (); |
73 | 08aa5d9e | Serge Torres | my $powerIndex = 0; |
74 | 08aa5d9e | Serge Torres | my $polynomialDegree = 0; |
75 | 08aa5d9e | Serge Torres | my $polynomialString = ""; |
76 | 08aa5d9e | Serge Torres | my @polynomials = (); |
77 | 08aa5d9e | Serge Torres | my $mapleProgram = ""; |
78 | 08aa5d9e | Serge Torres | my $mapleResult = 0; |
79 | 08aa5d9e | Serge Torres | my $infNorm = ""; |
80 | 08aa5d9e | Serge Torres | my @infNorm = (); |
81 | 08aa5d9e | Serge Torres | my %sortHash = (); |
82 | 08aa5d9e | Serge Torres | my @sortedInfNorms = (); |
83 | 08aa5d9e | Serge Torres | # |
84 | 08aa5d9e | Serge Torres | # |
85 | 08aa5d9e | Serge Torres | # |
86 | 08aa5d9e | Serge Torres | ############################################################################## |
87 | 08aa5d9e | Serge Torres | # TEST ENVIRONMENT AND CONFIGURATION VARIABLES |
88 | 08aa5d9e | Serge Torres | ############################################################################## |
89 | 08aa5d9e | Serge Torres | |
90 | 08aa5d9e | Serge Torres | ############################################################################## |
91 | 08aa5d9e | Serge Torres | # INITIALIZE DEBUG FILE |
92 | 08aa5d9e | Serge Torres | ############################################################################## |
93 | 08aa5d9e | Serge Torres | |
94 | 08aa5d9e | Serge Torres | ############################################################################## |
95 | 08aa5d9e | Serge Torres | # INITIALIZE LOG FILE |
96 | 08aa5d9e | Serge Torres | ############################################################################## |
97 | 08aa5d9e | Serge Torres | |
98 | 08aa5d9e | Serge Torres | ############################################################################## |
99 | 08aa5d9e | Serge Torres | # GET COMMAND LINE ARGUMENTS |
100 | 08aa5d9e | Serge Torres | ############################################################################## |
101 | 08aa5d9e | Serge Torres | |
102 | 08aa5d9e | Serge Torres | ############################################################################## |
103 | 08aa5d9e | Serge Torres | # PROGRAM MAIN |
104 | 08aa5d9e | Serge Torres | ############################################################################## |
105 | 08aa5d9e | Serge Torres | &usage(); |
106 | 08aa5d9e | Serge Torres | # |
107 | 08aa5d9e | Serge Torres | # Check the command line parameters |
108 | 08aa5d9e | Serge Torres | # |
109 | 08aa5d9e | Serge Torres | # It's a TODO! |
110 | 08aa5d9e | Serge Torres | # |
111 | 08aa5d9e | Serge Torres | # Open the files |
112 | 08aa5d9e | Serge Torres | # |
113 | 08aa5d9e | Serge Torres | # Open the digits file |
114 | 08aa5d9e | Serge Torres | # |
115 | 08aa5d9e | Serge Torres | if (! open(DF, "<$digitsFileName")) |
116 | 08aa5d9e | Serge Torres | { |
117 | 08aa5d9e | Serge Torres | print STDERR "\n\nCan't open $digitsFileName. Aborting the program!\n\n"; |
118 | 08aa5d9e | Serge Torres | exit($EX_NOINPUT); |
119 | 08aa5d9e | Serge Torres | } |
120 | 08aa5d9e | Serge Torres | # Next the solution vector file. |
121 | 08aa5d9e | Serge Torres | # |
122 | 08aa5d9e | Serge Torres | if (! open(SVF, "<$solutionsFileName")) |
123 | 08aa5d9e | Serge Torres | { |
124 | 08aa5d9e | Serge Torres | print STDERR "\n\nCan't open $solutionsFileName. Aborting the program!\n\n"; |
125 | 08aa5d9e | Serge Torres | exit($EX_NOINPUT); |
126 | 08aa5d9e | Serge Torres | } |
127 | 08aa5d9e | Serge Torres | # |
128 | 08aa5d9e | Serge Torres | # Read the digits file |
129 | 08aa5d9e | Serge Torres | # |
130 | 08aa5d9e | Serge Torres | while ($line = <DF>) |
131 | 08aa5d9e | Serge Torres | { |
132 | 08aa5d9e | Serge Torres | # Remove the '\n'. |
133 | 08aa5d9e | Serge Torres | chomp($line); |
134 | 08aa5d9e | Serge Torres | # Coalescing all consecutive spaces to one. |
135 | 08aa5d9e | Serge Torres | $line =~ s/(\s)+/ /g; |
136 | 08aa5d9e | Serge Torres | # Removing leading and trailling spaces. |
137 | 08aa5d9e | Serge Torres | $line =~ s/(^\s*)||(\s*$)//g; |
138 | 08aa5d9e | Serge Torres | # Forget about comment lines |
139 | 08aa5d9e | Serge Torres | if ($line =~ /^\s*#/) { next; } |
140 | 08aa5d9e | Serge Torres | @line = split(/ /, $line); |
141 | 08aa5d9e | Serge Torres | if ($isFirstLine) |
142 | 08aa5d9e | Serge Torres | { |
143 | 08aa5d9e | Serge Torres | if (@line != 1) |
144 | 08aa5d9e | Serge Torres | { |
145 | 08aa5d9e | Serge Torres | print STDERR "\n\nInvalid number (", (@line * 1), ") of digits data.\n"; |
146 | 08aa5d9e | Serge Torres | print STDERR "Aborting the program!\n\n"; |
147 | 08aa5d9e | Serge Torres | exit($EX_DATAERR); |
148 | 08aa5d9e | Serge Torres | } |
149 | 08aa5d9e | Serge Torres | $numDigitsData = $line; |
150 | 08aa5d9e | Serge Torres | $isFirstLine = 0; |
151 | 08aa5d9e | Serge Torres | } |
152 | 08aa5d9e | Serge Torres | else |
153 | 08aa5d9e | Serge Torres | { |
154 | 08aa5d9e | Serge Torres | if (@line != $numDigitsData) |
155 | 08aa5d9e | Serge Torres | { |
156 | 08aa5d9e | Serge Torres | print STDERR "\n\nThe number of announced digits data ($numDigitsData) and "; |
157 | 08aa5d9e | Serge Torres | print STDERR "the number of actual digits data", (@line * 1), " do not match.\n"; |
158 | 08aa5d9e | Serge Torres | print STDERR "Aborting the program!\n\n"; |
159 | 08aa5d9e | Serge Torres | exit($EX_DATAERR); |
160 | 08aa5d9e | Serge Torres | } |
161 | 08aa5d9e | Serge Torres | @digits = @line; |
162 | 08aa5d9e | Serge Torres | last; |
163 | 08aa5d9e | Serge Torres | } |
164 | 08aa5d9e | Serge Torres | } # End while ($line = <DF>) |
165 | 08aa5d9e | Serge Torres | close(DF); |
166 | 08aa5d9e | Serge Torres | # |
167 | 08aa5d9e | Serge Torres | # Scan the solutions file. |
168 | 08aa5d9e | Serge Torres | # |
169 | 08aa5d9e | Serge Torres | while ($line = <SVF>) |
170 | 08aa5d9e | Serge Torres | { |
171 | 08aa5d9e | Serge Torres | # Remove the '\n'. |
172 | 08aa5d9e | Serge Torres | chomp($line); |
173 | 08aa5d9e | Serge Torres | # Coalescing all consecutive spaces to one. |
174 | 08aa5d9e | Serge Torres | $line =~ s/(\s)+/ /g; |
175 | 08aa5d9e | Serge Torres | # Removing leading and trailling spaces. |
176 | 08aa5d9e | Serge Torres | $line =~ s/(^\s*)||(\s*$)//g; |
177 | 08aa5d9e | Serge Torres | # Only take into account the lines starting with "A[". |
178 | 08aa5d9e | Serge Torres | if (! ($line =~ /^A\[/)) |
179 | 08aa5d9e | Serge Torres | { |
180 | 08aa5d9e | Serge Torres | next; |
181 | 08aa5d9e | Serge Torres | } |
182 | 08aa5d9e | Serge Torres | # Remove syntatic sugar. |
183 | 08aa5d9e | Serge Torres | $line =~ s/.*=\[//; |
184 | 08aa5d9e | Serge Torres | $line =~ s/\]://; |
185 | 08aa5d9e | Serge Torres | $solutionVectorRef = []; |
186 | 08aa5d9e | Serge Torres | @$solutionVectorRef = split(/,/, $line); |
187 | 08aa5d9e | Serge Torres | for (my $i = 0 ; $i < @$solutionVectorRef ; $i++) |
188 | 08aa5d9e | Serge Torres | { |
189 | 08aa5d9e | Serge Torres | $$solutionVectorRef[$i] = Math::BigInt->new($$solutionVectorRef[$i]); |
190 | 08aa5d9e | Serge Torres | if($$solutionVectorRef[$i]->is_nan()) |
191 | 08aa5d9e | Serge Torres | { |
192 | 08aa5d9e | Serge Torres | print STDERR "\n\n\"$line\" from the solution vector file holds an invalid"; |
193 | 08aa5d9e | Serge Torres | print STDERR " number at index $i."; |
194 | 08aa5d9e | Serge Torres | print STDERR " Aborting the program!\n\n"; |
195 | 08aa5d9e | Serge Torres | exit($EX_DATAERR); |
196 | 08aa5d9e | Serge Torres | } |
197 | 08aa5d9e | Serge Torres | } # End for |
198 | 08aa5d9e | Serge Torres | push(@solutionMatrix, $solutionVectorRef); |
199 | 08aa5d9e | Serge Torres | } # End while ($line = <SVF>) |
200 | 08aa5d9e | Serge Torres | # |
201 | 08aa5d9e | Serge Torres | # Degree of the polynomial |
202 | 08aa5d9e | Serge Torres | # |
203 | 08aa5d9e | Serge Torres | $polynomialDegree = @{$solutionMatrix[0]} - 1; |
204 | 08aa5d9e | Serge Torres | if ($polynomialDegree < 0) |
205 | 08aa5d9e | Serge Torres | { |
206 | 08aa5d9e | Serge Torres | print STDERR "\n\n\"Polynomial degree ($polynomialDegree) is invalid:"; |
207 | 08aa5d9e | Serge Torres | print STDERR " it should be superior or equal to 0."; |
208 | 08aa5d9e | Serge Torres | print STDERR " Aborting the program!\n\n"; |
209 | 08aa5d9e | Serge Torres | exit($EX_DATAERR); |
210 | 08aa5d9e | Serge Torres | } |
211 | 08aa5d9e | Serge Torres | # |
212 | 08aa5d9e | Serge Torres | # Compute the chunk multipliers |
213 | 08aa5d9e | Serge Torres | # |
214 | 08aa5d9e | Serge Torres | # |
215 | 08aa5d9e | Serge Torres | # Shape a polynomial for Maple |
216 | 08aa5d9e | Serge Torres | # |
217 | 08aa5d9e | Serge Torres | for (my $i = 0 ; $i < @solutionMatrix ; $i++) |
218 | 08aa5d9e | Serge Torres | { |
219 | 08aa5d9e | Serge Torres | $polynomialString = "P:=$variableName->"; |
220 | 08aa5d9e | Serge Torres | for (my $j = 0 ; $j <= $polynomialDegree ; $j++) |
221 | 08aa5d9e | Serge Torres | { |
222 | 08aa5d9e | Serge Torres | if ($j != 0) |
223 | 08aa5d9e | Serge Torres | { |
224 | 08aa5d9e | Serge Torres | $polynomialString .= " + $variableName * (" |
225 | 08aa5d9e | Serge Torres | } |
226 | 08aa5d9e | Serge Torres | if (${$solutionMatrix[$i]}[$j] < 0) |
227 | 08aa5d9e | Serge Torres | { |
228 | 08aa5d9e | Serge Torres | $polynomialString .= "((${$solutionMatrix[$i]}[$j])"; |
229 | 08aa5d9e | Serge Torres | } |
230 | 08aa5d9e | Serge Torres | else |
231 | 08aa5d9e | Serge Torres | { |
232 | 08aa5d9e | Serge Torres | $polynomialString .= "(${$solutionMatrix[$i]}[$j]"; |
233 | 08aa5d9e | Serge Torres | } |
234 | 08aa5d9e | Serge Torres | #$polynomialString .= "* 2^$decPointPos)"; |
235 | 08aa5d9e | Serge Torres | $polynomialString .= "/2^$digits[$j]"; |
236 | 08aa5d9e | Serge Torres | #$polynomialString .= "+"; |
237 | 08aa5d9e | Serge Torres | if ($j != 0) |
238 | 08aa5d9e | Serge Torres | { |
239 | 08aa5d9e | Serge Torres | $polynomialString .= ") "; |
240 | 08aa5d9e | Serge Torres | } |
241 | 08aa5d9e | Serge Torres | } # End or $j |
242 | 08aa5d9e | Serge Torres | $polynomialString .= (')' x ($polynomialDegree + 1)); |
243 | 08aa5d9e | Serge Torres | $polynomialString .= ";"; |
244 | 08aa5d9e | Serge Torres | push(@polynomials, $polynomialString); |
245 | 08aa5d9e | Serge Torres | } # End for $i |
246 | 08aa5d9e | Serge Torres | print STDERR $polynomialString, "\n"; |
247 | 08aa5d9e | Serge Torres | #!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! |
248 | 08aa5d9e | Serge Torres | #exit(0); |
249 | 08aa5d9e | Serge Torres | #!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! |
250 | 08aa5d9e | Serge Torres | # |
251 | 08aa5d9e | Serge Torres | if ($debug) |
252 | 08aa5d9e | Serge Torres | { |
253 | 08aa5d9e | Serge Torres | print STDERR "\nNum digits: $numDigitsData\n"; |
254 | 08aa5d9e | Serge Torres | for (my $i = 0 ; $i < @digits ; $i++) |
255 | 08aa5d9e | Serge Torres | { |
256 | 08aa5d9e | Serge Torres | print STDERR "$digits[$i] "; |
257 | 08aa5d9e | Serge Torres | } |
258 | 08aa5d9e | Serge Torres | print SDTERR "\n"; |
259 | 08aa5d9e | Serge Torres | print STDERR "\n Solutions:\n"; |
260 | 08aa5d9e | Serge Torres | for (my $i = 0 ; $i < @solutionMatrix ; $i++) |
261 | 08aa5d9e | Serge Torres | { |
262 | 08aa5d9e | Serge Torres | for (my $j = 0 ; $j < @{$solutionMatrix[$i]} ; $j++) |
263 | 08aa5d9e | Serge Torres | { |
264 | 08aa5d9e | Serge Torres | print STDERR "${$solutionMatrix[$i]}[$j] "; |
265 | 08aa5d9e | Serge Torres | } # End for $j |
266 | 08aa5d9e | Serge Torres | print STDERR "\n" |
267 | 08aa5d9e | Serge Torres | } # End for $i |
268 | 08aa5d9e | Serge Torres | print STDERR "\n"; |
269 | 08aa5d9e | Serge Torres | print STDERR "\n"; |
270 | 08aa5d9e | Serge Torres | print STDERR "Degree of the polynomial: $polynomialDegree"; |
271 | 08aa5d9e | Serge Torres | print STDERR "\n"; |
272 | 08aa5d9e | Serge Torres | print STDERR "Polynomials:\n"; |
273 | 08aa5d9e | Serge Torres | foreach $elem (@polynomials) |
274 | 08aa5d9e | Serge Torres | { |
275 | 08aa5d9e | Serge Torres | print STDERR "$elem\n" |
276 | 08aa5d9e | Serge Torres | } |
277 | 08aa5d9e | Serge Torres | print STDERR "\n\n"; |
278 | 08aa5d9e | Serge Torres | } # End debug |
279 | 08aa5d9e | Serge Torres | # |
280 | 08aa5d9e | Serge Torres | # Run Maple and analyse the output. |
281 | 08aa5d9e | Serge Torres | # |
282 | 08aa5d9e | Serge Torres | # |
283 | 08aa5d9e | Serge Torres | # The interesting part is made of the three last lines. |
284 | 08aa5d9e | Serge Torres | # The last line is made of a simple prompt at the begining of the line: ">" |
285 | 08aa5d9e | Serge Torres | # |
286 | 08aa5d9e | Serge Torres | for (my $i = 0 ; $i < @polynomials ; $i++) |
287 | 08aa5d9e | Serge Torres | { |
288 | 08aa5d9e | Serge Torres | $mapleProgram = "with(numapprox);\n"; |
289 | 08aa5d9e | Serge Torres | $mapleProgram .= "Digits:=80;\n"; |
290 | 08aa5d9e | Serge Torres | $mapleProgram .= "interface(screenwidth=1000);"; |
291 | 08aa5d9e | Serge Torres | $mapleProgram .= $polynomials[$i]; |
292 | 08aa5d9e | Serge Torres | $mapleProgram .= "infnorm(($function-P(x)), x=$lowerBound..$upperBound, 'xmax');"; |
293 | 08aa5d9e | Serge Torres | $mapleResult = &runMaple($mapleProgram); |
294 | 08aa5d9e | Serge Torres | for (my $j = 0 ; $j < @$mapleResult; $j++) |
295 | 08aa5d9e | Serge Torres | { |
296 | 08aa5d9e | Serge Torres | if ($$mapleResult[$j] =~ /^> quit/) |
297 | 08aa5d9e | Serge Torres | { |
298 | 08aa5d9e | Serge Torres | # |
299 | 08aa5d9e | Serge Torres | # Removing leading and trailling spaces for the exponent line. |
300 | 08aa5d9e | Serge Torres | $$mapleResult[$j - 3] =~ s/(^\s*)||(\s*$)//g; |
301 | 08aa5d9e | Serge Torres | # Check if the exponent line is empty and, if not, that it is made of |
302 | 08aa5d9e | Serge Torres | # digits |
303 | 08aa5d9e | Serge Torres | if ($$mapleResult[$j - 3] ne "" && $$mapleResult[$j - 3] !~ /[:alpha:]/) |
304 | 08aa5d9e | Serge Torres | { |
305 | 08aa5d9e | Serge Torres | $infNorm = $$mapleResult[$j - 3]; |
306 | 08aa5d9e | Serge Torres | $powerOfTen = '(' . $$mapleResult[$j - 3] . '))'; |
307 | 08aa5d9e | Serge Torres | } |
308 | 08aa5d9e | Serge Torres | else |
309 | 08aa5d9e | Serge Torres | { |
310 | 08aa5d9e | Serge Torres | $infNorm = ""; |
311 | 08aa5d9e | Serge Torres | $powerOfTen = ""; |
312 | 08aa5d9e | Serge Torres | } |
313 | 08aa5d9e | Serge Torres | # Removing leading and trailling spaces. |
314 | 08aa5d9e | Serge Torres | $$mapleResult[$j - 2] =~ s/(^\s*)||(\s*$)//g; |
315 | 08aa5d9e | Serge Torres | print STDERR '.'; |
316 | 08aa5d9e | Serge Torres | if (length($powerOfTen) > 0) |
317 | 08aa5d9e | Serge Torres | { |
318 | 08aa5d9e | Serge Torres | @infNorm = split(/ /, $$mapleResult[$j - 2]); |
319 | 08aa5d9e | Serge Torres | $infNorm = sprintf("%.30f", |
320 | 08aa5d9e | Serge Torres | eval("$infNorm[0] * ($infNorm[1]**$powerOfTen")); |
321 | 08aa5d9e | Serge Torres | } |
322 | 08aa5d9e | Serge Torres | else |
323 | 08aa5d9e | Serge Torres | { |
324 | 08aa5d9e | Serge Torres | $infNorm = sprintf("%.30f",($$mapleResult[$j - 2] * 1)); |
325 | 08aa5d9e | Serge Torres | } |
326 | 08aa5d9e | Serge Torres | while(defined($sortHash{$infNorm})) |
327 | 08aa5d9e | Serge Torres | { |
328 | 08aa5d9e | Serge Torres | $infNorm .= ' '; |
329 | 08aa5d9e | Serge Torres | } |
330 | 08aa5d9e | Serge Torres | $sortHash{$infNorm} = $solutionMatrix[$i]; |
331 | 08aa5d9e | Serge Torres | } # End if ($$mapleResult[$j] =~ /^> quit/) |
332 | 08aa5d9e | Serge Torres | } # End for $j |
333 | 08aa5d9e | Serge Torres | } # End for $i |
334 | 08aa5d9e | Serge Torres | print STDERR "\n"; |
335 | 08aa5d9e | Serge Torres | @sortedInfNorms = sort {$a <=> $b} (keys(%sortHash)); |
336 | 08aa5d9e | Serge Torres | foreach $elem (@sortedInfNorms) |
337 | 08aa5d9e | Serge Torres | { |
338 | 08aa5d9e | Serge Torres | for (my $i = 0 ; $i < @{$sortHash{$elem}} ; $i ++) |
339 | 08aa5d9e | Serge Torres | { |
340 | 08aa5d9e | Serge Torres | print "${$sortHash{$elem}}[$i] "; |
341 | 08aa5d9e | Serge Torres | } |
342 | 08aa5d9e | Serge Torres | print "-\> "; |
343 | 08aa5d9e | Serge Torres | print sprintf("%.10e",eval($elem)),"\n"; |
344 | 08aa5d9e | Serge Torres | } |
345 | 08aa5d9e | Serge Torres | |
346 | 08aa5d9e | Serge Torres | # Uncomment this line and remove the next one if using stdExitErrors. |
347 | 08aa5d9e | Serge Torres | exit($EX_OK); |
348 | 08aa5d9e | Serge Torres | |
349 | 08aa5d9e | Serge Torres | ############################################################################## |
350 | 08aa5d9e | Serge Torres | # PROGRAM SUBS |
351 | 08aa5d9e | Serge Torres | ############################################################################## |
352 | 08aa5d9e | Serge Torres | # |
353 | 08aa5d9e | Serge Torres | ############################################################################## |
354 | 08aa5d9e | Serge Torres | # sub runMaple |
355 | 08aa5d9e | Serge Torres | ############################################################################## |
356 | 08aa5d9e | Serge Torres | # Performed task: runs Maple with a program and returns the answer |
357 | 08aa5d9e | Serge Torres | # |
358 | 08aa5d9e | Serge Torres | # input : $mapleProgram |
359 | 08aa5d9e | Serge Torres | # output : $mapleResultRef |
360 | 08aa5d9e | Serge Torres | # globals : none |
361 | 08aa5d9e | Serge Torres | # uses : none |
362 | 08aa5d9e | Serge Torres | # notes : none |
363 | 08aa5d9e | Serge Torres | # |
364 | 08aa5d9e | Serge Torres | sub runMaple { |
365 | 08aa5d9e | Serge Torres | my ($mapleProgram) = @_; |
366 | 08aa5d9e | Serge Torres | if (! defined($mapleProgram)) |
367 | 08aa5d9e | Serge Torres | { |
368 | 08aa5d9e | Serge Torres | my @call_info = caller(0); |
369 | 08aa5d9e | Serge Torres | print "\n\n", $call_info[3], " missing parameter. Aborting program!\n\n"; |
370 | 08aa5d9e | Serge Torres | # Uncomment this line and remove the next one if using stdExitErrors. |
371 | 08aa5d9e | Serge Torres | #exit($EX_SOFTWARE); |
372 | 08aa5d9e | Serge Torres | exit(1); |
373 | 08aa5d9e | Serge Torres | } |
374 | 08aa5d9e | Serge Torres | my $line = ""; |
375 | 08aa5d9e | Serge Torres | my $mapleResult = []; |
376 | 08aa5d9e | Serge Torres | #print STDERR $mapleProgram, "\n"; |
377 | 08aa5d9e | Serge Torres | open(MR, "echo \"$mapleProgram\" | $mapleApplication |"); |
378 | 08aa5d9e | Serge Torres | while($line = <MR>) |
379 | 08aa5d9e | Serge Torres | { |
380 | 08aa5d9e | Serge Torres | chomp($line); |
381 | 08aa5d9e | Serge Torres | push(@$mapleResult,$line); |
382 | 08aa5d9e | Serge Torres | } |
383 | 08aa5d9e | Serge Torres | return($mapleResult); |
384 | 08aa5d9e | Serge Torres | } # End runMaple |
385 | 08aa5d9e | Serge Torres | ############################################################################## |
386 | 08aa5d9e | Serge Torres | # sub mySub |
387 | 08aa5d9e | Serge Torres | ############################################################################## |
388 | 08aa5d9e | Serge Torres | # Performed task: |
389 | 08aa5d9e | Serge Torres | # |
390 | 08aa5d9e | Serge Torres | # input : |
391 | 08aa5d9e | Serge Torres | # output : |
392 | 08aa5d9e | Serge Torres | # globals : |
393 | 08aa5d9e | Serge Torres | # uses : |
394 | 08aa5d9e | Serge Torres | # notes : |
395 | 08aa5d9e | Serge Torres | # |
396 | 08aa5d9e | Serge Torres | sub mySub { |
397 | 08aa5d9e | Serge Torres | my ($someParameter) = @_; |
398 | 08aa5d9e | Serge Torres | if (! defined($someParameter)) |
399 | 08aa5d9e | Serge Torres | { |
400 | 08aa5d9e | Serge Torres | my @call_info = caller(0); |
401 | 08aa5d9e | Serge Torres | print "\n\n", $call_info[3], " missing parameter. Aborting program!\n\n"; |
402 | 08aa5d9e | Serge Torres | # Uncomment this line and remove the next one if using stdExitErrors. |
403 | 08aa5d9e | Serge Torres | #exit($EX_SOFTWARE); |
404 | 08aa5d9e | Serge Torres | exit(1); |
405 | 08aa5d9e | Serge Torres | } |
406 | 08aa5d9e | Serge Torres | } # End mySub |
407 | 08aa5d9e | Serge Torres | ############################################################################## |
408 | 08aa5d9e | Serge Torres | # sub $retv = _privateSubName($argv) |
409 | 08aa5d9e | Serge Torres | ############################################################################## |
410 | 08aa5d9e | Serge Torres | |
411 | 08aa5d9e | Serge Torres | sub _privateSubName |
412 | 08aa5d9e | Serge Torres | { |
413 | 08aa5d9e | Serge Torres | my $argv = shift(); |
414 | 08aa5d9e | Serge Torres | my $retv = undef; |
415 | 08aa5d9e | Serge Torres | return($retv); |
416 | 08aa5d9e | Serge Torres | }; |
417 | 08aa5d9e | Serge Torres | # |
418 | 08aa5d9e | Serge Torres | ############################################################################## |
419 | 08aa5d9e | Serge Torres | # sub usage |
420 | 08aa5d9e | Serge Torres | ############################################################################## |
421 | 08aa5d9e | Serge Torres | # Performed task: checks the command line parameters |
422 | 08aa5d9e | Serge Torres | # |
423 | 08aa5d9e | Serge Torres | # input : none |
424 | 08aa5d9e | Serge Torres | # output : none |
425 | 08aa5d9e | Serge Torres | # globals : $ARGV,others... |
426 | 08aa5d9e | Serge Torres | # uses : none |
427 | 08aa5d9e | Serge Torres | # notes : |
428 | 08aa5d9e | Serge Torres | # |
429 | 08aa5d9e | Serge Torres | sub usage { |
430 | 08aa5d9e | Serge Torres | if (! defined($ARGV[4])) |
431 | 08aa5d9e | Serge Torres | { |
432 | 08aa5d9e | Serge Torres | my $scriptName = `basename $0`; |
433 | 08aa5d9e | Serge Torres | chomp $scriptName; |
434 | 08aa5d9e | Serge Torres | print STDERR "\n\nUsage: $scriptName numDigits solutionsFile \n"; |
435 | 08aa5d9e | Serge Torres | print STDERR " " , (" " x length("$scriptName ")); |
436 | 08aa5d9e | Serge Torres | print STDERR " function lowerBound upperBound\n\n"; |
437 | 08aa5d9e | Serge Torres | print STDERR " - digitsFile: the name of the file holding the number of digits\n"; |
438 | 08aa5d9e | Serge Torres | print STDERR " for each coefficient;\n"; |
439 | 08aa5d9e | Serge Torres | print STDERR " - solutionFile: the name of the solution vector file;\n"; |
440 | 08aa5d9e | Serge Torres | print STDERR " - function (e.g. \"cos(x)\", don't forget quoting);\n"; |
441 | 08aa5d9e | Serge Torres | print STDERR " - lowerBound (e.g. 0, don't forget quoting for complex expressions;\n"; |
442 | 08aa5d9e | Serge Torres | print STDERR " - upperBound (e.g. \"Pi/4\" , don't forget quoting for complex expressions;\n"; |
443 | 08aa5d9e | Serge Torres | # Uncomment this line and remove the next one if using stdExitErrors. |
444 | 08aa5d9e | Serge Torres | #exit($EX_USAGE); |
445 | 08aa5d9e | Serge Torres | exit(1); |
446 | 08aa5d9e | Serge Torres | } # End if |
447 | 08aa5d9e | Serge Torres | # Some initializations |
448 | 08aa5d9e | Serge Torres | $digitsFileName = $ARGV[0]; |
449 | 08aa5d9e | Serge Torres | $digitsFileName =~ s/"//g; |
450 | 08aa5d9e | Serge Torres | $solutionsFileName = $ARGV[1]; |
451 | 08aa5d9e | Serge Torres | $solutionsFileName =~ s/"//g; |
452 | 08aa5d9e | Serge Torres | $function = $ARGV[2]; |
453 | 08aa5d9e | Serge Torres | $function =~ s/"//g; |
454 | 08aa5d9e | Serge Torres | $lowerBound = $ARGV[3]; |
455 | 08aa5d9e | Serge Torres | $lowerBound =~ s/"//g; |
456 | 08aa5d9e | Serge Torres | $upperBound = $ARGV[4]; |
457 | 08aa5d9e | Serge Torres | $upperBound =~ s/"//g; |
458 | 08aa5d9e | Serge Torres | } # End usage |
459 | 08aa5d9e | Serge Torres | |
460 | 08aa5d9e | Serge Torres | |
461 | 08aa5d9e | Serge Torres | __END__ |