AdaptInfo.h 19.2 KB
Newer Older
1
2
3
4
5
6
// ============================================================================
// ==                                                                        ==
// == AMDiS - Adaptive multidimensional simulations                          ==
// ==                                                                        ==
// ============================================================================
// ==                                                                        ==
7
// ==  TU Dresden                                                            ==
8
// ==                                                                        ==
9
10
11
// ==  Institut fr Wissenschaftliches Rechnen                               ==
// ==  Zellescher Weg 12-14                                                  ==
// ==  01069 Dresden                                                         ==
12
13
14
15
// ==  germany                                                               ==
// ==                                                                        ==
// ============================================================================
// ==                                                                        ==
16
// ==  https://gforge.zih.tu-dresden.de/projects/amdis/                      ==
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
// ==                                                                        ==
// ============================================================================

/** \file AdaptInfo.h */

#ifndef AMDIS_ADAPTINFO_H
#define AMDIS_ADAPTINFO_H

#include "MatrixVector.h"
#include "Parameters.h"
#include "Serializable.h"

namespace AMDiS {

  /**
   * \ingroup Adaption
   * 
   * \brief
   * Holds adapt parameters and infos about the problem. Base class
   * for AdaptInfoScal and AdaptInfoVec.
   */
  class AdaptInfo : public Serializable
  {
  protected:
    /** \brief
     * Stores adapt infos for a scalar problem or for one component of a 
     * vector valued problem.
     */
    class ScalContent {
    public:
47
      /// Constructor.
Thomas Witkowski's avatar
Thomas Witkowski committed
48
      ScalContent(std::string prefix) 
49
	: est_sum(0.0),
50
51
52
53
54
55
56
57
58
59
60
61
62
	est_t_sum(0.0),
	est_max(0.0),
	est_t_max(0.0),
	fac_max(0.0),
	fac_sum(1.0),
	spaceTolerance(1.0),
	timeTolerance(1.0),
	timeErrLow(1.0),
	coarsenAllowed(0),
	refinementAllowed(1),
	refineBisections(1),
	coarseBisections(1)
	
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
      {
	double totalTol = 1.0;
	double relSpaceErr = 1.0;
	double relTimeErr = 0.5;
	double timeTheta1 = 1.0;
	double timeTheta2 = 0.3;

	GET_PARAMETER(0, prefix + "->tolerance", "%f", &totalTol);
	GET_PARAMETER(0, prefix + "->rel space error", "%f", &relSpaceErr);
	GET_PARAMETER(0, prefix + "->rel time error", "%f", &relTimeErr);
	GET_PARAMETER(0, prefix + "->time theta 1", "%f", &timeTheta1);
	GET_PARAMETER(0, prefix + "->time theta 2", "%f", &timeTheta2);
	GET_PARAMETER(0, prefix + "->coarsen allowed", "%d", &coarsenAllowed);
	GET_PARAMETER(0, prefix + "->refinement allowed", "%d", &refinementAllowed);
	GET_PARAMETER(0, prefix + "->refine bisections", "%d", &refineBisections);
	GET_PARAMETER(0, prefix + "->coarsen bisections", "%d", &coarseBisections);
79
80
	GET_PARAMETER(0, prefix + "->sum factor", "%f", &fac_sum);
	GET_PARAMETER(0, prefix + "->max factor", "%f", &fac_max);
81
82
83
84

	spaceTolerance = totalTol * relSpaceErr;
	timeTolerance = totalTol * relTimeErr * timeTheta1;
	timeErrLow = totalTol * relTimeErr * timeTheta2;
85
      }
86

87
      /// Sum of all error estimates
88
89
      double est_sum;

90
      /// Sum of all time error estimates
91
92
      double est_t_sum;

93
      /// maximal local error estimate.
94
95
      double est_max;

96
      /// Maximum of all time error estimates
97
      double est_t_max;
98
99
100
      
      /// factors to combine max and integral time estimate
      double fac_max, fac_sum;
101

102
      /// Tolerance for the (absolute or relative) error
103
104
      double spaceTolerance;

105
      /// Time tolerance.
106
107
      double timeTolerance;

108
      /// Lower bound for the time error.
109
110
      double timeErrLow;

111
      /// true if coarsening is allowed, false otherwise.
112
113
      int coarsenAllowed;

114
      /// true if refinement is allowed, false otherwise.
115
116
117
118
119
120
121
      int refinementAllowed;

      /** \brief
       * parameter to tell the marking strategy how many bisections should be 
       * performed when an element is marked for refinement; usually the value is
       * 1 or DIM
       */
122
      int refineBisections;
123
124
125
126
127
128

      /** \brief
       * parameter to tell the marking strategy how many bisections should
       * be undone when an element is marked for coarsening; usually the value is 
       * 1 or DIM
       */                          
129
      int coarseBisections;    
130
131
132
    };

  public:
133
    /// Constructor.
Thomas Witkowski's avatar
Thomas Witkowski committed
134
    AdaptInfo(std::string name_, int size = 1) 
135
136
137
138
139
140
141
142
143
144
145
      : name(name_), 
	spaceIteration(-1),
	maxSpaceIteration(-1),
	timestepIteration(0),
	maxTimestepIteration(30),
	timeIteration(0),
	maxTimeIteration(30),
	time(0.0),
	startTime(0.0),
	endTime(1.0),
	timestep(0.0),
146
	lastProcessedTimestep(0.0),
147
148
149
	minTimestep(0.0),
	maxTimestep(1.0),
	timestepNumber(0),
Thomas Witkowski's avatar
* Bla    
Thomas Witkowski committed
150
	nTimesteps(0),
151
152
153
154
	solverIterations(0),
	maxSolverIterations(0),
	solverTolerance(1e-8),
	solverResidual(0.0),
155
156
        scalContents(size),
	isDeserialized_(false)
157
158
159
160
161
162
163
164
165
166
167
168
    {
      GET_PARAMETER(0, name_ + "->start time", "%f", &startTime);
      time = startTime;
      GET_PARAMETER(0, name_ + "->timestep", "%f", &timestep);
      GET_PARAMETER(0, name_ + "->end time", "%f", &endTime);
      GET_PARAMETER(0, name_ + "->max iteration", "%d", &maxSpaceIteration);
      GET_PARAMETER(0, name_ + "->max timestep iteration", "%d", &maxTimestepIteration);
      GET_PARAMETER(0, name_ + "->max time iteration", "%d", &maxTimeIteration);

      GET_PARAMETER(0, name_ + "->min timestep", "%f", &minTimestep);
      GET_PARAMETER(0, name_ + "->max timestep", "%f", &maxTimestep);

Thomas Witkowski's avatar
* Bla    
Thomas Witkowski committed
169
170
      GET_PARAMETER(0, name_ + "->number of timesteps", "%d", &nTimesteps);

171
172
173
174
175
176
      if (size == 1) {
	scalContents[0] = new ScalContent(name); 
      } else {
	char number[5];
	for (int i = 0; i < size; i++) {
	  sprintf(number, "[%d]", i);
Thomas Witkowski's avatar
Thomas Witkowski committed
177
	  scalContents[i] = new ScalContent(name + std::string(number)); 
178
179
	}
      }
180
    }
181

182
    /// Destructor.
Thomas Witkowski's avatar
Thomas Witkowski committed
183
184
185
    virtual ~AdaptInfo() 
    {
      for (unsigned int i = 0;  i < scalContents.size(); i++)
186
	delete scalContents[i];
187
    }
188
189
190
191
192
193
194
195
196
197
198

    inline void reset() 
    {
      spaceIteration = -1;
      timestepIteration = 0;
      timeIteration = 0;
      time = 0.0;
      timestep = 0.0;
      timestepNumber = 0;
      solverIterations = 0;
      solverResidual = 0.0;
199
200

      GET_PARAMETER(0, name + "->timestep", "%f", &timestep);
201
      lastProcessedTimestep=timestep;
202
    }
203

204
    /// Returns whether space tolerance is reached.
205
206
    virtual bool spaceToleranceReached() 
    {
Thomas Witkowski's avatar
Thomas Witkowski committed
207
208
209
210
      for (unsigned int i = 0; i < scalContents.size(); i++) {
	std::cout << "est_sum:" <<scalContents[i]->est_sum 
		  << " spaceTol: " << scalContents[i]->spaceTolerance 
		  << std::endl;
211
	if (!(scalContents[i]->est_sum < scalContents[i]->spaceTolerance))
212
	  return false;
213
      }
214

215
      return true;
216
    }
217

218
    /// Returns whether space tolerance of component i is reached.
219
220
    virtual bool spaceToleranceReached(int i) 
    {
221
      if (!(scalContents[i]->est_sum < scalContents[i]->spaceTolerance))
222
	return false;
223
      else
224
	return true;
225
    }
226

227
    /// Returns whether time tolerance is reached.
228
229
    virtual bool timeToleranceReached() 
    {
Thomas Witkowski's avatar
Thomas Witkowski committed
230
      for (unsigned int i = 0; i < scalContents.size(); i++)
231
	if (!(getTimeEstCombined(i) < scalContents[i]->timeTolerance))
232
	  return false;
233

234
      return true;
235
    }
236

237
    /// Returns whether time tolerance of component i is reached.
238
239
    virtual bool timeToleranceReached(int i) 
    {
240
      if (!(getTimeEstCombined(i) < scalContents[i]->timeTolerance))
241
	return false;
242
      else
243
	return true;
244
    }
245

246
    /// Returns whether time error is under its lower bound.
247
248
    virtual bool timeErrorLow() 
    {
Thomas Witkowski's avatar
Thomas Witkowski committed
249
      for (unsigned int i = 0; i < scalContents.size(); i++)
250
	if (!(getTimeEstCombined(i) < scalContents[i]->timeErrLow))
251
	  return false;
252

253
      return true;
254
    }
255
256
257
258
259
260
261
262
    /// Returns the time estimation as a combination 
    /// of maximal and integral time error 
    double getTimeEstCombined(unsigned i) const 
    { 
      return scalContents[i]->est_t_max*scalContents[i]->fac_max
	+scalContents[i]->est_t_sum*scalContents[i]->fac_sum; 
    }

263

264
    /// Print debug information about time error and its bound.
265
266
    void printTimeErrorLowInfo() 
    {
267
268
269
270
      for (unsigned int i = 0; i < scalContents.size(); i++){
	std::cout << "    Time error estimate  = " << getTimeEstCombined(i)
		  << "    Time error estimate sum = " << scalContents[i]->est_t_sum 
		  << "    Time error estimate max = " << scalContents[i]->est_t_max 
271
272
		  << "    Time error low bound = " << scalContents[i]->timeErrLow  
		  << "    Time error high bound = " << scalContents[i]->timeTolerance << "\n";
273
      }
274
    }
275

276
    /// Returns \ref spaceIteration.
277
278
    inline int getSpaceIteration() 
    { 
279
      return spaceIteration; 
280
    }
281

282
    /// Sets \ref spaceIteration.
283
284
    inline void setSpaceIteration(int it) 
    { 
285
      spaceIteration = it; 
286
    }
287
  
288
    /// Returns \ref maxSpaceIteration.
289
290
    inline int getMaxSpaceIteration() 
    { 
291
      return maxSpaceIteration;
292
    }
293

294
    /// Sets \ref maxSpaceIteration.
295
296
    inline void setMaxSpaceIteration(int it) 
    { 
297
      maxSpaceIteration = it; 
298
    }
299
  
300
    /// Increments \ref spaceIteration by 1;
301
302
    inline void incSpaceIteration() 
    { 
303
      spaceIteration++; 
304
    }
305

306
    /// Sets \ref timestepIteration.
307
308
    inline void setTimestepIteration(int it) 
    { 
309
      timestepIteration = it; 
310
    }
311
  
312
    /// Returns \ref timestepIteration.
313
314
    inline int getTimestepIteration() 
    { 
315
      return timestepIteration; 
316
    }
317

318
    /// Increments \ref timestepIteration by 1;
319
320
    inline void incTimestepIteration() 
    { 
321
      timestepIteration++; 
322
    }
323

324
    /// Returns \ref maxTimestepIteration.
325
326
    inline int getMaxTimestepIteration() 
    { 
327
      return maxTimestepIteration; 
328
    }
329

330
    /// Sets \ref maxTimestepIteration.
331
332
    inline void setMaxTimestepIteration(int it) 
    { 
333
      maxTimestepIteration = it; 
334
    }
335
  
336
    /// Sets \ref timeIteration.
337
338
    inline void setTimeIteration(int it) 
    { 
339
      timeIteration = it; 
340
    }
341
  
342
    /// Returns \ref timeIteration.
343
344
    inline int getTimeIteration() 
    { 
345
      return timeIteration; 
346
    }
347

348
    /// Increments \ref timesIteration by 1;
349
350
    inline void incTimeIteration() 
    { 
351
      timeIteration++; 
352
    }
353

354
    /// Returns \ref maxTimeIteration.
355
356
    inline int getMaxTimeIteration() 
    { 
357
      return maxTimeIteration; 
358
    }
359

360
    /// Sets \ref maxTimeIteration.
361
362
    inline void setMaxTimeIteration(int it) 
    { 
363
      maxTimeIteration = it; 
364
    }
365
  
366
    /// Returns \ref timestepNumber.
367
368
    inline int getTimestepNumber() 
    { 
369
      return timestepNumber; 
370
    }
371

Thomas Witkowski's avatar
* Bla    
Thomas Witkowski committed
372
    /// Returns \ref nTimesteps.
373
374
    inline int getNumberOfTimesteps() 
    {
Thomas Witkowski's avatar
* Bla    
Thomas Witkowski committed
375
376
377
      return nTimesteps;
    }

378
    /// Increments \ref timestepNumber by 1;
379
380
    inline void incTimestepNumber() 
    { 
381
      timestepNumber++; 
382
    }
383

384
    /// Sets \ref est_sum.
385
386
    inline void setEstSum(double e, int index) 
    {
387
      scalContents[index]->est_sum = e;
388
    }
389

390
    /// Sets \ref est_max.
391
392
    inline void setEstMax(double e, int index) 
    {
393
      scalContents[index]->est_max = e;
394
    }
395

396
    /// Sets \ref est_max.
397
398
    inline void setTimeEstMax(double e, int index) 
    {
399
      scalContents[index]->est_t_max = e;
400
    }
401

402
    /// Sets \ref est_t_sum.
403
404
    inline void setTimeEstSum(double e, int index) 
    {
405
      scalContents[index]->est_t_sum = e;
406
    }
407

408
    /// Returns \ref est_sum.
409
410
    inline double getEstSum(int index) 
    { 
Thomas Witkowski's avatar
Thomas Witkowski committed
411
412
413
414
415
      FUNCNAME("AdaptInfo::getEstSum()");

      TEST_EXIT_DBG(static_cast<unsigned int>(index) < scalContents.size())
	("Wrong index for adaptInfo!\n");

416
      return scalContents[index]->est_sum; 
417
    }
418

419
    /// Returns \ref est_t_sum.
420
421
    inline double getEstTSum(int index) 
    { 
422
      return scalContents[index]->est_t_sum; 
423
    }
424

425
    /// Returns \ref est_max.
426
427
    inline double getEstMax(int index) 
    { 
Thomas Witkowski's avatar
Thomas Witkowski committed
428
429
430
431
432
      FUNCNAME("AdaptInfo::getEstSum()");

      TEST_EXIT_DBG(static_cast<unsigned int>(index) < scalContents.size())
	("Wrong index for adaptInfo!\n");

433
      return scalContents[index]->est_max; 
434
    }
435

436
    /// Returns \ref est_max.
437
438
    inline double getTimeEstMax(int index) 
    { 
439
      return scalContents[index]->est_t_max; 
440
    }
441

442
    /// Returns \ref est_t_sum.
443
444
    inline double getTimeEstSum(int index) 
    { 
445
      return scalContents[index]->est_t_sum; 
446
    }
447

448
    /// Returns \ref spaceTolerance.
449
450
    inline double getSpaceTolerance(int index) 
    { 
451
      return scalContents[index]->spaceTolerance; 
452
    }  
453

454
    /// Sets \ref spaceTolerance.
455
456
    inline void setSpaceTolerance(int index, double tol) 
    { 
457
      scalContents[index]->spaceTolerance = tol; 
458
    }  
459

460
    /// Returns \ref timeTolerance.
461
462
    inline double getTimeTolerance(int index) 
    { 
463
      return scalContents[index]->timeTolerance; 
464
    }  
465

466
    /// Sets \ref time
467
468
    inline double setTime(double t) 
    { 
469
      time = t; 
470
471
472
473
474
      if (time > endTime) 
	time = endTime;
      if (time < startTime) 
	time = startTime;

475
      return time;
476
    }
477

478
    /// Gets \ref time
479
480
    inline double getTime() 
    { 
481
      return time; 
482
    }  
483

484
    /// Gets \ref &time
485
486
    inline double *getTimePtr() 
    { 
487
      return &time; 
488
    }  
489

490
    /// Sets \ref timestep
491
492
    inline double setTimestep(double t) 
    { 
493
      timestep = t; 
494
      if (timestep > maxTimestep)
495
	timestep = maxTimestep;
496
      if (timestep < minTimestep)
497
	timestep = minTimestep;
498
      if (time + timestep > endTime)
499
500
	timestep = endTime - time;
      
501
      return timestep;
502
    }
503
504
505
506
507
508
509
510
511
512
513
514
515
    /// Gets \ref timestep
    inline double getTimestep() 
    { 
      return timestep; 
    }

    inline void setLastProcessedTimestep(double t){
	lastProcessedTimestep=t;
    } 

    inline double getLastProcessedTimestep(){
	return lastProcessedTimestep;
    } 
516

Thomas Witkowski's avatar
* Bla    
Thomas Witkowski committed
517
518
519
520
    /** \brief
     * Returns true, if the end time is reached and no more timestep
     * computations must be done.
     */
521
522
    inline bool reachedEndTime() 
    {
523
524
525
526
      if (nTimesteps > 0) 
	return !(timestepNumber < nTimesteps);

      return !(time < endTime - DBL_TOL);
Thomas Witkowski's avatar
* Bla    
Thomas Witkowski committed
527
528
    }

529

530
    /// Sets \ref minTimestep
531
532
    inline void setMinTimestep(double t) 
    { 
533
      minTimestep = t; 
534
    }
535

536
    /// Gets \ref minTimestep
537
538
    inline double getMinTimestep() 
    { 
539
      return minTimestep; 
540
    }  
541

542
    /// Sets \ref maxTimestep
543
544
    inline void setMaxTimestep(double t) 
    { 
545
      maxTimestep = t; 
546
    }
547

548
    /// Gets \ref maxTimestep
549
550
    inline double getMaxTimestep() 
    { 
551
      return maxTimestep; 
552
    }  
553

554
    /// Gets \ref &timestep
555
556
    inline double *getTimestepPtr() 
    { 
557
      return &timestep; 
558
    }  
559

560
    /// Sets \ref startTime = time
561
562
    inline void setStartTime(double time) 
    { 
563
      startTime = time; 
564
    }
565

566
    /// Sets \ref endTime = time
567
568
    inline void setEndTime(double time) 
    { 
569
      endTime = time; 
570
    }
571

572
    /// Returns \ref startTime
573
574
    inline double getStartTime() 
    { 
575
      return startTime; 
576
    }
577

578
    /// Returns \ref endTime
579
580
    inline double getEndTime() 
    { 
581
      return endTime; 
582
    }
583

584
    /// Returns \ref timeErrLow.
585
586
    inline double getTimeErrLow(int index) 
    { 
587
      return scalContents[index]->timeErrLow; 
588
    }  
589

590
    /// Returns whether coarsening is allowed or not.
591
592
    inline bool isCoarseningAllowed(int index) 
    {
593
      return (scalContents[index]->coarsenAllowed == 1);
594
    }
595

596
    /// Returns whether coarsening is allowed or not.
597
598
    inline bool isRefinementAllowed(int index) 
    {
599
      return (scalContents[index]->refinementAllowed == 1);
600
    }
601

602
    ///
603
604
    inline void allowRefinement(bool allow, int index) 
    {
605
      scalContents[index]->refinementAllowed = allow;
606
    }
607

608
    ///
609
610
    inline void allowCoarsening(bool allow, int index) 
    {
611
      scalContents[index]->coarsenAllowed = allow;
612
    }
613

614
    /// Returns \ref refineBisections
615
616
    inline const int getRefineBisections(int index) const 
    {
617
      return scalContents[index]->refineBisections;
618
    }
619

620
    /// Returns \ref coarseBisections
621
622
    inline const int getCoarseBisections(int index) const 
    {
623
      return scalContents[index]->coarseBisections;
624
    }
625

626
627
    inline int getSize() 
    { 
Thomas Witkowski's avatar
Thomas Witkowski committed
628
      return scalContents.size(); 
629
    }
630

631
632
    inline void setSolverIterations(int it) 
    {
633
      solverIterations = it;
634
    }
635
  
636
637
    inline int getSolverIterations() 
    {
638
      return solverIterations;
639
    }
640
  
641
642
    inline void setMaxSolverIterations(int it) 
    {
643
      maxSolverIterations = it;
644
    }
645
  
646
647
    inline int getMaxSolverIterations() 
    {
648
      return maxSolverIterations;
649
    }
650
  
651
652
    inline void setSolverTolerance(double tol) 
    {
653
      solverTolerance = tol;
654
    }
655
  
656
657
    inline double getSolverTolerance() 
    {
658
      return solverTolerance;
659
    }
660
  
661
662
    inline void setSolverResidual(double res) 
    {
663
      solverResidual = res;
664
    }
665
  
666
667
    inline double getSolverResidual() 
    {
668
      return solverResidual;
669
    }
670

671
    /// Returns true, if the adaptive procedure was deserialized from a file.
672
673
    const bool isDeserialized() const 
    {
674
675
676
      return isDeserialized_;
    }

677
678
    inline void setIsDeserialized(bool b) 
    {
679
680
681
      isDeserialized_ = b;
    }

682
    /// Creates new scalContents with the given size.
683
684
    void setScalContents(int newSize);

685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
    /** \brief
     * Resets timestep, current time and time boundaries without
     * any check. Is used by the parareal algorithm.
     */
    void resetTimeValues(double newTimeStep,
			 double newStartTime,
			 double newEndTime)
    {
      time = newStartTime;
      startTime = newStartTime;
      endTime = newEndTime;
      timestep = newTimeStep;
      timestepNumber = 0;
    }

Thomas Witkowski's avatar
Thomas Witkowski committed
700
    void serialize(std::ostream& out);
701

Thomas Witkowski's avatar
Thomas Witkowski committed
702
    void deserialize(std::istream& in);
703
704

  protected:
705
    /// Name.
Thomas Witkowski's avatar
Thomas Witkowski committed
706
    std::string name;
707

708
    /// Current space iteration
709
710
711
712
713
714
715
716
    int spaceIteration;

    /** \brief
     * maximal allowed number of iterations of the adaptive procedure; if 
     * maxIteration <= 0, no iteration bound is used
     */
    int maxSpaceIteration;

717
    /// Current timestep iteration
718
719
    int timestepIteration;

720
    /// Maximal number of iterations for choosing a timestep
721
722
    int maxTimestepIteration;

723
    /// Current time iteration
724
725
    int timeIteration;

726
    /// Maximal number of time iterations
727
728
    int maxTimeIteration;

729
    /// Actual time, end of time interval for current time step
730
731
    double time;

732
    /// Initial time
733
734
    double startTime;

735
    /// Final time
736
737
    double endTime;

738
    ///Time step size to be used
739
740
    double timestep;

741
742
743
    /// Last processed time step size of finished iteration
    double lastProcessedTimestep;

744
    /// Minimal step size
745
746
    double minTimestep;

747
    /// Maximal step size
748
749
    double maxTimestep;

750
    /// Number of current time step
751
    int timestepNumber;
Thomas Witkowski's avatar
* Bla    
Thomas Witkowski committed
752
753
754
755
756
757
758

    /** \brief
     * Per default this value is 0 and not used. If it is set to a non-zero value,
     * the computation of the stationary problem is done nTimesteps times with a
     * fixed timestep.
     */
    int nTimesteps;
759
  
760
    /// number of iterations needed of linear or nonlinear solver
761
762
    int solverIterations;

763
    /// maximal number of iterations needed of linear or nonlinear solver
764
765
    int maxSolverIterations;

766
    ///
767
768
    double solverTolerance;

769
    ///
770
771
    double solverResidual;

772
    /// Scalar adapt infos.
Thomas Witkowski's avatar
Thomas Witkowski committed
773
    std::vector<ScalContent*> scalContents;
774

775
    /// Is true, if the adaptive procedure was deserialized from a file.
776
    bool isDeserialized_;
777
778
779
780
781
  };

}

#endif //  AMDIS_ADAPTINFO_H