diff options
author | Ian Jauslin <ian@jauslin.org> | 2022-06-14 09:26:07 +0200 |
---|---|---|
committer | Ian Jauslin <ian@jauslin.org> | 2022-06-14 09:46:36 +0200 |
commit | 3f0510629e422e979b57d3f93791937912a4183a (patch) | |
tree | bf2589b2689044261b0cd4d9e6b3082194fdd9e9 /src/polynomial.c | |
parent | 469bdc80712dbf9c12562059dc4594620b59a076 (diff) |
The update to version 1.5 is rather substantial, and introduces some minor
backward-incompatibilities:
* The header "#!symbols" has been replaced by "#!virtual_fields"
* Multiplying polynomials using the '*' symbol is no longer supported (or,
rather, the symbolic capabilities of meankondo were enhanced, and the
syntax has been changed).
* 'meantools exp' has been removed (its functionality is now handled by
other means)
* 'meantoolds derive' has been replaced by 'meantools differentiate'
* The symbolic capabilities were enhanced: polynomials can now be
multiplied, added, exponentiated, and their logarithms can be taken
directly in the configuration file.
* The flow equation can now be processed after being computed using the
various "#!postprocess_*" entries.
* Deprecated kondo_preprocess.
* Compute the mean using an LU decomposition if possible.
* More detailed checks for syntax errors in configuration file.
* Check that different '#!group' entries are indeed uncorrelated.
* New flags in meankondo: '-p' and '-A'.
* New tool: meantools expand.
* Improve conversion to LaTeX using meantools-convert
* Assign terms randomly to different threads.
* Created vim files to implement syntax highlighting for configuration
files.
* Multiple bug fixes
Diffstat (limited to 'src/polynomial.c')
-rw-r--r-- | src/polynomial.c | 77 |
1 files changed, 69 insertions, 8 deletions
diff --git a/src/polynomial.c b/src/polynomial.c index d082b60..fae0c08 100644 --- a/src/polynomial.c +++ b/src/polynomial.c @@ -1,5 +1,5 @@ /* -Copyright 2015 Ian Jauslin +Copyright 2015-2022 Ian Jauslin Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -27,6 +27,7 @@ limitations under the License. #include "array.h" #include "number.h" #include "fields.h" +#include "parse_file.h" // allocate memory @@ -368,7 +369,7 @@ int polynomial_prod_chain_nosimplify(Polynomial input, Polynomial* inout, Fields Int_Array out_monomial; Int_Array out_factor; Number out_num; - // save length of inout (which changes during the loop + // save length of inout (which changes during the loop) int inout_length=(*inout).length; // first position in input which can multiply a term of inout without vanishing int firstpos; @@ -630,8 +631,8 @@ int remove_unmatched_plusminus(Polynomial* polynomial, Fields_Table fields){ match_internals--; } } - // don't remove a term containing symbols - else if(type==FIELD_SYMBOL){ + // don't remove a term containing virtual_field + else if(type==FIELD_VIRTUAL){ match_internals=0; break; } @@ -1093,7 +1094,7 @@ int polynomial_print(Polynomial polynomial){ Char_Array buffer; init_Char_Array(&buffer, STR_SIZE); polynomial_sprint(polynomial, &buffer); - printf("%s",buffer.str); + printf("%s",char_array_to_str_noinit(&buffer)); free_Char_Array(buffer); return(0); } @@ -1104,7 +1105,7 @@ int polynomial_print(Polynomial polynomial){ #define PP_MONOMIAL_MODE 2 #define PP_FACTOR_MODE 3 #define PP_NUMBER_MODE 4 -int Char_Array_to_Polynomial(Char_Array str_polynomial,Polynomial* output){ +int Char_Array_to_Polynomial(Char_Array str_polynomial, Polynomial* output){ // buffer char* buffer=calloc(str_polynomial.length+1,sizeof(char)); char* buffer_ptr=buffer; @@ -1115,6 +1116,7 @@ int Char_Array_to_Polynomial(Char_Array str_polynomial,Polynomial* output){ int comment=0; int i,j; int parenthesis_count=0; + int ret; // allocate memory init_Polynomial(output,POLY_SIZE); @@ -1174,6 +1176,10 @@ int Char_Array_to_Polynomial(Char_Array str_polynomial,Polynomial* output){ init_Int_Array(&factor, MONOMIAL_SIZE); num=number_one(); } + else{ + fprintf(stderr,"syntax error: misplaced '+' in polynomial\n"); + exit(-1); + } break; // enter monomial or factor mode @@ -1181,6 +1187,10 @@ int Char_Array_to_Polynomial(Char_Array str_polynomial,Polynomial* output){ if(mode==PP_NULL_MODE){ mode=PP_BRACKET_MODE; } + else{ + fprintf(stderr,"syntax error: misplaced '[' in polynomial\n"); + exit(-1); + } break; // factor mode case 'l': @@ -1189,6 +1199,10 @@ int Char_Array_to_Polynomial(Char_Array str_polynomial,Polynomial* output){ buffer_ptr=buffer; *buffer_ptr='\0'; } + else{ + fprintf(stderr,"syntax error: misplaced 'l' in polynomial\n"); + exit(-1); + } break; // monomial mode case 'f': @@ -1197,16 +1211,30 @@ int Char_Array_to_Polynomial(Char_Array str_polynomial,Polynomial* output){ buffer_ptr=buffer; *buffer_ptr='\0'; } + else{ + fprintf(stderr,"syntax error: misplaced 'j' in polynomial\n"); + exit(-1); + } break; // read monomial or factor case ']': sscanf(buffer,"%d",&i); + ret=read_int(buffer,&i); + if(ret<0){ + fprintf(stderr,"syntax error: in polynomial, expected integer field or factor index, got '%s'\n",buffer); + exit(-1); + } + if(mode==PP_FACTOR_MODE){ int_array_append(i,&factor); } else if(mode==PP_MONOMIAL_MODE){ int_array_append(i,&monomial); } + else{ + fprintf(stderr,"syntax error: mismatched ']' in polynomial\n"); + exit(-1); + } // switch back to null mode mode=PP_NULL_MODE; break; @@ -1224,6 +1252,10 @@ int Char_Array_to_Polynomial(Char_Array str_polynomial,Polynomial* output){ parenthesis_count++; buffer_ptr=str_addchar(buffer_ptr,str_polynomial.str[j]); } + else{ + fprintf(stderr,"syntax error: misplaced '(' in polynomial\n"); + exit(-1); + } break; case ')': if(mode==PP_NUMBER_MODE){ @@ -1240,11 +1272,14 @@ int Char_Array_to_Polynomial(Char_Array str_polynomial,Polynomial* output){ buffer_ptr=str_addchar(buffer_ptr,str_polynomial.str[j]); } } + else{ + fprintf(stderr,"syntax error: mismatched ')' in polynomial\n"); + exit(-1); + } break; // characters to ignore case ' ':break; - case '&':break; case '\n':break; // comments @@ -1257,6 +1292,10 @@ int Char_Array_to_Polynomial(Char_Array str_polynomial,Polynomial* output){ // write to buffer buffer_ptr=str_addchar(buffer_ptr,str_polynomial.str[j]); } + else{ + fprintf(stderr,"syntax error: in polynomial, unrecognized character '%c'\n",str_polynomial.str[j]); + exit(-1); + } break; } } @@ -1270,7 +1309,7 @@ int Char_Array_to_Polynomial(Char_Array str_polynomial,Polynomial* output){ } // with str input -int str_to_Polynomial(char* str_polynomial,Polynomial* output){ +int str_to_Polynomial(char* str_polynomial, Polynomial* output){ Char_Array buffer; str_to_char_array(str_polynomial, &buffer); Char_Array_to_Polynomial(buffer, output); @@ -1278,6 +1317,15 @@ int str_to_Polynomial(char* str_polynomial,Polynomial* output){ return(0); } +// check whether the polynomial is a constant +int polynomial_is_number(Polynomial poly){ + if(poly.length==0 || (poly.length==1 && poly.monomials[0].length==0 && poly.factors[0].length==0)){ + return(1); + } + else{ + return(0); + } +} // -------------------- Polynomial_Matrix --------------------- @@ -1307,3 +1355,16 @@ int free_Polynomial_Matrix(Polynomial_Matrix matrix){ free(matrix.indices); return(0); } + +// check whether the entries are numbers +int polynomial_matrix_is_numeric(Polynomial_Matrix matrix){ + int i,j; + for(i=0;i<matrix.length;i++){ + for(j=0;j<matrix.length;j++){ + if(polynomial_is_number(matrix.matrix[i][j])==0){ + return(0); + } + } + } + return(1); +} |