[493c477] | 1 | /* emacs edit mode for this file is -*- C++ -*- */ |
---|

[341696] | 2 | /* $Id$ */ |
---|

[2dd068] | 3 | |
---|

[e4fe2b] | 4 | #include "config.h" |
---|

[ab4548f] | 5 | |
---|

[650f2d8] | 6 | #include "cf_assert.h" |
---|

[c5323e] | 7 | |
---|

[2dd068] | 8 | #include "cf_defs.h" |
---|

| 9 | #include "cf_eval.h" |
---|

| 10 | |
---|

| 11 | static CanonicalForm evalCF ( const CanonicalForm & f, const CFArray & a, int m, int n ); |
---|

| 12 | |
---|

| 13 | |
---|

| 14 | Evaluation& Evaluation::operator= ( const Evaluation & e ) |
---|

| 15 | { |
---|

| 16 | if ( this != &e ) { |
---|

[806c18] | 17 | values = e.values; |
---|

[2dd068] | 18 | } |
---|

| 19 | return *this; |
---|

| 20 | } |
---|

| 21 | |
---|

| 22 | CanonicalForm |
---|

| 23 | Evaluation::operator() ( const CanonicalForm & f ) const |
---|

| 24 | { |
---|

| 25 | if ( f.inCoeffDomain() || f.level() < values.min() ) |
---|

[806c18] | 26 | return f; |
---|

[2dd068] | 27 | else if ( f.level() < values.max() ) |
---|

[806c18] | 28 | return evalCF( f, values, values.min(), f.level() ); |
---|

[2dd068] | 29 | else |
---|

[806c18] | 30 | return evalCF( f, values, values.min(), values.max() ); |
---|

[2dd068] | 31 | } |
---|

| 32 | |
---|

| 33 | CanonicalForm |
---|

| 34 | Evaluation::operator() ( const CanonicalForm & f, int i, int j ) const |
---|

| 35 | { |
---|

| 36 | if ( i > j ) |
---|

[806c18] | 37 | return f; |
---|

[2dd068] | 38 | return evalCF( f, values, i, j ); |
---|

| 39 | } |
---|

| 40 | |
---|

| 41 | void |
---|

| 42 | Evaluation::nextpoint() |
---|

| 43 | { |
---|

| 44 | int n = values.max(); |
---|

| 45 | for ( int i = values.min(); i <= n; i++ ) |
---|

[806c18] | 46 | values[i] += 1; |
---|

[2dd068] | 47 | } |
---|

| 48 | |
---|

[38ac8c] | 49 | void |
---|

| 50 | Evaluation::setValue(int i, const CanonicalForm& f) |
---|

| 51 | { |
---|

| 52 | if (i < values.min() || i > values.max()) |
---|

| 53 | return; |
---|

| 54 | values[i]= f; |
---|

| 55 | } |
---|

| 56 | |
---|

[c5323e] | 57 | #ifndef NOSTREAMIO |
---|

[181148] | 58 | OSTREAM& |
---|

| 59 | operator<< ( OSTREAM& s, const Evaluation &e ) |
---|

[2dd068] | 60 | { |
---|

[6400f5] | 61 | e.values.print(s); |
---|

[2dd068] | 62 | return s; |
---|

| 63 | } |
---|

[c5323e] | 64 | #endif /* NOSTREAMIO */ |
---|

[2dd068] | 65 | |
---|

| 66 | CanonicalForm |
---|

| 67 | evalCF ( const CanonicalForm & f, const CFArray & a, int m, int n ) |
---|

| 68 | { |
---|

| 69 | if ( m > n ) |
---|

[806c18] | 70 | return f; |
---|

[2dd068] | 71 | else { |
---|

[806c18] | 72 | CanonicalForm result = f; |
---|

| 73 | while ( n >= m ) { |
---|

| 74 | result = result( a[n], Variable( n ) ); |
---|

| 75 | n--; |
---|

| 76 | } |
---|

| 77 | return result; |
---|

[2dd068] | 78 | } |
---|

| 79 | // iterated method turned out to be faster than |
---|

| 80 | // return evalCF( f( a[n], Variable( n ) ), a, m, n-1 ); |
---|

| 81 | } |
---|