hyb_parameter.cpp
Go to the documentation of this file.
1/** @file hyb_parameter.cpp Parameters of linear hybrid automata */
2
3/*
4 Hybrid systems plug-in for FAU Discrete Event Systems Library
5
6 Copyright (C) 2010 Thomas Moor
7
8*/
9
10
11
12#include "hyb_parameter.h"
13
14using namespace faudes;
15
16
17/*
18*************************************************************************
19*************************************************************************
20*************************************************************************
21
22Implementation: Matrix
23
24*************************************************************************
25*************************************************************************
26*************************************************************************
27*/
28
29// faudes Type std
31
32// Constructor
33Matrix::Matrix(void) :
34 mRC(0),
35 mCC(0),
36 mpData(0)
37{
38}
39
40// Constructor
41Matrix::Matrix(int rc, int cc) :
42 mRC(0),
43 mCC(0),
44 mpData(0)
45{
46 if(rc<0 || cc<0) {
47 std::stringstream errstr;
48 errstr << "Index out of range.";
49 throw Exception("Matrix::Matrix()", errstr.str(), 700);
50 }
51 mRC=rc;
52 mCC=cc;
53 if(mRC>0)
54 if(mCC>0)
56}
57
58
59// Constructor
60Matrix::Matrix(const Matrix& rSrc) :
61 mRC(0),
62 mCC(0),
63 mpData(0)
64{
65 DoCopy(rSrc);
66}
67
68// Constructor
69Matrix::Matrix(const std::string& rFileName) :
70 mRC(0),
71 mCC(0),
72 mpData(0)
73{
74 Read(rFileName);
75}
76
77
78// Destructor
80 if(mpData) delete mpData;
81}
82
83
84// virtual Copyment method
86 mRC=rSrc.mRC;
87 mCC=rSrc.mCC;
88 if(mpData) delete mpData;
89 mpData=0;
90 if(mRC>0)
91 if(mCC>0)
92 mpData = new Scalar::Type[mRC*mCC];
93 int sz=Size();
94 for(int k=0; k<sz; k++)
95 mpData[k]=rSrc.mpData[k];
96 return *this;
97}
98
99// virtual compare
100bool Matrix::DoEqual(const Matrix& rSrc) const {
101 if(mRC!=rSrc.mRC) return false;
102 if(mCC!=rSrc.mCC) return false;
103 int sz=Size();
104 for(int k=0; k<sz; k++)
105 if(mpData[k]!=rSrc.mpData[k]) return false;
106 return true;
107}
108
109
110// Clear
111void Matrix::Clear(void) {
112 mRC=0;
113 mCC=0;
114 if(mpData) delete mpData;
115 mpData=0;
116}
117
118
119// Size
120Idx Matrix::Size(void) const {
121 return mRC*mCC;
122}
123
124
125// Set Dimension.
126void Matrix::RowCount(int rc) {
127 if(mRC==rc) return;
128 Clear();
129 if(rc<0) return;
130 mRC=rc;
131 if(mRC>0)
132 if(mCC>0)
133 mpData = new Scalar::Type[mRC*mCC];
134}
135
136
137// Set Dimension.
139 if(mCC==cc) return;
140 Clear();
141 if(cc<0) return;
142 mCC=cc;
143 if(mRC>0)
144 if(mCC>0)
145 mpData = new Scalar::Type[mRC*mCC];
146}
147
148// Set Dimension.
149void Matrix::Dimension(int rc, int cc) {
150 if(mCC==cc && mRC==rc) return;
151 Clear();
152 if(rc<0) return;
153 if(cc<0) return;
154 mRC=rc;
155 mCC=cc;
156 if(mRC>0)
157 if(mCC>0)
158 mpData = new Scalar::Type[mRC*mCC];
159}
160
161// Get Dimension.
162int Matrix::RowCount(void) const {
163 return mRC;
164}
165
166// Get Dimension.
167int Matrix::ColumnCount(void) const {
168 return mCC;
169}
170
171// Zero
172void Matrix::Zero(int rc, int cc) {
173 if(rc >=0 && rc >=0) Dimension(rc,cc);
174 int sz = Size();
175 for(int k=0; k<sz; k++) mpData[k]=0;
176}
177
178
179// Zero
180void Matrix::Identity(int dim) {
181 if(dim >=0) Dimension(dim,dim);
182 int k=0;
183 for(int i=0; i<mRC; i++) {
184 for(int j=0; j<mCC; j++) {
185 mpData[k]=0;
186 if(i==j) mpData[k]=1;
187 k++;
188 }
189 }
190}
191
192
193// Access
194const Scalar::Type& Matrix::At(int i, int j) const {
195 if(i<0 || i>= mRC || j<0 || j>= mCC) {
196 std::stringstream errstr;
197 errstr << "Index out of range.";
198 throw Exception("Matrix::At", errstr.str(), 700);
199 }
200 return mpData[i*mCC+j];
201}
202
203// Access
204void Matrix::At(int i, int j, const Scalar::Type& val) {
205 if(i<0 || i>= mRC || j<0 || j>= mCC) {
206 std::stringstream errstr;
207 errstr << "Index out of range.";
208 throw Exception("Matrix::At", errstr.str(), 700);
209 }
210 mpData[i*mCC+j]=val;
211}
212
213
214// Access
215const Scalar::Type& Matrix::operator()(int i, int j) const {
216 if(i<0 || i>= mRC || j<0 || j>= mCC) {
217 std::stringstream errstr;
218 errstr << "Index out of range.";
219 throw Exception("Matrix::At", errstr.str(), 700);
220 }
221 return mpData[i*mCC+j];
222}
223
224// Access
226 if(i<0 || i>= mRC || j<0 || j>= mCC) {
227 std::stringstream errstr;
228 errstr << "Index out of range.";
229 throw Exception("Matrix::At", errstr.str(), 700);
230 }
231 return mpData[i*mCC+j];
232}
233
234
235// C array access
236void Matrix::CArray(int rc, int cc, const Scalar::Type *data) {
237 Dimension(rc,cc);
238 int sz=Size();
239 for(int k=0; k<sz; k++)
240 mpData[k]=data[k];
241}
242
243// C array access
244/*
245void Matrix::CArray(int rc, int cc, Scalar::Type **data) {
246 Clear();
247 if(rc<0) return;
248 if(cc<0) return;
249 mRC=rc;
250 mCC=cc;
251 mpData=*data;
252}
253*/
254
255// C array access
256const Scalar::Type* Matrix::CArray(void) const {
257 return mpData;
258}
259
260// token IO
261void Matrix::DoWrite(TokenWriter& rTw, const std::string& rLabel, const Type* pContext) const {
262 // ignore context
263 (void) pContext;
264 // figure section
265 std::string label=rLabel;
266 if(rLabel=="") label="Matrix";
267 // write section
268 Token btoken;
269 btoken.SetBegin(label);
270 btoken.InsAttributeInteger("rows",mRC);
271 btoken.InsAttributeInteger("columns",mCC);
272 rTw << btoken;
273 int oldcols = rTw.Columns();
274 rTw.Columns(mCC);
275 for(unsigned int k=0; k<Size(); k++)
276 rTw.WriteFloat(mpData[k]);
277 rTw.Columns(oldcols);
278 // end section
279 rTw.WriteEnd(label);
280}
281
282// token IO
284 // write dimensions
285 rTw.WriteComment("Matrix with dimensions " + ToStringInteger(mRC)
286 + "x" +ToStringInteger(mCC));
287}
288
289
290// token IO
291void Matrix::DoRead(TokenReader& rTr, const std::string& rLabel, const Type* pContext) {
292 // ignore context
293 (void) pContext;
294 // figure section
295 std::string label=rLabel;
296 if(rLabel=="") label="Matrix";
297 // find section
298 Token btoken;
299 rTr.ReadBegin(label,btoken);
300 // read dimensions
301 int rc=btoken.AttributeIntegerValue("rows");
302 int cc=btoken.AttributeIntegerValue("columns");
303 // test/allocate (token integers are nonnegative anyway .. but this may change)
304 if(rc <0 || cc <0) {
305 std::stringstream errstr;
306 errstr << "Invalid dimension. " << rTr.FileLine();
307 throw Exception("Matrix::DoRead", errstr.str(), 700);
308 }
309 Dimension(rc,cc);
310 // read data
311 int k=0;
312 while(!rTr.Eos(label) && k<(int)Size()) {
313 mpData[k]=rTr.ReadFloat();
314 k++;
315 }
316 // test data
317 if(k!=(int)Size()) {
318 std::stringstream errstr;
319 errstr << "Dimension mismatch. " << rTr.FileLine();
320 throw Exception("Matrix::DoRead", errstr.str(), 700);
321 }
322 // end section
323 rTr.ReadEnd(label);
324}
325
326
327/*
328*************************************************************************
329*************************************************************************
330*************************************************************************
331
332Implementation: Vector
333
334*************************************************************************
335*************************************************************************
336*************************************************************************
337*/
338
339// faudes Type std
341
342// Constructor
343Vector::Vector(void) :
344 mDim(0),
345 mpData(0)
346{
347}
348
349// Constructor
351 mDim(0),
352 mpData(0)
353{
354 if(dim<0) {
355 std::stringstream errstr;
356 errstr << "Index out of range.";
357 throw Exception("Vector::Vector()", errstr.str(), 700);
358 }
359 mDim=dim;
360 if(mDim>0)
361 mpData = new Scalar::Type[mDim];
362}
363
364
365// Constructor
366Vector::Vector(const Vector& rSrc) :
367 mDim(0),
368 mpData(0)
369{
370 DoCopy(rSrc);
371}
372
373// Constructor
374Vector::Vector(const std::string& rFileName) :
375 mDim(0),
376 mpData(0)
377{
378 Read(rFileName);
379}
380
381
382// Destructor
384 if(mpData) delete mpData;
385}
386
387
388// virtual Copyment method
390 mDim=rSrc.mDim;
391 if(mpData) delete mpData;
392 mpData=0;
393 if(mDim>0)
394 mpData = new Scalar::Type[mDim];
395 for(int k=0; k<mDim; k++)
396 mpData[k]=rSrc.mpData[k];
397 return *this;
398}
399
400// virtual compare
401bool Vector::DoEqual(const Vector& rSrc) const {
402 if(mDim!=rSrc.mDim) return false;
403 for(int k=0; k<mDim; k++)
404 if(mpData[k]!=rSrc.mpData[k]) return false;
405 return true;
406}
407
408
409// Clear
410void Vector::Clear(void) {
411 mDim=0;
412 if(mpData) delete mpData;
413 mpData=0;
414}
415
416
417// Size
418Idx Vector::Size(void) const {
419 return mDim;
420}
421
422
423// Set Dimension.
424void Vector::Dimension(int dim) {
425 if(mDim==dim) return;
426 Clear();
427 if(dim<0) return;
428 mDim=dim;
429 if(mDim>0)
430 mpData = new Scalar::Type[mDim];
431}
432
433
434// Get Dimension.
435int Vector::Dimension(void) const {
436 return mDim;
437}
438
439
440// Zero
441void Vector::Zero(int dim) {
442 if(dim >=0) Dimension(dim);
443 for(int k=0; k<mDim; k++) mpData[k]=0;
444}
445
446
447// Ones
448void Vector::Ones(int dim) {
449 if(dim >=0) Dimension(dim);
450 for(int k=0; k<mDim; k++) mpData[k]=1;
451}
452
453
454// Access
455const Scalar::Type& Vector::At(int i) const {
456 if(i<0 || i>= mDim) {
457 std::stringstream errstr;
458 errstr << "Index out of range.";
459 throw Exception("Vector::At", errstr.str(), 700);
460 }
461 return mpData[i];
462}
463
464// Access
465void Vector::At(int i, const Scalar::Type& val) {
466 if(i<0 || i>= mDim) {
467 std::stringstream errstr;
468 errstr << "Index out of range.";
469 throw Exception("Vector::At", errstr.str(), 700);
470 }
471 mpData[i]=val;
472}
473
474
475// Access
476const Scalar::Type& Vector::operator()(int i) const {
477 if(i<0 || i>= mDim) {
478 std::stringstream errstr;
479 errstr << "Index out of range.";
480 throw Exception("Vector::At", errstr.str(), 700);
481 }
482 return mpData[i];
483}
484
485// Access
487 if(i<0 || i>= mDim) {
488 std::stringstream errstr;
489 errstr << "Index out of range.";
490 throw Exception("Vector::At", errstr.str(), 700);
491 }
492 return mpData[i];
493}
494
495
496// C array access
497void Vector::CArray(int dim, const Scalar::Type *data) {
498 Dimension(dim);
499 for(int k=0; k<dim; k++)
500 mpData[k]=data[k];
501}
502
503
504// C array access
505const Scalar::Type* Vector::CArray(void) const {
506 return mpData;
507}
508
509
510// token IO
511void Vector::DoWrite(TokenWriter& rTw, const std::string& rLabel, const Type* pContext) const {
512 // ignore context
513 (void) pContext;
514 // figure section
515 std::string label=rLabel;
516 if(rLabel=="") label="Vector";
517 // write section
518 Token btoken;
519 btoken.SetBegin(label);
520 btoken.InsAttributeInteger("count",mDim);
521 rTw << btoken;
522 int oldcols = rTw.Columns();
523 rTw.Columns(mDim);
524 for(int k=0; k<mDim; k++)
525 rTw.WriteFloat(mpData[k]);
526 rTw.Columns(oldcols);
527 // end section
528 rTw.WriteEnd(label);
529}
530
531// token IO
533 // write dimensions
534 rTw.WriteComment("Vector with dimension " + ToStringInteger(mDim));
535}
536
537
538// token IO
539void Vector::DoRead(TokenReader& rTr, const std::string& rLabel, const Type* pContext) {
540 // ignore context
541 (void) pContext;
542 // figure section
543 std::string label=rLabel;
544 if(rLabel=="") label="Vector";
545 // find section
546 Token btoken;
547 rTr.ReadBegin(label,btoken);
548 // read dimensions
549 int dim=btoken.AttributeIntegerValue("count");
550 // test/allocate (token integers are nonnegative anyway .. but this may change)
551 if(dim <0) {
552 std::stringstream errstr;
553 errstr << "Invalid dimension. " << rTr.FileLine();
554 throw Exception("Vector::DoRead", errstr.str(), 700);
555 }
556 Dimension(dim);
557 // read data
558 int k=0;
559 while(!rTr.Eos(label) && k<(int)Size()) {
560 mpData[k]=rTr.ReadFloat();
561 k++;
562 }
563 // test data
564 if(k!=(int)Size()) {
565 std::stringstream errstr;
566 errstr << "Dimension mismatch. " << rTr.FileLine();
567 throw Exception("Vector::DoRead", errstr.str(), 700);
568 }
569 // end section
570 rTr.ReadEnd(label);
571}
572
573
574/*
575*************************************************************************
576*************************************************************************
577*************************************************************************
578
579Implementation: Polyhedron
580
581*************************************************************************
582*************************************************************************
583*************************************************************************
584*/
585
586// faudes Type std
588
589// Constructor
591 mName(),
592 mA(0,0),
593 mB(0),
594 mpUserData(0)
595{
596}
597
598// Constructor
600 mName(),
601 mA(0,0),
602 mB(0),
603 mpUserData(0)
604{
605 if(dim<0) {
606 std::stringstream errstr;
607 errstr << "Index out of range.";
608 throw Exception("Polyhedron::Polyhedron()", errstr.str(), 700);
609 }
610 mA.Dimension(0,dim);
611 mB.Dimension(0);
612}
613
614
615// Constructor
617 mName(),
618 mA(0,0),
619 mB(0),
620 mpUserData(0)
621{
622 DoCopy(rSrc);
623}
624
625// Constructor
626Polyhedron::Polyhedron(const std::string& rFileName) :
627 mName(),
628 mA(0,0),
629 mB(0),
630 mpUserData(0)
631{
632 Read(rFileName);
633}
634
635
636// Destructor
638 if(mpUserData) delete mpUserData;
639}
640
641
642// virtual Copyment method
644 mName=rSrc.mName;
645 mA=rSrc.mA;
646 mB=rSrc.mB;
647 if(mpUserData) delete mpUserData;
648 mpUserData=0;
649 return *this;
650}
651
652// virtual compare
653bool Polyhedron::DoEqual(const Polyhedron& rSrc) const {
654 if(mA!=rSrc.mA) return false;
655 if(mB!=rSrc.mB) return false;
656 return true;
657}
658
659
660// Clear
662 Dimension(0);
663}
664
665
666// Size
668 return mA.RowCount();
669}
670
671
672// Set Dimension.
674 if(dim<0) {
675 std::stringstream errstr;
676 errstr << "Invalid dimension";
677 throw Exception("Polyhedron::Dimension", errstr.str(), 700);
678 }
679 mA.Dimension(0,dim);
680 mB.Dimension(0);
681 if(mpUserData) delete mpUserData;
682 mpUserData=0;
683}
684
685
686// Get Dimension.
687int Polyhedron::Dimension(void) const {
688 return mA.ColumnCount();
689}
690
691
692// Access
693const Matrix& Polyhedron::A(void) const {
694 return mA;
695}
696
697// Access
698const Vector& Polyhedron::B(void) const {
699 return mB;
700}
701
702// Access
703void Polyhedron::AB(const Matrix& rA, const Vector& rB) {
704 if(rA.RowCount()!=rB.Dimension()) {
705 std::stringstream errstr;
706 errstr << "Invalid dimansions.";
707 throw Exception("Polyhedron::AB", errstr.str(), 700);
708 }
710 mA=rA;
711 mB=rB;
712 if(mpUserData) delete mpUserData;
713 mpUserData=0;
714}
715
716
717// User data
718void Polyhedron::UserData(Type* data) const {
719 Polyhedron* fakeconst= const_cast<Polyhedron*>(this);
720 if(mpUserData) delete fakeconst->mpUserData;
721 fakeconst->mpUserData=data;
722}
723
724// User data
726 return mpUserData;
727}
728
729
730
731// token IO
732void Polyhedron::DoWrite(TokenWriter& rTw, const std::string& rLabel, const Type* pContext) const {
733 // ignore context
734 (void) pContext;
735 // figure section
736 std::string label=rLabel;
737 std::string ftype="Polyhedron";
738 if(rLabel=="") label=ftype;
739 Token btag;
740 btag.SetBegin(label);
741 if(label!=ftype) btag.InsAttribute("ftype",ftype);
742 if((Name()!=label) && (Name()!="")) btag.InsAttribute("name",Name());
743 // write section
744 rTw.Write(btag);
745 // write data
746 mA.Write(rTw,"AMatrix");
747 mB.Write(rTw,"BVector");
748 // end section
749 rTw.WriteEnd(label);
750}
751
752// token IO
754 // write dimensions
755 rTw.WriteComment("Polyhedron statistics");
756 rTw.WriteComment(" dimension: "+ ToStringInteger(Dimension()));
757 rTw.WriteComment(" inequalities: "+ ToStringInteger(Size()));
758}
759
760
761// token IO
762void Polyhedron::DoRead(TokenReader& rTr, const std::string& rLabel, const Type* pContext) {
763 // ignore context
764 (void) pContext;
765 // figure section
766 std::string label=rLabel;
767 if(rLabel=="") label="Polyhedron";
768 // find section
769 Token btag;
770 rTr.ReadBegin(label,btag);
771 if(btag.ExistsAttributeString("name"))
772 Name(btag.AttributeStringValue("name"));
773 // read data
774 mA.Read(rTr,"AMatrix");
775 mB.Read(rTr,"BVector");
776 // test
777 if(mA.RowCount()!=mB.Dimension()) {
778 std::stringstream errstr;
779 errstr << "Dimension mismatch, rows. " << rTr.FileLine();
780 throw Exception("Polyhedron::DoRead", errstr.str(), 700);
781 }
782 // end section
783 rTr.ReadEnd(label);
784 // note: this should not be nacessary since Read calls Clear before DoRead
785 //if(mpUserData) delete mpUserData;
786 //mpUserData=0;
787}
788
789
790/*
791*************************************************************************
792*************************************************************************
793*************************************************************************
794
795Implementation: Relation
796
797*************************************************************************
798*************************************************************************
799*************************************************************************
800*/
801
802// faudes Type std
804
805// Constructor
807 mName(),
808 mCase(I),
809 mA1(0,0),
810 mA2(0,0),
811 mB(0),
812 mC(0,0),
813 mD(0),
814 mpUserData(0)
815{
816}
817
818// Constructor
820 mName(),
821 mCase(I),
822 mA1(0,0),
823 mA2(0,0),
824 mB(0),
825 mC(0,0),
826 mD(0),
827 mpUserData(0)
828{
829 if(dim<0) {
830 std::stringstream errstr;
831 errstr << "Dimension out of range.";
832 throw Exception("LinearRelation::LinearRelation()", errstr.str(), 700);
833 }
834 Identity(dim);
835}
836
837
838// Constructor
840 mName(),
841 mCase(I),
842 mA1(0,0),
843 mA2(0,0),
844 mB(0),
845 mC(0,0),
846 mD(0),
847 mpUserData(0)
848{
849 DoCopy(rSrc);
850}
851
852// Constructor
853LinearRelation::LinearRelation(const std::string& rFileName) :
854 mName(),
855 mCase(I),
856 mA1(0,0),
857 mA2(0,0),
858 mB(0),
859 mC(0,0),
860 mD(0),
861 mpUserData(0)
862{
863 Read(rFileName);
864}
865
866
867// Destructor
871
872
873// virtual Copyment method
875 mName=rSrc.mName;
876 mCase=rSrc.mCase;
877 mA1=rSrc.mA1;
878 mA2=rSrc.mA2;
879 mB=rSrc.mB;
880 mC=rSrc.mC;
881 mD=rSrc.mD;
882 if(mpUserData) delete mpUserData;
883 mpUserData=0;
884 return *this;
885}
886
887// virtual compare
889 if(mCase!=rSrc.mCase) return false;
890 if(mA1!=rSrc.mA1) return false;
891 if(mA2!=rSrc.mA2) return false;
892 if(mB!=rSrc.mB) return false;
893 if(mC!=rSrc.mC) return false;
894 if(mD!=rSrc.mD) return false;
895 return true;
896}
897
898
899// Clear
901 Dimension(0);
902}
903
904
905// Size
907 return mB.Dimension();
908}
909
910
911// Set Dimension.
913 if(dim<0) {
914 std::stringstream errstr;
915 errstr << "Invalid dimension";
916 throw Exception("LinearRelation::Dimension", errstr.str(), 700);
917 }
918 Identity(dim);
919}
920
921
922// Get Dimension.
924 if(Relation()) return mA1.ColumnCount();
925 return mC.ColumnCount();
926}
927
928
929
930// Test case
931bool LinearRelation::Identity(void) const {
932 if(mCase==I) return true;
933 return false;
934}
935
936// Test case
937bool LinearRelation::Map(void) const {
938 if(mCase!=R) return true;
939 return false;
940}
941
942// Test case
943bool LinearRelation::Relation(void) const {
944 return true;
945}
946
947// Access
948const Matrix& LinearRelation::A1(void) const {
949 return mA1;
950}
951
952// Access
953const Matrix& LinearRelation::A2(void) const {
954 return mA2;
955}
956
957// Access
958const Vector& LinearRelation::B(void) const {
959 return mB;
960}
961
962// Access
963const Matrix& LinearRelation::C(void) const {
964 return mC;
965}
966
967// Access
968const Vector& LinearRelation::D(void) const {
969 return mD;
970}
971
972// Access
973void LinearRelation::Relation(const Matrix& rA1, const Matrix& rA2, const Vector& rB) {
974 if(rA1.RowCount()!=rB.Dimension()) {
975 std::stringstream errstr;
976 errstr << "Invalid dimensions.";
977 throw Exception("LinearRelation::Relation", errstr.str(), 700);
978 }
979 if(rA2.RowCount()!=rB.Dimension()) {
980 std::stringstream errstr;
981 errstr << "Invalid dimensions.";
982 throw Exception("LinearRelation::Relation", errstr.str(), 700);
983 }
984 if(rA1.ColumnCount()!=rA1.ColumnCount()) {
985 std::stringstream errstr;
986 errstr << "Invalid dimensions.";
987 throw Exception("LinearRelation::Relation", errstr.str(), 700);
988 }
989 mCase=R;
990 mA1=rA1;
991 mA2=rA2;
992 mB=rB;
993 mC.Clear();
994 mD.Clear();
995 if(mpUserData) delete mpUserData;
996 mpUserData=0;
997}
998
999// Access
1000void LinearRelation::Map(const Matrix& rC, const Vector& rD) {
1001 if(rC.RowCount()!=rC.ColumnCount()) {
1002 std::stringstream errstr;
1003 errstr << "Invalid dimensions.";
1004 throw Exception("LinearRelation::Map", errstr.str(), 700);
1005 }
1006 if(rC.RowCount()!=rD.Dimension()) {
1007 std::stringstream errstr;
1008 errstr << "Invalid dimensions.";
1009 throw Exception("LinearRelation::Map", errstr.str(), 700);
1010 }
1011 mCase=M;
1012 mC=rC;
1013 mD=rD;
1014 // fix other data
1015 //
1016 // -C x1 + I x2 <= d
1017 // C x1 - I x2 <= -d
1018 //
1019 int n=rC.RowCount();
1020 mA1.Zero(2*n,n);
1021 mA2.Zero(2*n,n);
1022 mB.Dimension(2*n);
1023 for(int i =0; i<n; i++) {
1024 for(int j =0; j<n; j++) {
1025 mA1(i,j)= -mC(i,j);
1026 mA1(i+n,j)= mC(i,j);
1027 if(i==j) {
1028 mA2(i,j)=1;
1029 mA2(i+n,j)=-1;
1030 }
1031 }
1032 mB(i)=mD(i);
1033 mB(i+n)=-mD(i);
1034 }
1035 if(mpUserData) delete mpUserData;
1036 mpUserData=0;
1037}
1038
1039// Access
1041 mCase=I;
1042 mA1.Clear();
1043 mA2.Clear();
1044 mB.Clear();
1045 mC.Identity(dim);
1046 mD.Zero(dim);
1047 // fix other data
1048 //
1049 // -I x1 + I x2 <= 0
1050 // I x1 - I x2 <= 0
1051 //
1052 int n=mC.RowCount();
1053 mA1.Zero(2*n,n);
1054 mA2.Zero(2*n,n);
1055 mB.Dimension(2*n);
1056 for(int i =0; i<n; i++) {
1057 mA1(i,i)= -1;
1058 mA1(i+n,i)= 1;
1059 mA2(i,i)= 1;
1060 mA2(i+n,i)= -1;
1061 }
1062 if(mpUserData) delete mpUserData;
1063 mpUserData=0;
1064}
1065
1066
1067// User data
1069 LinearRelation* fakeconst= const_cast<LinearRelation*>(this);
1070 if(mpUserData) delete fakeconst->mpUserData;
1071 fakeconst->mpUserData=data;
1072}
1073
1074// User data
1076 return mpUserData;
1077}
1078
1079
1080// token IO
1081void LinearRelation::DoWrite(TokenWriter& rTw, const std::string& rLabel, const Type* pContext) const {
1082 // ignore context
1083 (void) pContext;
1084 // figure section
1085 std::string label=rLabel;
1086 if(rLabel=="") label="LinearRelation";
1087 // write section
1088 Token stoken;
1089 stoken.SetBegin(label);
1090 stoken.InsAttributeInteger("dim",Dimension());
1091 rTw.Write(stoken);
1092 // write data
1093 if(Map()) {
1094 mC.Write(rTw,"CMatrix");
1095 mD.Write(rTw,"DVector");
1096 } else {
1097 mA1.Write(rTw,"A1Matrix");
1098 mA2.Write(rTw,"A2Matrix");
1099 mB.Write(rTw,"BVector");
1100 }
1101 // end section
1102 rTw.WriteEnd(label);
1103}
1104
1105// token IO
1107 // write dimensions
1108 rTw.WriteComment("LinearRelation statistics");
1109 rTw.WriteComment(" dimension: "+ ToStringInteger(Dimension()));
1110 if(mCase==I)
1111 rTw.WriteComment(" case: identity");
1112 if(mCase==M)
1113 rTw.WriteComment(" case: map");
1114 if(mCase==R)
1115 rTw.WriteComment(" inequalities: "+ ToStringInteger(Size()));
1116}
1117
1118
1119// token IO
1120void LinearRelation::DoRead(TokenReader& rTr, const std::string& rLabel, const Type* pContext) {
1121 // ignore context
1122 (void) pContext;
1123 // figure section
1124 std::string label=rLabel;
1125 if(rLabel=="") label="LinearRelation";
1126 // find section
1127 Token stoken;
1128 rTr.ReadBegin(label,stoken);
1129 int dim=-1;
1130 if(stoken.ExistsAttributeInteger("dim"))
1131 dim=stoken.AttributeIntegerValue("dim");
1132 // figure case
1133 Token token;
1134 rTr.Peek(token);
1135 // case: identity
1136 if(token.IsEnd(label)){
1137 Identity(dim);
1138 }
1139 // case: map
1140 if(token.IsBegin("CMatrix")) {
1141 Matrix c;
1142 Vector d;
1143 c.Read(rTr,"CMatrix");
1144 d.Read(rTr,"DVector");
1145 Map(c,d);
1146 }
1147 // case: relation
1148 if(token.IsBegin("A1Matrix")) {
1149 Matrix a1, a2;
1150 Vector b;
1151 a1.Read(rTr,"A1Matrix");
1152 a2.Read(rTr,"A2Matrix");
1153 b.Read(rTr,"BVector");
1154 Relation(a1,a2,b);
1155 }
1156 // should trace errors ...
1157 // end section
1158 rTr.ReadEnd(label);
1159 // .. done by virtual clear
1160 //if(mpUserData) delete mpUserData;
1161 //mpUserData=0;
1162}
1163
#define FAUDES_TYPE_IMPLEMENTATION(ftype, ctype, cbase)
Definition cfl_types.h:1017
virtual void DoSWrite(TokenWriter &tw) const
const Vector & B(void) const
const Matrix & C(void) const
virtual LinearRelation & DoCopy(const LinearRelation &rSrc)
virtual void DoRead(TokenReader &tr, const std::string &rLabel="", const Type *pContext=0)
virtual bool DoEqual(const LinearRelation &rOther) const
const Vector & D(void) const
virtual void DoWrite(TokenWriter &tw, const std::string &rLabel="", const Type *pContext=0) const
virtual ~LinearRelation(void)
const Matrix & A2(void) const
bool Relation(void) const
bool Identity(void) const
Type * UserData(void) const
int Dimension(void) const
const Matrix & A1(void) const
void Identity(int dim=-1)
const Scalar::Type & operator()(int i, int j) const
int ColumnCount(void) const
Idx Size(void) const
int RowCount(void) const
virtual void DoSWrite(TokenWriter &tw) const
virtual void DoRead(TokenReader &tr, const std::string &rLabel="", const Type *pContext=0)
Scalar::Type * mpData
virtual ~Matrix(void)
void RowCount(int rc)
virtual void DoWrite(TokenWriter &tw, const std::string &rLabel="", const Type *pContext=0) const
const Scalar::Type & At(int i, int j) const
virtual Matrix & DoCopy(const Matrix &rSrc)
void Zero(int rc=-1, int cc=-1)
virtual bool DoEqual(const Matrix &rOther) const
void ColumnCount(int cc)
const Scalar::Type * CArray(void) const
void Dimension(int rc, int cc)
virtual void DoWrite(TokenWriter &tw, const std::string &rLabel="", const Type *pContext=0) const
Idx Size(void) const
virtual void DoRead(TokenReader &tr, const std::string &rLabel="", const Type *pContext=0)
virtual Polyhedron & DoCopy(const Polyhedron &rSrc)
virtual const std::string & Name(void) const
virtual void DoSWrite(TokenWriter &tw) const
const Matrix & A(void) const
void AB(const Matrix &rA, const Vector &rB)
int Dimension(void) const
const Vector & B(void) const
virtual ~Polyhedron(void)
virtual bool DoEqual(const Polyhedron &rOther) const
Type * UserData(void) const
std::string FileLine(void) const
bool Eos(const std::string &rLabel)
void ReadEnd(const std::string &rLabel)
void ReadBegin(const std::string &rLabel)
bool Peek(Token &token)
void WriteFloat(const double &val)
void WriteComment(const std::string &rComment)
void Write(Token &rToken)
void WriteEnd(const std::string &rLabel)
int Columns(void) const
Int AttributeIntegerValue(const std::string &name)
bool ExistsAttributeString(const std::string &name)
bool IsBegin(void) const
void InsAttribute(const std::string &name, const std::string &value)
void SetBegin(const std::string &rName)
Definition cfl_token.cpp:92
bool ExistsAttributeInteger(const std::string &name)
void InsAttributeInteger(const std::string &name, Int value)
bool IsEnd(void) const
const std::string & AttributeStringValue(const std::string &name)
void Read(const std::string &rFileName, const std::string &rLabel="", const Type *pContext=0)
void Write(const Type *pContext=0) const
virtual Vector & DoCopy(const Vector &rSrc)
Idx Size(void) const
const Scalar::Type & operator()(int i) const
const Scalar::Type * CArray(void) const
const Scalar::Type & At(int i) const
virtual void DoSWrite(TokenWriter &tw) const
void Zero(int dim=-1)
void Ones(int dim=-1)
virtual bool DoEqual(const Vector &rOther) const
int Dimension(void) const
virtual void DoRead(TokenReader &tr, const std::string &rLabel="", const Type *pContext=0)
virtual void DoWrite(TokenWriter &tw, const std::string &rLabel="", const Type *pContext=0) const
Scalar::Type * mpData
virtual ~Vector(void)
uint32_t Idx
std::string ToStringInteger(Int number)
Definition cfl_utils.cpp:43

libFAUDES 2.34d --- 2026.03.11 --- c++ api documentaion by doxygen