diff options
Diffstat (limited to 'src/fields.c')
| -rw-r--r-- | src/fields.c | 273 | 
1 files changed, 229 insertions, 44 deletions
diff --git a/src/fields.c b/src/fields.c index bfd1f39..7be84df 100644 --- a/src/fields.c +++ b/src/fields.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. @@ -23,6 +23,13 @@ limitations under the License.  #include "polynomial.h"  #include "array.h"  #include "rational.h" +#include "tree.h" + +//--------------------------------------------------------------------- +// +//                              Fields_Table +// +//---------------------------------------------------------------------  // init and free for Fields_Table  int init_Fields_Table(Fields_Table* fields){ @@ -30,7 +37,7 @@ int init_Fields_Table(Fields_Table* fields){    init_Int_Array(&((*fields).external),FIELDS_SIZE);    init_Int_Array(&((*fields).internal),FIELDS_SIZE);    init_Identities(&((*fields).ids), FIELDS_SIZE); -  init_Symbols(&((*fields).symbols), FIELDS_SIZE); +  init_Virtual_fields(&((*fields).virtual_fields), FIELDS_SIZE);    init_Int_Array(&((*fields).fermions),FIELDS_SIZE);    init_Int_Array(&((*fields).noncommuting),FIELDS_SIZE);    return(0); @@ -40,7 +47,7 @@ int free_Fields_Table(Fields_Table fields){    free_Int_Array(fields.external);    free_Int_Array(fields.internal);    free_Identities(fields.ids); -  free_Symbols(fields.symbols); +  free_Virtual_fields(fields.virtual_fields);    free_Int_Array(fields.fermions);    free_Int_Array(fields.noncommuting);    return(0); @@ -57,11 +64,11 @@ int field_type(int index, Fields_Table fields){    else if(int_array_find(abs(index), fields.internal)>=0){      return(FIELD_INTERNAL);    } -  else if(intlist_find(fields.symbols.indices, fields.symbols.length, index)>=0){ -    return(FIELD_SYMBOL); +  else if(intlist_find(fields.virtual_fields.indices, fields.virtual_fields.length, index)>=0){ +    return(FIELD_VIRTUAL);    } -  fprintf(stderr,"error: index %d is neither a parameter nor an external or an internal field, nor a symbol\n",index); +  fprintf(stderr,"error: index %d is neither a parameter nor an external or an internal field, nor a virtual field\n",index);    exit(-1);  } @@ -86,7 +93,11 @@ int is_noncommuting(int index, Fields_Table fields){  } -// ------------------ Identities -------------------- +//--------------------------------------------------------------------- +// +//                               Identities +// +//---------------------------------------------------------------------  // allocate memory  int init_Identities(Identities* identities,int size){ @@ -314,6 +325,11 @@ int int_array_is_subarray_noncommuting(Int_Array input, Int_Array test_array, Fi    int match_nc;    int first=-1; +  // cannot fit +  if(test_array.length<input.length){ +    return(-1); +  } +    // bound noncommuting elements    while(is_noncommuting(input.values[post_nc], fields)==1){      post_nc++; @@ -324,7 +340,7 @@ int int_array_is_subarray_noncommuting(Int_Array input, Int_Array test_array, Fi        match_nc=1;      }      for(j=1;j<post_nc;j++){ -      if(test_array.values[i+j]!=input.values[j]){ +      if(i+j>=test_array.length || test_array.values[i+j]!=input.values[j]){  	match_nc=0;        }      } @@ -359,57 +375,61 @@ int int_array_is_subarray_noncommuting(Int_Array input, Int_Array test_array, Fi  } -// ------------------ Symbols -------------------- +//--------------------------------------------------------------------- +// +//                                Virtual_fields +// +//---------------------------------------------------------------------  // allocate memory -int init_Symbols(Symbols* symbols,int size){ -  (*symbols).indices=calloc(size,sizeof(int)); -  (*symbols).expr=calloc(size,sizeof(Polynomial)); -  (*symbols).length=0; -  (*symbols).memory=size; +int init_Virtual_fields(Virtual_fields* virtual_fields,int size){ +  (*virtual_fields).indices=calloc(size,sizeof(int)); +  (*virtual_fields).expr=calloc(size,sizeof(Polynomial)); +  (*virtual_fields).length=0; +  (*virtual_fields).memory=size;    return(0);  }  // free memory -int free_Symbols(Symbols symbols){ +int free_Virtual_fields(Virtual_fields virtual_fields){    int i; -  for(i=0;i<symbols.length;i++){ -    free_Polynomial(symbols.expr[i]); +  for(i=0;i<virtual_fields.length;i++){ +    free_Polynomial(virtual_fields.expr[i]);    } -  free(symbols.indices); -  free(symbols.expr); +  free(virtual_fields.indices); +  free(virtual_fields.expr);    return(0);  }  // resize -int resize_symbols(Symbols* symbols,int new_size){ -  Symbols new_symbols; +int resize_virtual_fields(Virtual_fields* virtual_fields,int new_size){ +  Virtual_fields new_virtual_fields;    int i; -  init_Symbols(&new_symbols,new_size); -  for(i=0;i<(*symbols).length;i++){ -    new_symbols.indices[i]=(*symbols).indices[i]; -    new_symbols.expr[i]=(*symbols).expr[i]; +  init_Virtual_fields(&new_virtual_fields,new_size); +  for(i=0;i<(*virtual_fields).length;i++){ +    new_virtual_fields.indices[i]=(*virtual_fields).indices[i]; +    new_virtual_fields.expr[i]=(*virtual_fields).expr[i];    } -  new_symbols.length=(*symbols).length; +  new_virtual_fields.length=(*virtual_fields).length; -  free((*symbols).indices); -  free((*symbols).expr); +  free((*virtual_fields).indices); +  free((*virtual_fields).expr); -  *symbols=new_symbols; +  *virtual_fields=new_virtual_fields;    return(0);  }  // copy -int symbols_cpy(Symbols input, Symbols* output){ -  init_Symbols(output,input.length); -  symbols_cpy_noinit(input,output); +int virtual_fields_cpy(Virtual_fields input, Virtual_fields* output){ +  init_Virtual_fields(output,input.length); +  virtual_fields_cpy_noinit(input,output);    return(0);  } -int symbols_cpy_noinit(Symbols input, Symbols* output){ +int virtual_fields_cpy_noinit(Virtual_fields input, Virtual_fields* output){    int i;    if((*output).memory<input.length){ -    fprintf(stderr,"error: trying to copy a symbols collection of length %d to another with memory %d\n",input.length,(*output).memory); +    fprintf(stderr,"error: trying to copy a virtual fields collection of length %d to another with memory %d\n",input.length,(*output).memory);      exit(-1);    }    for(i=0;i<input.length;i++){ @@ -421,12 +441,12 @@ int symbols_cpy_noinit(Symbols input, Symbols* output){    return(0);  } -// append an element to a symbols -int symbols_append(int index, Polynomial expr, Symbols* output){ +// append an element to a virtual_fields +int virtual_fields_append(int index, Polynomial expr, Virtual_fields* output){    int offset=(*output).length;    if((*output).length>=(*output).memory){ -    resize_symbols(output,2*(*output).memory+1); +    resize_virtual_fields(output,2*(*output).memory+1);    }    // copy and allocate @@ -436,12 +456,12 @@ int symbols_append(int index, Polynomial expr, Symbols* output){    (*output).length++;    return(0);  } -// append an element to a symbols without allocating memory -int symbols_append_noinit(int index, Polynomial expr, Symbols* output){ +// append an element to a virtual_fields without allocating memory +int virtual_fields_append_noinit(int index, Polynomial expr, Virtual_fields* output){    int offset=(*output).length;    if((*output).length>=(*output).memory){ -    resize_symbols(output,2*(*output).memory+1); +    resize_virtual_fields(output,2*(*output).memory+1);    }    // copy without allocating @@ -452,18 +472,22 @@ int symbols_append_noinit(int index, Polynomial expr, Symbols* output){    return(0);  } -// concatenate two symbolss -int symbols_concat(Symbols input, Symbols* output){ +// concatenate two virtual_fields +int virtual_fields_concat(Virtual_fields input, Virtual_fields* output){    int i;    for(i=0;i<input.length;i++){ -    symbols_append(input.indices[i],input.expr[i],output); +    virtual_fields_append(input.indices[i],input.expr[i],output);    }    return(0);  } -// ------------------ Groups -------------------- +//--------------------------------------------------------------------- +// +//                                 Groups +// +//---------------------------------------------------------------------  // allocate memory  int init_Groups(Groups* groups,int size){ @@ -570,3 +594,164 @@ int find_group(int index, Groups groups){    }    return(-1);  } + + +//--------------------------------------------------------------------- +// +//                               Variables +// +//--------------------------------------------------------------------- + +// allocate memory +int init_Variables(Variables* variables,int size){ +  (*variables).var_names=calloc(size,sizeof(Char_Array)); +  (*variables).symbol_trees=calloc(size,sizeof(Tree)); +  (*variables).length=0; +  (*variables).memory=size; +  return(0); +} + +// free memory +int free_Variables(Variables variables){ +  int i; +  for(i=0;i<variables.length;i++){ +    free_Char_Array(variables.var_names[i]); +    free_Tree(variables.symbol_trees[i]); +  } +  free(variables.var_names); +  free(variables.symbol_trees); +  return(0); +} + +// resize +int resize_variables(Variables* variables,int new_size){ +  Variables new_variables; +  int i; + +  init_Variables(&new_variables,new_size); +  for(i=0;i<(*variables).length;i++){ +    new_variables.var_names[i]=(*variables).var_names[i]; +    new_variables.symbol_trees[i]=(*variables).symbol_trees[i]; +  } +  new_variables.length=(*variables).length; + +  free((*variables).var_names); +  free((*variables).symbol_trees); + +  *variables=new_variables; +  return(0); +} + +// copy +int variables_cpy(Variables input, Variables* output){ +  init_Variables(output,input.length); +  variables_cpy_noinit(input,output); +  return(0); +} +int variables_cpy_noinit(Variables input, Variables* output){ +  int i; +  if((*output).memory<input.length){ +    fprintf(stderr,"error: trying to copy a variables collection of length %d to another with memory %d\n",input.length,(*output).memory); +    exit(-1); +  } +  for(i=0;i<input.length;i++){ +    char_array_cpy(input.var_names[i], (*output).var_names+i); +    tree_cpy(input.symbol_trees[i],(*output).symbol_trees+i); +  } +  (*output).length=input.length; +   +  return(0); +} + +// append an element to a variables collection +int variables_append(Char_Array var_name, Tree symbol_tree, Variables* output){ +  int offset=(*output).length; + +  if((*output).length>=(*output).memory){ +    resize_variables(output,2*(*output).memory+1); +  } + +  // copy and allocate +  char_array_cpy(var_name,(*output).var_names+offset); +  tree_cpy(symbol_tree,(*output).symbol_trees+offset); +  // increment length +  (*output).length++; +  return(0); +} +// append an element to a variables collection without allocating memory +int variables_append_noinit(Char_Array var_name, Tree symbol_tree, Variables* output){ +  int offset=(*output).length; + +  if((*output).length>=(*output).memory){ +    resize_variables(output,2*(*output).memory+1); +  } + +  // copy without allocating +  (*output).var_names[offset]=var_name; +  (*output).symbol_trees[offset]=symbol_tree; +  // increment length +  (*output).length++; +  return(0); +} + +// concatenate two variables collections +int variables_concat(Variables input, Variables* output){ +  int i; +  for(i=0;i<input.length;i++){ +    variables_append(input.var_names[i], input.symbol_trees[i], output); +  } +  return(0); +} + + +// find a variable matching a var_name +int variables_find_var(Char_Array name, Variables variables, Tree* output){ +  Char_Array varname; +  int i; + +  // drop inital '$' +  char_array_substring(name, 1, name.length-1, &varname); +  for(i=0;i<variables.length;i++){ +    if(char_array_cmp(varname, variables.var_names[i])==1){ +      tree_cpy(variables.symbol_trees[i], output); +      break; +    } +  } + +  // error if no variable was found +  if(i==variables.length){ +    fprintf(stderr, "error: variable '$%s' not found\n",char_array_to_str_noinit(&varname)); +    exit(-1); +  } +  free_Char_Array(varname); + +  return(0); +} + + +// add a polynomials as a new named variable +int add_polynomial_to_variables(char* name, Polynomial polynomial, Variables* variables){ +  // save polynomial to string (to convert it to a variable, it must first be a string) +  Char_Array poly_str; +  Char_Array out_name; +  Tree out_tree; + +  init_Char_Array(&poly_str, STR_SIZE); +  polynomial_sprint(polynomial, &poly_str); + +  // convert name to Char_Array +  init_Char_Array(&out_name,STR_SIZE); +  char_array_append_str(name, &out_name); + +  // trivial tree containing the polynomial +  init_Tree(&out_tree,0,poly_str.length); +  tree_set_label(poly_str, &out_tree); +  free_Char_Array(poly_str); + +  // add variable +  variables_append(out_name, out_tree, variables); +  free_Tree(out_tree); +  free_Char_Array(out_name); + +  return 0; +}  | 
