Ian Jauslin
summaryrefslogtreecommitdiff
blob: 1aca928dc118a067f724c13797f50618972ebb07 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
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);
}