Ian Jauslin
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'src/meantools_exp.c')
-rw-r--r--src/meantools_exp.c130
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);
+}