001 /*
002 * $Id: ExpVectorTest.java 3344 2010-10-10 11:03:58Z kredel $
003 */
004
005 package edu.jas.poly;
006
007
008 import java.util.Arrays;
009 import java.util.List;
010 import java.util.ArrayList;
011
012 import junit.framework.Test;
013 import junit.framework.TestCase;
014 import junit.framework.TestSuite;
015
016 import org.apache.log4j.BasicConfigurator;
017
018 import edu.jas.arith.BigInteger;
019
020
021 /**
022 * ExpVector tests with JUnit.
023 * Tests arithmetic operations, for comparison tests @see TermOrderTest.java
024 * @author Heinz Kredel.
025 */
026
027 public class ExpVectorTest extends TestCase {
028
029 /**
030 * main
031 */
032 public static void main (String[] args) {
033 BasicConfigurator.configure();
034 junit.textui.TestRunner.run( suite() );
035 }
036
037 /**
038 * Constructs a <CODE>ExpVectorTest</CODE> object.
039 * @param name String.
040 */
041 public ExpVectorTest(String name) {
042 super(name);
043 }
044
045 /**
046 */
047 public static Test suite() {
048 TestSuite suite= new TestSuite(ExpVectorTest.class);
049 return suite;
050 }
051
052 //private final static int bitlen = 100;
053
054 ExpVector a;
055 ExpVector b;
056 ExpVector c;
057 ExpVector d;
058
059 protected void setUp() {
060 a = b = c = d = null;
061 }
062
063 protected void tearDown() {
064 a = b = c = d = null;
065 }
066
067
068 /**
069 * Test constructor and toString.
070 *
071 */
072 public void testConstructor() {
073 a = ExpVector.create( 0 );
074 b = ExpVector.create( 0 );
075 assertEquals("() = ()",a,b);
076 assertEquals("length( () ) = 0",a.length(),0);
077 assertTrue("isZERO( () )",a.isZERO());
078
079 a = ExpVector.create( 10 );
080 b = ExpVector.create( 10 );
081 assertEquals("10e = 10e",a,b);
082 assertEquals("length( 10e ) = 10",a.length(),10);
083 assertTrue("isZERO( ( 10e ) )",a.isZERO());
084
085 String s = "(0,0,0,0,0,0,0,0,0,0)";
086 a = ExpVector.create( s );
087 String t = a.toString().substring(0,s.length());
088
089 assertEquals("stringConstr = toString",s,t);
090 assertTrue("isZERO( ( 10e ) )",a.isZERO());
091 }
092
093
094 /**
095 * Test random integer.
096 *
097 */
098 public void testRandom() {
099 float q = (float) 0.2;
100
101 a = ExpVector.EVRAND(5,10,q);
102 String s = a.toString();
103 if ( s.indexOf(":") >= 0 ) {
104 s = s.substring(0,s.indexOf(":"));
105 }
106 b = ExpVector.create( s );
107
108 assertEquals("a == b", true, a.equals(b) );
109
110 c = ExpVector.EVDIF(b,a);
111
112 assertTrue("a-b = 0",c.isZERO());
113 }
114
115
116 /**
117 * Test addition.
118 *
119 */
120 public void testAddition() {
121 float q = (float) 0.2;
122
123 a = ExpVector.EVRAND(5,10,q);
124
125 b = ExpVector.EVSUM(a,a);
126 c = ExpVector.EVDIF(b,a);
127
128 assertEquals("a+a-a = a",c,a);
129 assertTrue("a+a-a = a", c.equals(a) );
130
131 boolean t;
132 t = ExpVector.EVMT(b,a);
133 assertTrue("a | a+a", t );
134
135 a = ExpVector.EVRAND(5,10,q);
136 b = ExpVector.EVRAND(5,10,q);
137
138 c = ExpVector.EVSUM(a,b);
139 d = ExpVector.EVSUM(b,a);
140 assertTrue("a+b = b+a", c.equals(d) );
141 }
142
143
144 /**
145 * Test lcm.
146 *
147 */
148 public void testLcm() {
149 float q = (float) 0.2;
150
151 a = ExpVector.EVRAND(5,10,q);
152 b = ExpVector.EVRAND(5,10,q);
153 c = ExpVector.EVLCM(a,b);
154 d = ExpVector.EVLCM(b,a);
155
156 assertTrue("lcm(a,b) = lcm(b,a)", c.equals(d) );
157
158 assertTrue("a | lcm(a,b)", ExpVector.EVMT(c,a) );
159 assertTrue("b | lcm(a,b)", ExpVector.EVMT(c,b) );
160
161 d = ExpVector.EVDIF(c,a);
162 assertTrue("sign(lcm(a,b)-a) >= 0", ExpVector.EVSIGN(d) >= 0 );
163 d = ExpVector.EVDIF(c,b);
164 assertTrue("sign(lcm(a,b)-b) >= 0", ExpVector.EVSIGN(d) >= 0 );
165 }
166
167 /**
168 * Test tdeg.
169 *
170 */
171 public void testTdeg() {
172 a = ExpVector.create( 100 );
173 assertTrue("tdeg(a) = 0", ExpVector.EVTDEG(a) == 0 );
174
175 float q = (float) 0.2;
176
177 a = ExpVector.EVRAND(5,10,q);
178 b = ExpVector.EVRAND(5,10,q);
179
180 assertTrue("tdeg(a) >= 0", ExpVector.EVTDEG(a) >= 0 );
181 assertTrue("tdeg(b) >= 0", ExpVector.EVTDEG(b) >= 0 );
182
183 c = ExpVector.EVSUM(a,b);
184 assertTrue("tdeg(a+b) >= tdeg(a)",
185 ExpVector.EVTDEG(c) >=
186 ExpVector.EVTDEG(a) );
187 assertTrue("tdeg(a+b) >= tdeg(b)",
188 ExpVector.EVTDEG(c) >=
189 ExpVector.EVTDEG(b) );
190
191 c = ExpVector.EVLCM(a,b);
192 assertTrue("tdeg(lcm(a,b)) >= tdeg(a)",
193 ExpVector.EVTDEG(c) >=
194 ExpVector.EVTDEG(a) );
195 assertTrue("tdeg(lcm(a,b)) >= tdeg(b)",
196 ExpVector.EVTDEG(c) >=
197 ExpVector.EVTDEG(b) );
198 }
199
200 /**
201 * Test weighted.
202 *
203 */
204 public void testWeightdeg() {
205 a = ExpVector.create( 100 );
206 assertTrue("tdeg(a) = 0", ExpVector.EVTDEG(a) == 0 );
207 assertTrue("wdeg(a) = 0", ExpVector.EVWDEG(null,a) == 0 );
208
209 float q = (float) 0.2;
210
211 a = ExpVector.EVRAND(5,10,q);
212 b = ExpVector.EVRAND(5,10,q);
213 long [][] w = new long [][] { new long[] { 1l, 1l, 1l, 1l, 1l } };
214
215 assertTrue("tdeg(a) >= 0", ExpVector.EVTDEG(a) >= 0 );
216 assertTrue("tdeg(b) >= 0", ExpVector.EVTDEG(b) >= 0 );
217
218 assertTrue("wdeg(a) >= 0", ExpVector.EVWDEG(w,a) >= 0 );
219 assertTrue("wdeg(b) >= 0", ExpVector.EVWDEG(w,b) >= 0 );
220
221 assertEquals("tdeg(a) == wdeg(a)", ExpVector.EVTDEG(a), ExpVector.EVWDEG(w,a) );
222 assertEquals("tdeg(b) == wdeg(b)", ExpVector.EVTDEG(b), ExpVector.EVWDEG(w,b) );
223
224 c = ExpVector.EVSUM(a,b);
225 assertTrue("wdeg(a+b) >= wdeg(a)",
226 ExpVector.EVWDEG(w,c) >=
227 ExpVector.EVWDEG(w,a) );
228 assertTrue("wdeg(a+b) >= wdeg(b)",
229 ExpVector.EVWDEG(w,c) >=
230 ExpVector.EVWDEG(w,b) );
231
232 c = ExpVector.EVLCM(a,b);
233 assertTrue("wdeg(lcm(a,b)) >= wdeg(a)",
234 ExpVector.EVWDEG(w,c) >=
235 ExpVector.EVWDEG(w,a) );
236 assertTrue("wdeg(lcm(a,b)) >= wdeg(b)",
237 ExpVector.EVWDEG(w,c) >=
238 ExpVector.EVWDEG(w,b) );
239
240
241 w = new long [][] { new long[] { 10l, 1l, 3l, 9l, 100l } };
242
243 assertTrue("tdeg(a) >= 0", ExpVector.EVTDEG(a) >= 0 );
244 assertTrue("tdeg(b) >= 0", ExpVector.EVTDEG(b) >= 0 );
245
246 assertTrue("wdeg(a) >= 0", ExpVector.EVWDEG(w,a) >= 0 );
247 assertTrue("wdeg(b) >= 0", ExpVector.EVWDEG(w,b) >= 0 );
248
249 assertTrue("tdeg(a) <= wdeg(a)", ExpVector.EVTDEG(a) <= ExpVector.EVWDEG(w,a) );
250 assertTrue("tdeg(b) <= wdeg(b)", ExpVector.EVTDEG(b) <= ExpVector.EVWDEG(w,b) );
251
252 c = ExpVector.EVSUM(a,b);
253 assertTrue("wdeg(a+b) >= wdeg(a)",
254 ExpVector.EVWDEG(w,c) >=
255 ExpVector.EVWDEG(w,a) );
256 assertTrue("wdeg(a+b) >= wdeg(b)",
257 ExpVector.EVWDEG(w,c) >=
258 ExpVector.EVWDEG(w,b) );
259
260 c = ExpVector.EVLCM(a,b);
261 assertTrue("wdeg(lcm(a,b)) >= wdeg(a)",
262 ExpVector.EVWDEG(w,c) >=
263 ExpVector.EVWDEG(w,a) );
264 assertTrue("wdeg(lcm(a,b)) >= wdeg(b)",
265 ExpVector.EVWDEG(w,c) >=
266 ExpVector.EVWDEG(w,b) );
267
268
269 w = new long [][] { new long[] { 10l, 1l, 3l, 9l, 100l },
270 new long[] { 1l, 1l, 1l, 1l, 1l } };
271
272 assertTrue("tdeg(a) >= 0", ExpVector.EVTDEG(a) >= 0 );
273 assertTrue("tdeg(b) >= 0", ExpVector.EVTDEG(b) >= 0 );
274
275 assertTrue("wdeg(a) >= 0", ExpVector.EVWDEG(w,a) >= 0 );
276 assertTrue("wdeg(b) >= 0", ExpVector.EVWDEG(w,b) >= 0 );
277
278 assertTrue("tdeg(a) <= wdeg(a)", ExpVector.EVTDEG(a) <= ExpVector.EVWDEG(w,a) );
279 assertTrue("tdeg(b) <= wdeg(b)", ExpVector.EVTDEG(b) <= ExpVector.EVWDEG(w,b) );
280
281 c = ExpVector.EVSUM(a,b);
282 assertTrue("wdeg(a+b) >= wdeg(a)",
283 ExpVector.EVWDEG(w,c) >=
284 ExpVector.EVWDEG(w,a) );
285 assertTrue("wdeg(a+b) >= wdeg(b)",
286 ExpVector.EVWDEG(w,c) >=
287 ExpVector.EVWDEG(w,b) );
288
289 c = ExpVector.EVLCM(a,b);
290 assertTrue("wdeg(lcm(a,b)) >= wdeg(a)",
291 ExpVector.EVWDEG(w,c) >=
292 ExpVector.EVWDEG(w,a) );
293 assertTrue("wdeg(lcm(a,b)) >= wdeg(b)",
294 ExpVector.EVWDEG(w,c) >=
295 ExpVector.EVWDEG(w,b) );
296
297 }
298
299
300 /**
301 * Test dependency on variables.
302 *
303 */
304 public void testDependency() {
305 int[] exp;
306 int[] dep;
307
308 a = ExpVector.create(10,5,2l);
309 exp = new int[] { 5 };
310 dep = ExpVector.EVDOV(a);
311 assertTrue("[5] = [5]",Arrays.equals(exp,dep));
312
313 b = ExpVector.create(10,3,9l);
314 exp = new int[] { 3 };
315 dep = ExpVector.EVDOV(b);
316 assertTrue("[3] = [3]",Arrays.equals(exp,dep));
317
318 c = ExpVector.EVSUM(a,b);
319 exp = new int[] { 3, 5 };
320 dep = ExpVector.EVDOV(c);
321 assertTrue("[3,5] = [3,5] "+Arrays.toString(exp)+","+Arrays.toString(dep),Arrays.equals(exp,dep));
322
323 b = ExpVector.create(10);
324 exp = new int[] { };
325 dep = ExpVector.EVDOV(b);
326 assertTrue("[] = []",Arrays.equals(exp,dep));
327
328 b = ExpVector.create(0);
329 exp = new int[] { };
330 dep = ExpVector.EVDOV(b);
331 assertTrue("[] = []",Arrays.equals(exp,dep));
332
333 b = ExpVector.create(1,0,1l);
334 exp = new int[] { 0 };
335 dep = ExpVector.EVDOV(b);
336 assertTrue("[0] = [0]",Arrays.equals(exp,dep));
337 }
338
339
340 /**
341 * Test random exp vector 2.
342 *
343 */
344 public void testRandom2() {
345 float q = (float) 0.2;
346
347 a = ExpVector.EVRAND(5,10,q);
348 b = ExpVector.create( "" + a );
349
350 assertEquals("a == b", true, a.equals(b) );
351
352 c = b.subtract(a);
353
354 assertTrue("a-b = 0",c.isZERO());
355 }
356
357
358 /**
359 * Test addition.
360 *
361 */
362 public void testAddition2() {
363 float q = (float) 0.2;
364
365 a = ExpVector.EVRAND(5,10,q);
366
367 b = a.sum(a);
368 c = b.subtract(a);
369
370 assertEquals("a+a-a = a",c,a);
371 assertTrue("a+a-a = a", c.equals(a) );
372
373 boolean t;
374 t = b.multipleOf(a);
375 assertTrue("a | a+a", t );
376
377 a = ExpVector.EVRAND(5,10,q);
378 b = ExpVector.EVRAND(5,10,q);
379
380 c = a.sum(b);
381 d = b.sum(a);
382 assertTrue("a+b = b+a", c.equals(d) );
383 }
384
385
386 /**
387 * Test lcm.
388 *
389 */
390 public void testLcm2() {
391 float q = (float) 0.2;
392
393 a = ExpVector.EVRAND(5,10,q);
394 b = ExpVector.EVRAND(5,10,q);
395 c = a.lcm(b);
396 d = b.lcm(a);
397
398 assertTrue("lcm(a,b) = lcm(b,a)", c.equals(d) );
399
400 assertTrue("a | lcm(a,b)", c.multipleOf(a) );
401 assertTrue("b | lcm(a,b)", c.multipleOf(b) );
402
403 d = c.subtract(a);
404 assertTrue("sign(lcm(a,b)-a) >= 0", d.signum() >= 0 );
405 d = c.subtract(b);
406 assertTrue("sign(lcm(a,b)-b) >= 0", d.signum() >= 0 );
407 }
408
409 /**
410 * Test tdeg.
411 *
412 */
413 public void testTdeg2() {
414 a = ExpVector.create( 100 );
415 assertTrue("tdeg(a) = 0", ExpVector.EVTDEG(a) == 0 );
416
417 float q = (float) 0.2;
418
419 a = ExpVector.EVRAND(5,10,q);
420 b = ExpVector.EVRAND(5,10,q);
421
422 assertTrue("tdeg(a) >= 0", ExpVector.EVTDEG(a) >= 0 );
423 assertTrue("tdeg(b) >= 0", ExpVector.EVTDEG(b) >= 0 );
424
425 c = a.sum(b);
426 assertTrue("tdeg(a+b) >= tdeg(a)",
427 ExpVector.EVTDEG(c) >=
428 ExpVector.EVTDEG(a) );
429 assertTrue("tdeg(a+b) >= tdeg(b)",
430 ExpVector.EVTDEG(c) >=
431 ExpVector.EVTDEG(b) );
432
433 c = a.lcm(b);
434 assertTrue("tdeg(lcm(a,b)) >= tdeg(a)",
435 ExpVector.EVTDEG(c) >=
436 ExpVector.EVTDEG(a) );
437 assertTrue("tdeg(lcm(a,b)) >= tdeg(b)",
438 ExpVector.EVTDEG(c) >=
439 ExpVector.EVTDEG(b) );
440 }
441
442 /**
443 * Test weighted.
444 *
445 */
446 public void testWeightdeg2() {
447 a = ExpVector.create( 100 );
448 assertTrue("tdeg(a) = 0", ExpVector.EVTDEG(a) == 0 );
449 assertTrue("wdeg(a) = 0", ExpVector.EVWDEG(null,a) == 0 );
450
451 float q = (float) 0.2;
452
453 a = ExpVector.EVRAND(5,10,q);
454 b = ExpVector.EVRAND(5,10,q);
455 long [][] w = new long [][] { new long[] { 1l, 1l, 1l, 1l, 1l } };
456
457 assertTrue("tdeg(a) >= 0", ExpVector.EVTDEG(a) >= 0 );
458 assertTrue("tdeg(b) >= 0", ExpVector.EVTDEG(b) >= 0 );
459
460 assertTrue("wdeg(a) >= 0", ExpVector.EVWDEG(w,a) >= 0 );
461 assertTrue("wdeg(b) >= 0", ExpVector.EVWDEG(w,b) >= 0 );
462
463 assertEquals("tdeg(a) == wdeg(a)", ExpVector.EVTDEG(a), ExpVector.EVWDEG(w,a) );
464 assertEquals("tdeg(b) == wdeg(b)", ExpVector.EVTDEG(b), ExpVector.EVWDEG(w,b) );
465
466 c = a.sum(b);
467 assertTrue("wdeg(a+b) >= wdeg(a)",
468 ExpVector.EVWDEG(w,c) >=
469 ExpVector.EVWDEG(w,a) );
470 assertTrue("wdeg(a+b) >= wdeg(b)",
471 ExpVector.EVWDEG(w,c) >=
472 ExpVector.EVWDEG(w,b) );
473
474 c = a.lcm(b);
475 assertTrue("wdeg(lcm(a,b)) >= wdeg(a)",
476 ExpVector.EVWDEG(w,c) >=
477 ExpVector.EVWDEG(w,a) );
478 assertTrue("wdeg(lcm(a,b)) >= wdeg(b)",
479 ExpVector.EVWDEG(w,c) >=
480 ExpVector.EVWDEG(w,b) );
481
482
483 w = new long [][] { new long[] { 10l, 1l, 3l, 9l, 100l } };
484
485 assertTrue("tdeg(a) >= 0", ExpVector.EVTDEG(a) >= 0 );
486 assertTrue("tdeg(b) >= 0", ExpVector.EVTDEG(b) >= 0 );
487
488 assertTrue("wdeg(a) >= 0", ExpVector.EVWDEG(w,a) >= 0 );
489 assertTrue("wdeg(b) >= 0", ExpVector.EVWDEG(w,b) >= 0 );
490
491 assertTrue("tdeg(a) <= wdeg(a)", ExpVector.EVTDEG(a) <= ExpVector.EVWDEG(w,a) );
492 assertTrue("tdeg(b) <= wdeg(b)", ExpVector.EVTDEG(b) <= ExpVector.EVWDEG(w,b) );
493
494 c = a.sum(b);
495 assertTrue("wdeg(a+b) >= wdeg(a)",
496 ExpVector.EVWDEG(w,c) >=
497 ExpVector.EVWDEG(w,a) );
498 assertTrue("wdeg(a+b) >= wdeg(b)",
499 ExpVector.EVWDEG(w,c) >=
500 ExpVector.EVWDEG(w,b) );
501
502 c = a.lcm(b);
503 assertTrue("wdeg(lcm(a,b)) >= wdeg(a)",
504 ExpVector.EVWDEG(w,c) >=
505 ExpVector.EVWDEG(w,a) );
506 assertTrue("wdeg(lcm(a,b)) >= wdeg(b)",
507 ExpVector.EVWDEG(w,c) >=
508 ExpVector.EVWDEG(w,b) );
509
510
511 w = new long [][] { new long[] { 10l, 1l, 3l, 9l, 100l },
512 new long[] { 1l, 1l, 1l, 1l, 1l } };
513
514 assertTrue("tdeg(a) >= 0", ExpVector.EVTDEG(a) >= 0 );
515 assertTrue("tdeg(b) >= 0", ExpVector.EVTDEG(b) >= 0 );
516
517 assertTrue("wdeg(a) >= 0", ExpVector.EVWDEG(w,a) >= 0 );
518 assertTrue("wdeg(b) >= 0", ExpVector.EVWDEG(w,b) >= 0 );
519
520 assertTrue("tdeg(a) <= wdeg(a)", ExpVector.EVTDEG(a) <= ExpVector.EVWDEG(w,a) );
521 assertTrue("tdeg(b) <= wdeg(b)", ExpVector.EVTDEG(b) <= ExpVector.EVWDEG(w,b) );
522
523 c = a.sum(b);
524 assertTrue("wdeg(a+b) >= wdeg(a)",
525 ExpVector.EVWDEG(w,c) >=
526 ExpVector.EVWDEG(w,a) );
527 assertTrue("wdeg(a+b) >= wdeg(b)",
528 ExpVector.EVWDEG(w,c) >=
529 ExpVector.EVWDEG(w,b) );
530
531 c = a.lcm(b);
532 assertTrue("wdeg(lcm(a,b)) >= wdeg(a)",
533 ExpVector.EVWDEG(w,c) >=
534 ExpVector.EVWDEG(w,a) );
535 assertTrue("wdeg(lcm(a,b)) >= wdeg(b)",
536 ExpVector.EVWDEG(w,c) >=
537 ExpVector.EVWDEG(w,b) );
538
539 }
540
541
542 /**
543 * Test dependency on variables.
544 *
545 */
546 public void testDependency2() {
547 int[] exp;
548 int[] dep;
549
550 a = ExpVector.create(10,5,2l);
551 exp = new int[] { 5 };
552 dep = a.dependencyOnVariables();
553 assertTrue("[5] = [5]",Arrays.equals(exp,dep));
554
555 b = ExpVector.create(10,3,9l);
556 exp = new int[] { 3 };
557 dep = b.dependencyOnVariables();
558 assertTrue("[3] = [3]",Arrays.equals(exp,dep));
559
560 c = a.sum(b);
561 exp = new int[] { 3, 5 };
562 dep = c.dependencyOnVariables();
563 assertTrue("[3,5] = [3,5] "+Arrays.toString(exp)+","+Arrays.toString(dep),Arrays.equals(exp,dep));
564
565 b = ExpVector.create(10);
566 exp = new int[] { };
567 dep = b.dependencyOnVariables();
568 assertTrue("[] = []",Arrays.equals(exp,dep));
569
570 b = ExpVector.create(0);
571 exp = new int[] { };
572 dep = b.dependencyOnVariables();
573 assertTrue("[] = []",Arrays.equals(exp,dep));
574
575 b = ExpVector.create(1,0,1l);
576 exp = new int[] { 0 };
577 dep = b.dependencyOnVariables();
578 assertTrue("[0] = [0]",Arrays.equals(exp,dep));
579 }
580
581
582 /**
583 * Test evaluation.
584 *
585 */
586 public void testEvaluation() {
587 float q = (float) 0.2;
588 int rl = 5;
589
590 a = ExpVector.EVRAND(rl,10,q);
591 b = ExpVector.EVRAND(rl,10,q);
592 BigInteger fv = new BigInteger(0);
593 List<BigInteger> v = new ArrayList<BigInteger>(a.length());
594 for ( int i = 0; i < a.length(); i++ ) {
595 v.add( fv.random(4) );
596 }
597
598 BigInteger av = a.evaluate(fv,v);
599 BigInteger bv = b.evaluate(fv,v);
600
601 c = a.sum(b);
602 BigInteger cv = c.evaluate(fv,v);
603 BigInteger dv = av.multiply(bv);
604
605 assertEquals("a(v)*b(v) = (a+b)(v) ", cv, dv);
606
607 c = ExpVector.create(rl);
608 cv = c.evaluate(fv,v);
609 dv = fv.getONE();
610 assertEquals("0(v) = 1 ", cv, dv);
611
612 v.clear();
613 for ( int i = 0; i < a.length(); i++ ) {
614 v.add( fv.getZERO() );
615 }
616 cv = c.evaluate(fv,v);
617 dv = fv.getONE();
618 assertEquals("0(0) = 1 ", cv, dv);
619
620 av = a.evaluate(fv,v);
621 if ( a.isZERO() ) {
622 dv = fv.getONE();
623 assertEquals("0(0) = 1 ", av, dv);
624 } else {
625 dv = fv.getZERO();
626 assertEquals("a(0) = 0 ", av, dv);
627 }
628 }
629
630 }