14#include "arcane/utils/Array.h"
15#include "arcane/utils/Iostream.h"
16#include "arcane/utils/String.h"
18#include "arcane/impl/VariableUtilities.h"
20#include "arcane/IVariable.h"
21#include "arcane/IParallelMng.h"
22#include "arcane/IVariableMng.h"
23#include "arcane/VariableDependInfo.h"
24#include "arcane/VariableCollection.h"
25#include "arcane/SerializeBuffer.h"
38VariableUtilities(IVariableMng* vm)
39: TraceAccessor(vm->traceMng())
58void VariableUtilities::
59dumpAllVariableDependencies(std::ostream& ostr,
bool is_recursive)
62 for( VariableCollection::Enumerator ivar(used_variables); ++ivar; ){
71void VariableUtilities::
72dumpDependencies(
IVariable* var,std::ostream& ostr,
bool is_recursive)
75 _dumpDependencies(var,ostr,is_recursive);
81void VariableUtilities::
82_dumpDependencies(
IVariable* var,std::ostream& ostr,
bool is_recursive)
84 std::set<IVariable*> done_vars;
85 done_vars.insert(var);
95 <<
" nb_depend=" << nb_depend
100 for(
Integer i=0; i<nb_depend; ++i ){
101 _dumpDependencies(depends[i],ostr,is_recursive,done_vars,2);
110void VariableUtilities::
111_dumpDependencies(VariableDependInfo& vdi,std::ostream& ostr,
bool is_recursive,
112 std::set<IVariable*>& done_vars,Integer indent_level)
114 IVariable* var = vdi.variable();
115 bool no_cycle = done_vars.find(var)==done_vars.end();
116 bool do_depend = no_cycle;
119 done_vars.insert(var);
121 std::string indent_str;
122 for( Integer i=0; i<indent_level; ++i )
123 indent_str.push_back(
' ');
125 UniqueArray<VariableDependInfo> depends;
126 var->dependInfos(depends);
127 Integer nb_depend = depends.size();
131 <<
" time=" << var->modifiedTime()
132 <<
" nb_depend=" << nb_depend
133 <<
" trace_info=" << vdi.traceInfo();
138 if (do_depend && nb_depend!=0){
139 ostr << indent_str <<
"{\n";
140 for( Integer i=0; i<nb_depend; ++i ){
141 _dumpDependencies(depends[i],ostr,
true,done_vars,indent_level+2);
143 ostr << indent_str <<
"}\n";
161 bool dump_not_common)
164 for( VariableCollection::Enumerator i(input_variables); ++i; )
165 vars_to_check.
add(*i);
168 info(4) <<
"CHECK: nb_variable_to_compare=" << nb_var;
172 send_buf.
setMode(ISerializer::ModeReserve);
173 send_buf.reserveInteger(1);
174 for(
Integer i=0; i<nb_var; ++i ){
175 send_buf.
reserve(vars_to_check[i]->fullName());
181 for(
Integer i=0; i<nb_var; ++i ){
182 send_buf.
put(vars_to_check[i]->fullName());
189 std::map<String,Int32> var_occurences;
193 for(
Integer i=0; i<nb_rank; ++i ){
195 info(5) <<
"String recv_nb_var_rank rank=" << i <<
" n=" << nb_var_rank;
196 for(
Integer z=0; z<nb_var_rank; ++z ){
199 std::map<String,Int32>::iterator vo = var_occurences.find(x);
200 if (vo==var_occurences.end())
201 var_occurences.insert(std::make_pair(x,1));
203 vo->second = vo->second + 1;
210 std::map<String,IVariable*> common_vars;
212 std::map<String,Int32>::const_iterator end_var = var_occurences.end();
213 for(
Integer i=0; i<nb_var; ++i ){
215 std::map<String,Int32>::const_iterator i_var = var_occurences.find(var->
fullName());
219 if (i_var->second!=nb_rank){
221 info() <<
"ERROR: can not compare variable '" << var->
fullName()
222 <<
"' because it is not defined on all replica nb_define=" << i_var->second;
225 common_vars.insert(std::make_pair(var->
fullName(),var));
233 VariableList sorted_common_vars;
235 std::map<String,IVariable*>::const_iterator end_var = common_vars.end();
236 std::map<String,IVariable*>::const_iterator i_var = common_vars.begin();
237 for( ; i_var!=end_var; ++i_var ){
238 sorted_common_vars.add(i_var->second);
242 return sorted_common_vars;
Integer size() const
Nombre d'éléments du vecteur.
void add(ConstReferenceType val)
Ajoute l'élément val à la fin du tableau.
void put(Span< const Real > values) override
Ajoute le tableau values.
void reserve(eBasicDataType dt, Int64 n) override
Réserve de la mémoire pour n objets de type dt.
void allocateBuffer() override
Alloue la mémoire du sérialiseur.
Integer getInteger() override
Récupère une taille.
void get(ArrayView< Real > values) override
Récupère le tableau values.
void setMode(eMode new_mode) override
Positionne le fonctionnement actuel.
void putInteger(Integer value) override
Ajoute l'entier value.
Interface du gestionnaire de parallélisme pour un sous-domaine.
virtual Int32 commSize() const =0
Nombre d'instance dans le communicateur.
virtual void allGather(ConstArrayView< char > send_buf, ArrayView< char > recv_buf)=0
Effectue un regroupement sur tous les processeurs. Il s'agit d'une opération collective....
@ ModePut
Le sérialiseur attend des reserve()
@ ModeGet
Le sérialiseur attend des get()
Interface d'une variable.
virtual String fullName() const =0
Nom complet de la variable (avec le préfixe de la famille)
virtual Int64 modifiedTime()=0
Temps auquel la variable a été mise à jour.
virtual void dependInfos(Array< VariableDependInfo > &infos)=0
Infos de dépendances.
Implémentation d'un tampon pour la sérialisation.
Chaîne de caractères unicode.
TraceMessage info() const
Flot pour un message d'information.
Vecteur 1D de données avec sémantique par valeur (style STL).
virtual void dumpDependencies(IVariable *var, std::ostream &ostr, bool is_recursive)
Affiche les informations de dépendance sur une variable.
Int32 Integer
Type représentant un entier.
std::int32_t Int32
Type entier signé sur 32 bits.