NDOSolver / FiOracle
Interfaces and Solvers for NonDifferentiable Optimization
Loading...
Searching...
No Matches
MPTester.h
Go to the documentation of this file.
1/*--------------------------------------------------------------------------*/
2/*---------------------------- File MPTester.h -----------------------------*/
3/*--------------------------------------------------------------------------*/
22/*--------------------------------------------------------------------------*/
23/*----------------------------- DEFINITIONS --------------------------------*/
24/*--------------------------------------------------------------------------*/
25
26#ifndef __MPTester
27 #define __MPTester /* self-identification: #endif at the end of the file */
28
29/*--------------------------------------------------------------------------*/
30/*------------------------------ INCLUDES ----------------------------------*/
31/*--------------------------------------------------------------------------*/
32
33#include "MPSolver.h"
34#include <algorithm>
35
36/*--------------------------------------------------------------------------*/
37/*------------------------------- MACROS -----------------------------------*/
38/*--------------------------------------------------------------------------*/
39
40/*--------------------------------------------------------------------------*/
41/*----------------------------- NAMESPACE ----------------------------------*/
42/*--------------------------------------------------------------------------*/
43
44namespace NDO_di_unipi_it
45{
46
47 using namespace std;
48
49 using namespace OPTtypes_di_unipi_it;
50
51/*--------------------------------------------------------------------------*/
52/*----------------------------- CLASSES ------------------------------------*/
53/*--------------------------------------------------------------------------*/
62class MPTester : public MPSolver
63{
64/*--------------------------------------------------------------------------*/
65/*----------------------- PUBLIC PART OF THE CLASS -------------------------*/
66/*--------------------------------------------------------------------------*/
67
68 public:
69
70/*--------------------------------------------------------------------------*/
71/*--------------------------- PUBLIC METHODS -------------------------------*/
72/*--------------------------------------------------------------------------*/
73/*---------------------------- CONSTRUCTOR ---------------------------------*/
74/*--------------------------------------------------------------------------*/
75
76 MPTester( MPSolver * master , MPSolver * slave )
77 : fMster( master ) , fSlave( slave )
78 {
79 if( ! fMster )
80 throw( std::invalid_argument( "null master MPSolver" ) );
81 if( ! fSlave )
82 throw( std::invalid_argument( "null slave MPSolver" ) );
83 if( ! MPLog )
84 MPLog = &std::cout;
85 }
86
87/*--------------------------------------------------------------------------*/
88
89 MPSolver * get_master( void ) { return( fMster ); }
90
91/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
92
93 MPSolver * get_slave( void ) { return( fSlave ); }
94
95/*--------------------------------------------------------------------------*/
96/*------------------------------ DESTRUCTOR --------------------------------*/
97/*--------------------------------------------------------------------------*/
98
99 virtual ~MPTester() { delete fMster; delete fSlave; };
100
101/*--------------------------------------------------------------------------*/
102/*-------------------------- OTHER INITIALIZATIONS -------------------------*/
103/*--------------------------------------------------------------------------*/
104
105 void SetDim( cIndex MxBSz = 0 , FiOracle * Oracle = nullptr ,
106 const bool UsAvSt = false ) override final
107 {
108 fMster->SetDim( MxBSz , Oracle , UsAvSt );
109 fSlave->SetDim( MxBSz , Oracle , UsAvSt );
110 if( MxBSz )
111 CheckProblem();
112 }
113
114/*--------------------------------------------------------------------------*/
115
116 void Sett( cHpNum tt = 1 ) override final
117 {
118 fMster->Sett( tt );
119 fSlave->Sett( tt );
120 CheckProblem();
121 }
122
123/*--------------------------------------------------------------------------*/
124
125 void SetPar( const int wp , cHpNum value ) override final
126 {
127 fMster->SetPar( wp , value );
128 fSlave->SetPar( wp , value );
129 CheckProblem();
130 }
131
132/*--------------------------------------------------------------------------*/
133
134 void SetThreads( int nthreads ) override final
135 {
136 fMster->SetThreads( nthreads );
137 fSlave->SetThreads( nthreads );
138 }
139
140/*--------------------------------------------------------------------------*/
141
143 cIndex wFi = Inf< Index >() ) override final
144 {
145 fMster->SetLowerBound( LwBnd , wFi );
146 fSlave->SetLowerBound( LwBnd , wFi );
147 CheckProblem();
148 }
149
150/*--------------------------------------------------------------------------*/
151
152 void CheckIdentical( const bool Chk = true ) override final
153 {
154 fMster->CheckIdentical( Chk );
155 fSlave->CheckIdentical( Chk );
156 CheckProblem();
157 }
158
159/*--------------------------------------------------------------------------*/
160
161 void SetMPLog( std::ostream * outs = NULL ,
162 const char lvl = 0 ) override final
163 {
164 fMster->SetMPLog( outs , lvl );
165 fSlave->SetMPLog( outs , lvl );
166 MPSolver::SetMPLog( outs , lvl );
167 if( ! MPLog )
168 MPLog = &std::cout;
169 CheckProblem();
170 }
171
172/*--------------------------------------------------------------------------*/
173
174 void SetMPTime( const bool TimeIt = true ) override final
175 {
176 fMster->SetMPTime( TimeIt );
177 fSlave->SetMPTime( TimeIt );
178 CheckProblem();
179 }
180
181/*--------------------------------------------------------------------------*/
182/*-------------------- METHODS FOR SOLVING THE PROBLEM ---------------------*/
183/*--------------------------------------------------------------------------*/
184
185 MPStatus SolveMP( void ) override final
186 {
187 CheckProblem();
188
189 MPStatus master = fMster->SolveMP();
190 MPStatus slave = fSlave->SolveMP();
191
192 if( master != slave )
193 abort();
194
195 return( master );
196 }
197
198/*--------------------------------------------------------------------------*/
199/*---------------------- METHODS FOR READING RESULTS -----------------------*/
200/*--------------------------------------------------------------------------*/
201
202 HpNum ReadFiBLambda( cIndex wFi = Inf< Index >() ) override final
203 {
204 // Check primal solution
205 // Readd(true);
206
207 HpNum master = fMster->ReadFiBLambda( wFi );
208 HpNum slave = fSlave->ReadFiBLambda( wFi );
209
210 if( wFi == Inf< Index >() )
211 CompareDouble( master , slave , "ReadFiBLambda" );
212 else
213 if( wFi > fMster->GetNrFi() )
214 CompareDouble( master , slave , "ReadFiBLambda( all - 0 )" );
215 else {
216 std::string mess( "ReadFiBLambda( " + std::to_string( wFi ) + " )" );
217 CompareDouble( master , slave , mess.data() );
218 }
219
220 return( master );
221 }
222
223/*--------------------------------------------------------------------------*/
224
225 HpNum ReadDt( cHpNum tt = 1 ) override final
226 {
227 HpNum master = fMster->ReadDt( tt );
228 HpNum slave = fSlave->ReadDt( tt );
229
230 CompareDouble( master , slave , "ReadDt" );
231 return( master );
232 }
233
234/*--------------------------------------------------------------------------*/
235
236 HpNum ReadSigma( cIndex wFi = Inf< Index >() ) override final
237 {
238 HpNum master = fMster->ReadSigma( wFi );
239 HpNum slave = fSlave->ReadSigma( wFi );
240
241 if( wFi > fMster->GetNrFi() )
242 CompareDouble( master , slave , "ReadSigma" );
243 else {
244 std::string mess( "ReadSigma( " + std::to_string( wFi ) + " )" );
245 CompareDouble( master , slave , mess.data() );
246 }
247
248 return( master );
249 }
250
251/*--------------------------------------------------------------------------*/
252
253 HpNum ReadDStart( cHpNum tt = 1 ) override final
254 {
255 HpNum master = fMster->ReadDStart( tt );
256 HpNum slave = fSlave->ReadDStart( tt );
257
258 CompareDouble( master , slave , "ReadDStart" );
259 return( master );
260 }
261
262/*--------------------------------------------------------------------------*/
263
264 cLMRow Readd( bool Fulld = false ) override final
265 {
266 cLMRow master = fMster->Readd( Fulld );
267 cLMRow slave = fSlave->Readd( Fulld );
268
269 CompareInt( fMster->GetCrrSGLen() , fSlave->GetCrrSGLen() ,
270 "GetCrrSGLen" );
271 CompareVector( master , slave , fMster->GetCrrSGLen() , "d" );
272 return( master );
273 }
274
275/*--------------------------------------------------------------------------*/
276
277 void ReadZ( LMRow tz , cIndex_Set &I , Index &D ,
278 cIndex wFi = Inf< Index >() ) override final
279 {
280 static std::vector< LMNum > slave;
281 slave.resize( fSlave->GetCrrSGLen() );
282 cIndex_Set slaveI;
283 Index slaveD;
284
285 fMster->ReadZ( tz , I , D , wFi );
286 fSlave->ReadZ( slave.data() , slaveI , slaveD , wFi );
287
288 CompareInt( fMster->GetCrrSGLen() , fSlave->GetCrrSGLen() ,
289 "GetCrrSGLen" );
290 CompareInt( D , slaveD , "ReadZ-D" );
291 CompareVector( tz , slave.data() , D , "z" );
292 }
293
294/*--------------------------------------------------------------------------*/
295
297 const bool IncldCnst = true ) override final
298 {
299 cHpRow master = fMster->ReadMult( I , D , wFi , IncldCnst );
300
301 Index slaveD;
302 cIndex_Set slaveI;
303 cHpRow slave = fSlave->ReadMult( slaveI , slaveD , wFi , IncldCnst );
304
305 CompareInt( fMster->GetMaxBSize() , fSlave->GetMaxBSize() ,
306 "GetMaxBSize" );
307
308 if( fMster->GetMaxBSize()==0 )
309 return( master );
310
311 // check for mult vectors
312 static std::vector< HpNum > denseD;
313 static std::vector< HpNum > denseSlaveD;
314 denseD.resize( fMster->GetMaxBSize() );
315 denseSlaveD.resize( fSlave->GetMaxBSize() );
316
317 size_t i;
318 for( i = 0 ; i < fMster->GetMaxBSize() ; ++i )
319 denseD[ i ] = denseSlaveD[ i ] = 0;
320
321 for( i = 0 ; i < D ; ++i )
322 denseD[ I[ i ] ] = master[ i ];
323
324 for( i = 0 ; i < slaveD ; ++i )
325 denseSlaveD[ slaveI[ i ] ] = slave[ i ];
326
327 if( wFi > fMster->GetNrFi() )
328 CompareVector( denseD.data() , denseSlaveD.data() ,
329 fMster->GetMaxBSize() , "Mult" );
330 else {
331 std::string mess( "Mult( " + std::to_string( wFi ) + " )" );
332 CompareVector( denseD.data() , denseSlaveD.data() ,
333 fMster->GetMaxBSize() , mess.data() );
334 }
335
336 return( master );
337 }
338
339/*--------------------------------------------------------------------------*/
340
341 HpNum ReadLBMult( cIndex wFi = Inf< Index >() ) override final
342 {
343 HpNum master = fMster->ReadLBMult( wFi );
344 HpNum slave = fSlave->ReadLBMult( wFi );
345
346 if( wFi > fMster->GetNrFi() )
347 CompareDouble( master , slave , "LBMult" );
348 else {
349 std::string mess( "LBMult( " + std::to_string( wFi ) + " )" );
350 CompareDouble( master , slave , mess.data() );
351 }
352
353 return( master );
354 }
355
356/*--------------------------------------------------------------------------*/
357
358 HpNum ReadGid( cIndex Nm = Inf< Index >() ) override final
359 {
360 HpNum master = fMster->ReadGid( Nm );
361 HpNum slave = fSlave->ReadGid( Nm );
362
363 CompareDouble( master , slave , "Gid" );
364 return( master );
365 }
366
367/*--------------------------------------------------------------------------*/
368
369 void MakeLambda1( cHpRow Lmbd , HpRow Lmbd1 , cHpNum Tau ) override final
370 {
371 fMster->MakeLambda1( Lmbd , Lmbd1 , Tau );
372
373 static std::vector< HpNum > sLmbd1;
374 sLmbd1.resize( fSlave->GetCrrSGLen() );
375 CompareInt( fMster->GetCrrSGLen() , fSlave->GetCrrSGLen() ,
376 "GetCrrSGLen" );
377 fSlave->MakeLambda1( Lmbd , sLmbd1.data() , Tau );
378
379 CompareVector( Lmbd1 , sLmbd1.data() , fMster->GetCrrSGLen() ,
380 "Lambda1" );
381 }
382
383/*--------------------------------------------------------------------------*/
384
385 void SensitAnals( HpNum &lp , HpNum &cp ) override final
386 {
387 fMster->SensitAnals( lp , cp );
388
389 HpNum slp, scp;
390 fSlave->SensitAnals( slp , scp );
391
392 CompareDouble( lp , slp , "SensitAnals-lp" );
393 CompareDouble( cp , scp , "SensitAnals-cp" );
394 }
395
396/*--------------------------------------------------------------------------*/
397/*-------------- METHODS FOR READING THE DATA OF THE PROBLEM ---------------*/
398/*--------------------------------------------------------------------------*/
399
400 Index GetMaxBSize( void )
401 {
402 Index master = fMster->GetMaxBSize();
403 Index slave = fSlave->GetMaxBSize();
404
405 CompareInt( master , slave , "MaxBSize" );
406 return( master );
407 }
408
409/*--------------------------------------------------------------------------*/
410
411 Index GetMaxSGLen( void )
412 {
413 Index master = fMster->GetMaxSGLen();
414 Index slave = fSlave->GetMaxSGLen();
415
416 CompareInt( master , slave , "MaxSGLen" );
417 return( master );
418 }
419
420 /*--------------------------------------------------------------------------*/
421
422 Index GetCrrSGLen( void )
423 {
424 Index master = fMster->GetCrrSGLen();
425 Index slave = fSlave->GetCrrSGLen();
426
427 CompareInt( master , slave , "CrrSGLen" );
428 return( master );
429 }
430
431/*--------------------------------------------------------------------------*/
432
433 Index GetNrFi( void )
434 {
435 Index master = fMster->GetNrFi();
436 Index slave = fSlave->GetNrFi();
437
438 CompareInt( master , slave , "NrFi" );
439 return( master );
440 }
441
442/*--------------------------------------------------------------------------*/
443
444 Index BSize( cIndex wFi = Inf< Index >() ) override final
445 {
446 Index master = fMster->BSize( wFi );
447 Index slave = fSlave->BSize( wFi );
448
449 CompareInt( master , slave , "BSize" );
450 return( master );
451 }
452
453/*--------------------------------------------------------------------------*/
454
455 Index BCSize( cIndex wFi = Inf< Index >() ) override final
456 {
457 Index master = fMster->BCSize( wFi );
458 Index slave = fSlave->BCSize( wFi );
459
460 CompareInt( master , slave , "BCsize" );
461 return( master );
462 }
463
464/*--------------------------------------------------------------------------*/
465
466 Index MaxName( cIndex wFi = Inf< Index >() ) override final
467 {
468 Index master = fMster->MaxName( wFi );
469 Index slave = fSlave->MaxName( wFi );
470
471 CompareInt( master , slave , "MaxName" );
472 return( master );
473 }
474
475/*--------------------------------------------------------------------------*/
476
477 Index WComponent( cIndex i ) override final
478 {
479 Index master = fMster->WComponent( i );
480 Index slave = fSlave->WComponent( i );
481
482 CompareInt( master , slave , "WComponent" );
483 return( master );
484 }
485
486/*--------------------------------------------------------------------------*/
487
488 bool IsSubG( cIndex i ) override final
489 {
490 bool master = fMster->IsSubG( i );
491 bool slave = fSlave->IsSubG( i );
492
493 CompareBool( master , slave , "IsSubG" );
494 return( master );
495 }
496
497/*--------------------------------------------------------------------------*/
498
499 Index NumNNVars( void ) override final
500 {
501 Index master = fMster->NumNNVars();
502 Index slave = fSlave->NumNNVars();
503
504 CompareInt( master , slave , "NumNNVars" );
505 return( master );
506 }
507
508/*--------------------------------------------------------------------------*/
509
510 Index NumBxdVars( void ) override final
511 {
512 Index master = fMster->NumBxdVars();
513 Index slave = fSlave->NumBxdVars();
514
515 CompareInt( master , slave , "NumBxdVars" );
516 return( master );
517 }
518
519/*--------------------------------------------------------------------------*/
520
521 bool IsNN( cIndex i ) override final
522 {
523 bool master = fMster->IsNN(i);
524 bool slave = fSlave->IsNN(i);
525
526 CompareBool( master , slave , "IsNN" );
527 return( master );
528 }
529
530/*--------------------------------------------------------------------------*/
531
532 cHpRow ReadLinErr( void ) override final
533 {
534 cHpRow master = fMster->ReadLinErr();
535 cHpRow slave = fSlave->ReadLinErr();
536
537 bool eq = true;
538 cIndex mBS = fMster->GetMaxBSize();
539 CompareInt( mBS , fSlave->GetMaxBSize() , "GetMaxBSize" );
540 for( int i = 0 ; i < mBS ; ++i )
541 if( fMster->WComponent( i ) < Inf< Index >() )
542 if( ! CompareDouble( master[ i ] , slave[ i ] ) ) {
543 eq = false;
544
545 *MPLog << std::endl << "LinErr[ " << i << " ] = "
546 << master[ i ] << ", " << slave[ i ];
547 }
548
549 return( master );
550 }
551
552/*--------------------------------------------------------------------------*/
553
554 HpNum ReadLowerBound( cIndex wFi = Inf< Index >() ) override final
555 {
556 HpNum master = fMster->ReadLowerBound( wFi );
557 HpNum slave = fSlave->ReadLowerBound( wFi );
558
559 if( wFi > fMster->GetNrFi() )
560 CompareDouble( master , slave , "GlobalLowerBound" );
561 else {
562 std::string mess( "LowerBound( " + std::to_string( wFi ) + " )" );
563 CompareDouble( master , slave , mess.data() );
564 }
565
566 return( master );
567 }
568
569/*--------------------------------------------------------------------------*/
570
571 HpNum EpsilonD( void ) override final
572 {
573 HpNum master = fMster->EpsilonD();
574 HpNum slave = fSlave->EpsilonD();
575
576 CompareDouble( master , slave , "EpsilonD" );
577 return( master );
578 }
579
580/*--------------------------------------------------------------------------*/
581/*------------- METHODS FOR ADDING / REMOVING / CHANGING DATA --------------*/
582/*--------------------------------------------------------------------------*/
583
584 SgRow GetItem( cIndex wFi = Inf< Index >() ) override final
585 {
586 fMsterItem = fMster->GetItem( wFi );
587 fSlaveItem = fSlave->GetItem( wFi );
588
589 CompareInt( fMster->GetCrrSGLen() , fSlave->GetCrrSGLen() ,
590 "CrrSGLen" );
591 return( fMsterItem );
592 }
593
594/*--------------------------------------------------------------------------*/
595
596 void SetItemBse( cIndex_Set SGBse = 0 , cIndex SGBDm = 0 ) override final
597 {
598 memcpy( fSlaveItem , fMsterItem , sizeof( SgNum ) * SGBDm );
599
600 fMster->SetItemBse( SGBse , SGBDm );
601 fSlave->SetItemBse( SGBse , SGBDm );
602 CheckProblem();
603 }
604
605/*--------------------------------------------------------------------------*/
606
607 Index CheckSubG( cHpNum DFi , cHpNum Tau , HpNum &Ai , HpNum &ScPri )
608 override final
609 {
610 HpNum slaveAi = Ai;
611 HpNum slaveScPri = ScPri;
612
613 Index master = fMster->CheckSubG( DFi , Tau , Ai , ScPri );
614 Index slave = fSlave->CheckSubG( DFi , Tau , slaveAi , slaveScPri );
615
616 CompareInt( master , slave , "CheckSubG ret" );
617 CompareDouble( Ai , slaveAi , "CheckSubG Ai" );
618 CompareDouble( ScPri , slaveScPri , "CheckSubG ScPri" );
619 return( master );
620 }
621
622/*--------------------------------------------------------------------------*/
623
624 Index CheckCnst( HpNum &Ai , HpNum &ScPri , cHpRow CrrPnt ) override final
625 {
626 HpNum slaveAi = Ai;
627 HpNum slaveScPri = ScPri;
628
629 Index master = fMster->CheckCnst( Ai , ScPri , CrrPnt );
630 Index slave = fSlave->CheckCnst( slaveAi , slaveScPri , CrrPnt );
631
632 CompareInt( master , slave , "CheckCnst ret" );
633 CompareDouble( Ai , slaveAi , "CheckCns Ai" );
634 CompareDouble( ScPri , slaveScPri , "CheckCnst ScPri" );
635 return( master );
636 }
637
638/*--------------------------------------------------------------------------*/
639
640 bool ChangesMPSol( void ) override final
641 {
642 bool master = fMster->ChangesMPSol();
643 bool slave = fSlave->ChangesMPSol();
644
645 CompareBool( master , slave , "ChangesMPSol" );
646 return( master );
647 }
648
649/*--------------------------------------------------------------------------*/
650
651 void SetItem( cIndex Nm = Inf< Index >() ) override final
652 {
653 fMster->SetItem( Nm );
654 fSlave->SetItem( Nm );
655 }
656
657/*--------------------------------------------------------------------------*/
658
659 void SubstItem( cIndex Nm ) override final
660 {
661 fMster->SubstItem( Nm );
662 fSlave->SubstItem( Nm );
663 CheckProblem();
664 }
665
666/*--------------------------------------------------------------------------*/
667
668 void RmvItem( cIndex i ) override final
669 {
670 fMster->RmvItem( i );
671 fSlave->RmvItem( i );
672 CheckProblem();
673 }
674
675/*--------------------------------------------------------------------------*/
676
677 void RmvItems( void ) override final
678 {
679 fMster->RmvItems();
680 fSlave->RmvItems();
681 CheckProblem();
682 }
683
684/*--------------------------------------------------------------------------*/
685
686 void SetActvSt( cIndex_Set AVrs = 0 , cIndex AVDm = 0 ) override final
687 {
688 fMster->SetActvSt( AVrs , AVDm );
689 fSlave->SetActvSt( AVrs , AVDm );
690 CheckProblem();
691 }
692
693/*--------------------------------------------------------------------------*/
694
695 void AddActvSt( cIndex_Set Addd , cIndex AdDm , cIndex_Set AVrs )
696 override final
697 {
698 fMster->AddActvSt( Addd , AdDm , AVrs );
699 fSlave->AddActvSt( Addd , AdDm , AVrs );
700 CheckProblem();
701 }
702
703/*--------------------------------------------------------------------------*/
704
705 void RmvActvSt( cIndex_Set Rmvd , cIndex RmDm , cIndex_Set AVrs )
706 override final
707 {
708 fMster->RmvActvSt( Rmvd , RmDm , AVrs );
709 fSlave->RmvActvSt( Rmvd , RmDm , AVrs );
710 CheckProblem();
711 }
712
713/*--------------------------------------------------------------------------*/
714
715 void AddVars( cIndex NNwVrs ) override final
716 {
717 fMster->AddVars( NNwVrs );
718 fSlave->AddVars( NNwVrs );
719 CheckProblem();
720 }
721
722/*--------------------------------------------------------------------------*/
723
724 void RmvVars( cIndex_Set whch = 0 , Index hwmny = 0 ) override final
725 {
726 fMster->RmvVars( whch , hwmny );
727 fSlave->RmvVars( whch , hwmny );
728 CheckProblem();
729 }
730
731/*--------------------------------------------------------------------------*/
732
733 void ChgAlfa( cHpRow DeltaAlfa ) override final
734 {
735 fMster->ChgAlfa( DeltaAlfa );
736 fSlave->ChgAlfa( DeltaAlfa );
737 CheckProblem();
738 }
739
740/*--------------------------------------------------------------------------*/
741
742 void ChgAlfa( cHpRow NewAlfa , cIndex wFi ) override final
743 {
744 fMster->ChgAlfa( NewAlfa , wFi );
745 fSlave->ChgAlfa( NewAlfa , wFi );
746 CheckProblem();
747 }
748
749/*--------------------------------------------------------------------------*/
750
751 void ChgAlfa( cIndex i , cHpNum Ai ) override final
752 {
753 fMster->ChgAlfa( i , Ai );
754 fSlave->ChgAlfa( i , Ai );
755 CheckProblem();
756 }
757
758/*--------------------------------------------------------------------------*/
759
760 void ChangeCurrPoint( cLMRow DLambda , cHpRow DFi ) override final
761 {
762 fMster->ChangeCurrPoint( DLambda , DFi );
763 fSlave->ChangeCurrPoint( DLambda , DFi );
764 CheckProblem();
765 }
766
767/*--------------------------------------------------------------------------*/
768
769 void ChangeCurrPoint( cHpNum Tau , cHpRow DFi ) override final
770 {
771 fMster->ChangeCurrPoint( Tau , DFi );
772 fSlave->ChangeCurrPoint( Tau , DFi );
773 CheckProblem();
774 }
775
776/*--------------------------------------------------------------------------*/
777
778 void ChgSubG( cIndex strt , Index stp , cIndex wFi ) override final
779 {
780 fMster->ChgSubG( strt , stp , wFi );
781 fSlave->ChgSubG( strt , stp , wFi );
782 CheckProblem();
783 }
784
785/*--------------------------------------------------------------------------*/
786/*--------------------- PRIVATE PART OF THE CLASS --------------------------*/
787/*--------------------------------------------------------------------------*/
788
789 private:
790
791/*--------------------------------------------------------------------------*/
792/*-------------------------- PRIVATE METHODS -------------------------------*/
793/*--------------------------------------------------------------------------*/
794
795 bool CompareDouble( double master , double slave )
796 {
797 if( master == Inf< HpNum >() )
798 return( slave == Inf< HpNum >() );
799
800 if( master == - Inf< HpNum >() )
801 return( slave == - Inf< HpNum >() );
802
803 if( ( slave == Inf< HpNum >() ) || ( slave == - Inf< HpNum >() ) )
804 return( false );
805
806 const double kMinPrecision = 1e-4;
807
808 return( std::abs( master - slave ) <= kMinPrecision *
809 std::max( std::abs( master ) , std::max( double( 1 ) ,
810 std::abs( slave ) ) ) );
811 }
812
813/*--------------------------------------------------------------------------*/
814
815 bool CompareDouble( double master , double slave ,
816 const char * const caller )
817 {
818 if( CompareDouble( master , slave ) )
819 return( true );
820
821 if( caller )
822 *MPLog << std::endl << caller << ": " << master << ", " << slave;
823 return( false );
824 }
825
826/*--------------------------------------------------------------------------*/
827
828 bool CompareInt( unsigned int master , unsigned int slave ,
829 const char * const caller = 0 )
830 {
831 if( master == slave )
832 return( true );
833
834 if( caller )
835 *MPLog << std::endl << caller << ": " << master << ", " << slave;
836 return( false );
837 }
838
839/*--------------------------------------------------------------------------*/
840
841 bool CompareBool( bool master , bool slave , const char * const caller )
842 {
843 if( master == slave )
844 return( true );
845
846 if( caller )
847 *MPLog << std::endl << caller << ": " << master << ", " << slave;
848 return( false );
849 }
850
851/*--------------------------------------------------------------------------*/
852
853 bool CompareVector( const double * master , const double * slave , int len ,
854 const char * const caller )
855 {
856 bool eq = true;
857
858 for( int i = 0 ; i < len ; ++i )
859 if( ! CompareDouble( master[ i ] , slave[ i ] ) ) {
860 eq = false;
861
862 *MPLog << std::endl << *caller << "[ " << i << " ] = "
863 << master[ i ] << ", " << slave[ i ];
864 }
865
866 return( eq );
867 }
868
869/*--------------------------------------------------------------------------*/
870
871 void CheckProblem( void )
872 {
873 // Check some simple conditions
874 assert( NumBxdVars() >= NumNNVars() );
875 Index i = GetCrrSGLen();
876 while( i-- )
877 IsNN( i );
878
879 ReadLinErr();
880 }
881
882/*--------------------------------------------------------------------------*/
883/*----------------------- PRIVATE DATA STRUCTURES -------------------------*/
884/*--------------------------------------------------------------------------*/
885
886 MPSolver *fMster;
887 MPSolver *fSlave;
888
889 SgRow fMsterItem;
890 SgRow fSlaveItem;
891
892/*--------------------------------------------------------------------------*/
893
894 }; // end( class MPTester )
895
896/*--------------------------------------------------------------------------*/
897
898 } //end( namespace( NDO_di_unipi_it ) )
899
900/*--------------------------------------------------------------------------*/
901/*--------------------------------------------------------------------------*/
902
903#endif /* MPTester.h included */
904
905/*--------------------------------------------------------------------------*/
906/*------------------------ End File MPTester.h -----------------------------*/
907/*--------------------------------------------------------------------------*/
Definition FiOracle.h:231
Definition MPSolver.h:121
virtual void RmvItems(void)=0
virtual void AddVars(cIndex NNwVrs)=0
virtual MPStatus SolveMP(void)=0
virtual HpNum ReadLBMult(cIndex wFi=Inf< Index >())=0
virtual HpNum ReadFiBLambda(cIndex wFi=Inf< Index >())=0
virtual HpNum ReadSigma(cIndex wFi=Inf< Index >())=0
virtual HpNum ReadDt(cHpNum tt=1)=0
virtual cHpRow ReadLinErr(void)=0
virtual void MakeLambda1(cHpRow Lmbd, HpRow Lmbd1, cHpNum Tau)=0
virtual Index WComponent(cIndex i)=0
virtual HpNum EpsilonD(void)=0
MPSolver(void)
Definition MPSolver.h:168
virtual cLMRow Readd(bool Fulld=false)=0
virtual void SetDim(cIndex MxBSz=0, FiOracle *Oracle=nullptr, const bool UsAvSt=false)
Definition MPSolver.h:278
virtual void ChgAlfa(cHpRow DeltaAlfa)=0
virtual void ChgSubG(cIndex strt, Index stp, cIndex wFi)=0
virtual HpNum ReadLowerBound(cIndex wFi=Inf< Index >())=0
virtual void AddActvSt(cIndex_Set Addd, cIndex AdDm, cIndex_Set AVrs)=0
virtual cHpRow ReadMult(cIndex_Set &I, Index &D, cIndex wFi=Inf< Index >(), const bool IncldCnst=true)=0
virtual void RmvActvSt(cIndex_Set Rmvd, cIndex RmDm, cIndex_Set AVrs)=0
Index GetCrrSGLen(void)
returns the current subgradient length
Definition MPSolver.h:900
virtual void SetItemBse(cIndex_Set SGBse=0, cIndex SGBDm=0)=0
virtual void ChangeCurrPoint(cLMRow DLambda, cHpRow DFi)=0
virtual Index MaxName(cIndex wFi=Inf< Index >())=0
virtual void SetActvSt(cIndex_Set AVrs=0, cIndex AVDm=0)=0
virtual Index BCSize(cIndex wFi=Inf< Index >())=0
returns the current number of constraints in the bundle.
virtual void SubstItem(cIndex Nm)=0
virtual HpNum ReadGid(cIndex Nm=Inf< Index >())=0
Index GetNrFi(void)
returns the number of components of Fi()
Definition MPSolver.h:905
virtual HpNum ReadDStart(cHpNum tt=1)=0
virtual Index CheckCnst(HpNum &Ai, HpNum &ScPri, cHpRow CrrPnt)=0
virtual Index BSize(cIndex wFi=Inf< Index >())=0
returns the current number of items (of either type) in the bundle.
Index GetMaxBSize(void)
returns the maximum bundle size
Definition MPSolver.h:890
virtual Index NumNNVars(void)
Definition MPSolver.h:947
virtual void Sett(cHpNum tt=1)=0
Index GetMaxSGLen(void)
returns the maximum subgradient length
Definition MPSolver.h:895
virtual SgRow GetItem(cIndex wFi=Inf< Index >())=0
virtual bool IsNN(cIndex i)
Definition MPSolver.h:963
virtual void RmvVars(cIndex_Set whch=0, Index hwmny=0)=0
virtual void ReadZ(LMRow tz, cIndex_Set &I, Index &D, cIndex wFi=Inf< Index >())=0
MPStatus
Definition MPSolver.h:151
virtual void SensitAnals(HpNum &lp, HpNum &cp)=0
virtual void SetItem(cIndex Nm=Inf< Index >())=0
virtual bool IsSubG(cIndex i)=0
virtual bool ChangesMPSol(void)=0
virtual Index NumBxdVars(void)
Definition MPSolver.h:956
virtual void RmvItem(cIndex i)=0
virtual Index CheckSubG(cHpNum DFi, cHpNum Tau, HpNum &Ai, HpNum &ScPri)=0
Definition MPTester.h:63
void RmvItems(void) override final
Definition MPTester.h:677
void RmvActvSt(cIndex_Set Rmvd, cIndex RmDm, cIndex_Set AVrs) override final
Definition MPTester.h:705
HpNum ReadLowerBound(cIndex wFi=Inf< Index >()) override final
Definition MPTester.h:554
Index WComponent(cIndex i) override final
Definition MPTester.h:477
void RmvVars(cIndex_Set whch=0, Index hwmny=0) override final
Definition MPTester.h:724
void SetLowerBound(cHpNum LwBnd=- Inf< HpNum >(), cIndex wFi=Inf< Index >()) override final
Definition MPTester.h:142
HpNum ReadDStart(cHpNum tt=1) override final
Definition MPTester.h:253
void ChgAlfa(cHpRow NewAlfa, cIndex wFi) override final
Definition MPTester.h:742
void RmvItem(cIndex i) override final
Definition MPTester.h:668
cHpRow ReadMult(cIndex_Set &I, Index &D, cIndex wFi=Inf< Index >(), const bool IncldCnst=true) override final
Definition MPTester.h:296
void SubstItem(cIndex Nm) override final
Definition MPTester.h:659
void SetMPLog(std::ostream *outs=NULL, const char lvl=0) override final
Definition MPTester.h:161
void MakeLambda1(cHpRow Lmbd, HpRow Lmbd1, cHpNum Tau) override final
Definition MPTester.h:369
void SetItem(cIndex Nm=Inf< Index >()) override final
Definition MPTester.h:651
HpNum EpsilonD(void) override final
Definition MPTester.h:571
void SetActvSt(cIndex_Set AVrs=0, cIndex AVDm=0) override final
Definition MPTester.h:686
void SetMPTime(const bool TimeIt=true) override final
Definition MPTester.h:174
cLMRow Readd(bool Fulld=false) override final
Definition MPTester.h:264
void ChgSubG(cIndex strt, Index stp, cIndex wFi) override final
Definition MPTester.h:778
Index CheckCnst(HpNum &Ai, HpNum &ScPri, cHpRow CrrPnt) override final
Definition MPTester.h:624
void SetItemBse(cIndex_Set SGBse=0, cIndex SGBDm=0) override final
Definition MPTester.h:596
HpNum ReadFiBLambda(cIndex wFi=Inf< Index >()) override final
Definition MPTester.h:202
MPStatus SolveMP(void) override final
Definition MPTester.h:185
void ChgAlfa(cIndex i, cHpNum Ai) override final
Definition MPTester.h:751
bool IsSubG(cIndex i) override final
Definition MPTester.h:488
void ChgAlfa(cHpRow DeltaAlfa) override final
Definition MPTester.h:733
bool IsNN(cIndex i) override final
Definition MPTester.h:521
HpNum ReadGid(cIndex Nm=Inf< Index >()) override final
Definition MPTester.h:358
Index NumNNVars(void) override final
Definition MPTester.h:499
void CheckIdentical(const bool Chk=true) override final
Definition MPTester.h:152
Index CheckSubG(cHpNum DFi, cHpNum Tau, HpNum &Ai, HpNum &ScPri) override final
Definition MPTester.h:607
void SetThreads(int nthreads) override final
Definition MPTester.h:134
void AddVars(cIndex NNwVrs) override final
Definition MPTester.h:715
void ChangeCurrPoint(cLMRow DLambda, cHpRow DFi) override final
Definition MPTester.h:760
HpNum ReadLBMult(cIndex wFi=Inf< Index >()) override final
Definition MPTester.h:341
Index BSize(cIndex wFi=Inf< Index >()) override final
returns the current number of items (of either type) in the bundle.
Definition MPTester.h:444
bool ChangesMPSol(void) override final
Definition MPTester.h:640
HpNum ReadDt(cHpNum tt=1) override final
Definition MPTester.h:225
void ChangeCurrPoint(cHpNum Tau, cHpRow DFi) override final
Definition MPTester.h:769
void SensitAnals(HpNum &lp, HpNum &cp) override final
Definition MPTester.h:385
void Sett(cHpNum tt=1) override final
Definition MPTester.h:116
void SetPar(const int wp, cHpNum value) override final
Definition MPTester.h:125
SgRow GetItem(cIndex wFi=Inf< Index >()) override final
Definition MPTester.h:584
Index BCSize(cIndex wFi=Inf< Index >()) override final
returns the current number of constraints in the bundle.
Definition MPTester.h:455
void AddActvSt(cIndex_Set Addd, cIndex AdDm, cIndex_Set AVrs) override final
Definition MPTester.h:695
Index NumBxdVars(void) override final
Definition MPTester.h:510
Index MaxName(cIndex wFi=Inf< Index >()) override final
Definition MPTester.h:466
void SetDim(cIndex MxBSz=0, FiOracle *Oracle=nullptr, const bool UsAvSt=false) override final
Definition MPTester.h:105
cHpRow ReadLinErr(void) override final
Definition MPTester.h:532
HpNum ReadSigma(cIndex wFi=Inf< Index >()) override final
Definition MPTester.h:236
void ReadZ(LMRow tz, cIndex_Set &I, Index &D, cIndex wFi=Inf< Index >()) override final
Definition MPTester.h:277
HpNum * HpRow
"finer" (fp) array
Definition OPTtypes.h:99
const HpNum cHpNum
a read-only HpNum
Definition OPTtypes.h:102
double HpNum
"finer" floating point numbers
Definition OPTtypes.h:98
const Index cIndex
a read-only Index
Definition OPTtypes.h:64
cIndex * cIndex_Set
read-only array
Definition OPTtypes.h:65
unsigned int Index
Index in a vector ( >= 0 )
Definition OPTtypes.h:60
cHpNum * cHpRow
read-only array
Definition OPTtypes.h:103
SgNum * SgRow
a subgradient
Definition OPTtypes.h:112
LMNum * LMRow
a vector of Lagrangean Multipliers
Definition OPTtypes.h:130
cLMNum * cLMRow
a read-only vector of LMs
Definition OPTtypes.h:134
double SgNum
subgradient entries
Definition OPTtypes.h:111
static constexpr T Inf(void) noexcept
Inf< T >() = infinity value for T.
Definition OPTUtils.h:357
virtual void SetPar(const int wp, cHpNum value)=0
virtual void CheckIdentical(const bool Chk=true)
Definition MPSolver.h:396
virtual void SetLowerBound(cHpNum LwBnd=- Inf< HpNum >(), cIndex wFi=Inf< Index >())=0
virtual void SetMPTime(const bool TimeIt=true)
Definition MPSolver.h:426
virtual void SetThreads(int nthreads)
Definition MPSolver.h:343
virtual void SetMPLog(std::ostream *outs=0, const char lvl=0)
Definition MPSolver.h:408
Definition Bundle.h:68
Definition OPTtypes.h:41