// This file is part of fityk program. Copyright (C) Marcin Wojdyr
// Licence: GNU General Public License version 2
// $Id: mgr.h 322 2007-07-24 00:17:11Z wojdyr $
#ifndef FITYK__MGR__H__
#define FITYK__MGR__H__
#include "common.h"
class Variable;
class Function;
class Ftk;
class Sum;
/// keeps all functions and variables
class VariableManager
{
public:
bool silent;
VariableManager(Ftk const* F_) : silent(false), F(F_),
var_autoname_counter(0), func_autoname_counter(0) {}
~VariableManager();
void register_sum(Sum *s) { sums.push_back(s); }
void unregister_sum(Sum const *s);
/// if name is empty, variable name is generated automatically
/// name of created variable is returned
std::string assign_variable(std::string const &name,std::string const &rhs);
void sort_variables();
std::string assign_variable_copy(std::string const& name,
Variable const* orig,
std::map<int,std::string> const& varmap);
void delete_variables(std::vector<std::string> const &name);
///returns -1 if not found or idx in variables if found
int find_variable_nr(std::string const &name);
Variable const* find_variable(std::string const &name);
int find_nr_var_handling_param(int p);
Variable const* find_variable_handling_param(int p)
{ return variables[find_nr_var_handling_param(p)]; }
/// search for "simple" variable which handles parameter par
/// returns -1 if not found or idx in variables if found
int find_parameter_variable(int par);
/// remove unreffered variables and parameters
void remove_unreferred();
/// remove unreffered functions
void auto_remove_functions();
bool is_function_referred(int n) const;
std::string get_variable_info(std::string const &s, bool extended_print);
std::vector<fp> const& get_parameters() const { return parameters; }
std::vector<Variable*> const& get_variables() const { return variables; }
Variable const* get_variable(int n) const { return variables[n]; }
Variable* get_variable(int n) { return variables[n]; }
std::string assign_func(std::string const &name,
std::string const &function,
std::vector<std::string> const &vars,
bool parse_vars=true);
std::string assign_func_copy(std::string const &name,
std::string const &orig);
void substitute_func_param(std::string const &name,
std::string const ¶m,
std::string const &var);
void delete_funcs(std::vector<std::string> const &names);
void delete_funcs_and_vars(std::vector<std::string> const &xnames);
///returns -1 if not found or idx in variables if found
int find_function_nr(std::string const &name) const;
Function const* find_function(std::string const &name) const;
std::vector<Function*> const& get_functions() const { return functions; }
Function const* get_function(int n) const { return functions[n]; }
/// calculate value and derivatives of all variables;
/// do precomputations for all functions
void use_parameters();
void use_external_parameters(std::vector<fp> const &ext_param);
void put_new_parameters(std::vector<fp> const &aa);
fp variation_of_a(int n, fp variat) const;
std::vector<std::string> get_variable_references(std::string const &name);
protected:
Ftk const* F;
std::vector<Sum*> sums;
std::vector<fp> parameters;
/// sorted, a doesn't depend on b if idx(a)>idx(b)
std::vector<Variable*> variables;
std::vector<Function*> functions;
int var_autoname_counter; ///for names for "anonymous" variables
int func_autoname_counter; ///for names for "anonymous" functions
std::string do_assign_func(Function* func);
std::string get_or_make_variable(std::string const& func);
Variable *create_variable(std::string const &name, std::string const &rhs);
std::string put_into_variables(Variable* new_var);
bool is_variable_referred(int i,
std::vector<std::string> const &ignore_vars
=std::vector<std::string>(),
std::string *first_referrer=0);
std::vector<std::string> make_varnames(std::string const &function,
std::vector<std::string> const &vars);
std::vector<std::string> get_vars_from_kw(std::string const &function,
std::vector<std::string> const &vars);
std::string make_var_copy_name(Variable const* v);
std::string next_var_name(); ///generate name for "anonymous" variable
std::string next_func_name();///generate name for "anonymous" function
void do_reset();
};
#endif
syntax highlighted by Code2HTML, v. 0.9.1