00001
00002
00003
00004 #ifndef FITYK__MGR__H__
00005 #define FITYK__MGR__H__
00006
00007 #include <map>
00008 #include "common.h"
00009 #include "tplate.h"
00010
00011 class Variable;
00012 class Function;
00013 class Ftk;
00014 class Model;
00015 struct FunctionSum;
00016 struct Token;
00017
00018
00019 class VariableManager
00020 {
00021 public:
00022 VariableManager(const Ftk* F);
00023 ~VariableManager();
00024 void register_model(Model *m) { models_.push_back(m); }
00025 void unregister_model(const Model *m);
00026
00027
00028 int make_variable(const std::string &name, VMData* vd);
00029 int add_variable(Variable* new_var);
00030
00031 void sort_variables();
00032
00033 std::string assign_variable_copy(const Variable* orig,
00034 const std::map<int,std::string>& varmap);
00035
00036 void delete_variables(const std::vector<std::string> &name);
00037
00038
00039 int find_variable_nr(const std::string &name) const;
00040 const Variable* find_variable(const std::string &name) const;
00041 int find_nr_var_handling_param(int p) const;
00042 const Variable* find_variable_handling_param(int p) const
00043 { return variables_[find_nr_var_handling_param(p)]; }
00044
00045
00046
00047
00048
00049
00050 void remove_unreferred();
00051
00052 void auto_remove_functions();
00053 bool is_function_referred(int n) const;
00054
00055 const std::vector<realt>& parameters() const { return parameters_; }
00056 const std::vector<Variable*>& variables() const { return variables_; }
00057 const Variable* get_variable(int n) const { return variables_[n]; }
00058 Variable* get_variable(int n) { return variables_[n]; }
00059
00060
00061 int assign_func(const std::string &name, Tplate::Ptr tp,
00062 std::vector<VMData*> &args);
00063
00064 int assign_func_copy(const std::string &name, const std::string &orig);
00065 void substitute_func_param(const std::string &name,
00066 const std::string ¶m,
00067 VMData* vd);
00068 void delete_funcs(const std::vector<std::string> &names);
00069
00070 int find_function_nr(const std::string &name) const;
00071 const Function* find_function(const std::string &name) const;
00072 const std::vector<Function*>& functions() const { return functions_; }
00073 const Function* get_function(int n) const { return functions_[n]; }
00074
00075
00076
00077 void use_parameters();
00078 void use_external_parameters(const std::vector<realt> &ext_param);
00079 void put_new_parameters(const std::vector<realt> &aa);
00080 realt variation_of_a(int n, realt variat) const;
00081 std::vector<std::string>
00082 get_variable_references(const std::string &name) const;
00083 void update_indices_in_models();
00084
00085 std::string next_var_name();
00086 std::string next_func_name();
00087
00088 protected:
00089 void do_reset();
00090
00091 private:
00092 const Ftk* F_;
00093 std::vector<Model*> models_;
00094 std::vector<realt> parameters_;
00095
00096 std::vector<Variable*> variables_;
00097 std::vector<Function*> functions_;
00098 int var_autoname_counter_;
00099 int func_autoname_counter_;
00100
00101 int add_func(Function* func);
00102
00103
00104 bool is_variable_referred(int i, std::string *first_referrer = NULL);
00105 void reindex_all();
00106 std::string name_var_copy(const Variable* v);
00107 void update_indices(FunctionSum& sum);
00108
00109 };
00110
00111
00112 Variable* make_compound_variable(const std::string &name, VMData* vd,
00113 const std::vector<Variable*>& all_variables);
00114
00115 #endif