diff options
Diffstat (limited to 'src/meantools_exp.c')
-rw-r--r-- | src/meantools_exp.c | 130 |
1 files changed, 130 insertions, 0 deletions
diff --git a/src/meantools_exp.c b/src/meantools_exp.c new file mode 100644 index 0000000..1aca928 --- /dev/null +++ b/src/meantools_exp.c @@ -0,0 +1,130 @@ +/* +Copyright 2015 Ian Jauslin + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +#include "meantools_exp.h" + +#include <stdio.h> +#include <stdlib.h> +#include "parse_file.h" +#include "cli_parser.h" +#include "polynomial.h" +#include "fields.h" +#include "grouped_polynomial.h" +#include "idtable.h" + +// read command line arguments +int tool_exp_read_args(int argc, const char* argv[], Str_Array* str_args){ + // file to read the polynomial from in flow mode + const char* file=""; + // whether a file was specified on the command-line + int exists_file=0; + + if(argc>=3){ + file=argv[2]; + exists_file=1; + } + read_config_file(str_args, file, 1-exists_file); + + return(0); +} + + +// compute the exponential of the input polynomial +int tool_exp(Str_Array str_args){ + // index of the entry in the input file + int arg_index; + // list of fields + Fields_Table fields; + // input polynomial + Polynomial poly; + // exp as a polynomial + Polynomial exp_poly; + // list of rccs + Id_Table idtable; + // exp + Grouped_Polynomial exp; + int i,j; + + // parse fields + arg_index=find_str_arg("fields", str_args); + if(arg_index<0){ + fprintf(stderr,"error: no fields entry in the configuration file\n"); + exit(-1); + } + else{ + parse_input_fields(str_args.strs[arg_index],&fields); + } + + // parse id table + arg_index=find_str_arg("id_table", str_args); + if(arg_index<0){ + fprintf(stderr,"error: no id table entry in the configuration file\n"); + exit(-1); + } + else{ + parse_input_id_table(str_args.strs[arg_index],&idtable, fields); + } + + // parse input polynomial + arg_index=find_str_arg("input_polynomial", str_args); + if(arg_index>=0){ + parse_input_polynomial(str_args.strs[arg_index],&poly, fields); + } + else{ + fprintf(stderr,"error: no input polynomial entry in the configuration file\n"); + exit(-1); + } + + // parse symbols + arg_index=find_str_arg("symbols", str_args); + if(arg_index>=0){ + parse_input_symbols(str_args.strs[arg_index],&fields); + } + else{ + init_Symbols(&(fields.symbols),1); + } + + // parse identities + arg_index=find_str_arg("identities", str_args); + if(arg_index>=0){ + parse_input_identities(str_args.strs[arg_index],&fields); + } + else{ + init_Identities(&(fields.ids),1); + } + + // exp(V) + polynomial_exponential(poly,&exp_poly, fields); + // grouped representation + group_polynomial(exp_poly, &exp, idtable, fields); + free_Polynomial(exp_poly); + free_Polynomial(poly); + + // no denominators + for(i=0;i<exp.length;i++){ + for(j=0;j<exp.coefs[i].length;j++){ + exp.coefs[i].denoms[j].power=0; + } + } + + grouped_polynomial_print(exp,'%','%'); + + // free memory + free_Fields_Table(fields); + free_Id_Table(idtable); + free_Grouped_Polynomial(exp); + return(0); +} |