00001 #pragma ident "$Id: EquationSystem.cpp 2939 2011-10-23 19:55:11Z yanweignss $"
00002
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031 #include "EquationSystem.hpp"
00032 #include <iterator>
00033
00034 namespace gpstk
00035 {
00036
00037
00038
00039
00040 WhiteNoiseModel EquationSystem::whiteNoiseModel;
00041
00042
00043
00044
00045
00046
00047
00048
00049 EquationSystem& EquationSystem::addEquation( const Equation& equation )
00050 {
00051
00052
00053 equationDescriptionList.push_back(equation);
00054
00055
00056 isPrepared = false;
00057
00058 return (*this);
00059
00060 }
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073 EquationSystem& EquationSystem::removeEquation( const Variable& indterm )
00074 {
00075
00076
00077 std::list<Equation> backupList;
00078
00079
00080 for( std::list<Equation>::const_iterator itEq =
00081 equationDescriptionList.begin();
00082 itEq != equationDescriptionList.end();
00083 ++itEq )
00084 {
00085
00086
00087 if ( (*itEq).getIndependentTerm() != indterm )
00088 {
00089 backupList.push_back(*itEq);
00090 }
00091
00092 }
00093
00094
00095 clearEquations();
00096
00097
00098 for( std::list<Equation>::const_iterator itEq = backupList.begin();
00099 itEq != backupList.end();
00100 ++itEq )
00101 {
00102 addEquation(*itEq);
00103 }
00104
00105
00106 isPrepared = false;
00107
00108 return (*this);
00109
00110 }
00111
00112
00113
00114
00115 EquationSystem& EquationSystem::clearEquations()
00116 {
00117
00118 equationDescriptionList.clear();
00119
00120 isPrepared = false;
00121
00122 return (*this);
00123
00124 }
00125
00126
00127
00128
00129
00130
00131
00132
00133 EquationSystem& EquationSystem::Prepare( gnssRinex& gData )
00134 {
00135
00136
00137 gnssDataMap myGDSMap;
00138
00139
00140 myGDSMap.addGnssRinex( gData );
00141
00142
00143 return (Prepare(myGDSMap));
00144
00145 }
00146
00147
00148
00149
00150
00151
00152
00153
00154
00155 EquationSystem& EquationSystem::Prepare( gnssDataMap& gdsMap )
00156 {
00157
00158
00159 oldUnknowns = currentUnknowns;
00160
00161
00162 varUnknowns = currentUnknowns;
00163
00164
00165 currentUnknowns = prepareCurrentUnknownsAndEquations(gdsMap);
00166
00167
00168 allUnknowns.clear();
00169 for(VariableSet::const_iterator it = currentUnknowns.begin();
00170 it != currentUnknowns.end();
00171 it++)
00172 { allUnknowns.push_back(*it); }
00173
00174 currentUnknowns.clear();
00175 rejectUnknowns.clear();
00176 for(std::list<Variable>::const_iterator it = allUnknowns.begin();
00177 it != allUnknowns.end();
00178 it++)
00179 {
00180 if((*it).getTypeIndexed())
00181 {
00182 currentUnknowns.insert(*it);
00183 }
00184 else
00185 {
00186 rejectUnknowns.insert(*it);
00187 }
00188 }
00189
00190
00191
00192 varUnknowns.insert( currentUnknowns.begin(), currentUnknowns.end() );
00193
00194
00195 getPhiQ(gdsMap);
00196
00197
00198 getPrefit(gdsMap);
00199
00200
00201 getGeometryWeights(gdsMap);
00202
00203
00204 imposeConstraints();
00205
00206
00207
00208
00209
00210
00211
00212
00213
00214
00215
00216
00217
00218
00219
00220
00221
00222
00223
00224
00225
00226
00227
00228
00229
00230
00231
00232
00233 isPrepared = true;
00234
00235 return (*this);
00236
00237 }
00238
00239
00240
00241
00242 void EquationSystem::prepareCurrentSourceSat( gnssDataMap& gdsMap )
00243 {
00244
00245
00246 currentSatSet.clear();
00247 currentSourceSet.clear();
00248
00249
00250 currentSatSet = gdsMap.getSatIDSet();
00251
00252
00253 currentSourceSet = gdsMap.getSourceIDSet();
00254
00255
00256 return;
00257
00258 }
00259
00260
00261
00262
00263 VariableSet EquationSystem::prepareCurrentUnknownsAndEquations(
00264 gnssDataMap& gdsMap )
00265 {
00266
00267
00268 currentEquationsList.clear();
00269
00270
00271 VariableSet currentUnkSet;
00272
00273
00274
00275 prepareCurrentSourceSat( gdsMap );
00276
00277
00278
00279 for( std::list<Equation>::const_iterator itEq =
00280 equationDescriptionList.begin();
00281 itEq != equationDescriptionList.end();
00282 ++itEq )
00283 {
00284
00285
00286 SourceIDSet equSourceSet;
00287
00288
00289 if ( (*itEq).getEquationSource() == Variable::allSources )
00290 {
00291 equSourceSet = currentSourceSet;
00292 }
00293 else
00294 {
00295
00296
00297 if ( (*itEq).getEquationSource() == Variable::someSources )
00298 {
00299
00300
00301
00302 SourceIDSet tempSourceSet( (*itEq).getSourceSet() );
00303
00304
00305
00306 std::insert_iterator< SourceIDSet >
00307 itOut( equSourceSet, equSourceSet.begin() );
00308
00309
00310 set_intersection( tempSourceSet.begin(), tempSourceSet.end(),
00311 currentSourceSet.begin(), currentSourceSet.end(),
00312 itOut );
00313
00314 }
00315 else
00316 {
00317
00318
00319 equSourceSet.insert( (*itEq).getEquationSource() );
00320 }
00321
00322 }
00323
00324
00325 SatIDSet equSatSet = (*itEq).getSatSet();
00326
00327
00328
00329
00330
00331
00332
00333 for( SourceIDSet::const_iterator itSource = equSourceSet.begin();
00334 itSource != equSourceSet.end();
00335 ++itSource )
00336 {
00337
00338
00339 SatIDSet visibleSatSet;
00340
00341
00342 for( gnssDataMap::const_iterator it = gdsMap.begin();
00343 it != gdsMap.end();
00344 ++it )
00345 {
00346
00347
00348 sourceDataMap::const_iterator sdmIter(
00349 (*it).second.find( (*itSource) ) );
00350
00351
00352 if( sdmIter != (*it).second.end() )
00353 {
00354
00355
00356 for( satTypeValueMap::const_iterator stvmIter =
00357 (*sdmIter).second.begin();
00358 stvmIter != (*sdmIter).second.end();
00359 stvmIter++ )
00360 {
00361
00362 if((equSatSet.size() > 0) &&
00363 (equSatSet.find((*stvmIter).first) == equSatSet.end()))
00364 {
00365 continue;
00366 }
00367
00368
00369 visibleSatSet.insert( (*stvmIter).first );
00370
00371 }
00372
00373 }
00374
00375 }
00376
00377
00378
00379
00380
00381 Equation tempEquation( (*itEq) );
00382
00383
00384 tempEquation.clear();
00385
00386
00387 tempEquation.header.equationSource = (*itSource);
00388
00389
00390 for( VariableSet::const_iterator itVar = (*itEq).body.begin();
00391 itVar != (*itEq).body.end();
00392 ++itVar )
00393 {
00394
00395
00396 Variable var( (*itVar) );
00397
00398
00399
00400
00401 if( var.getSourceIndexed() )
00402 {
00403 var.setSource( (*itSource) );
00404 }
00405
00406
00407
00408
00409 tempEquation.addVariable(var);
00410
00411
00412
00413 if( !var.getSatIndexed() )
00414 {
00415
00416
00417 currentUnkSet.insert(var);
00418
00419 }
00420 else
00421 {
00422
00423
00424
00425 for( SatIDSet::const_iterator itSat = visibleSatSet.begin();
00426 itSat != visibleSatSet.end();
00427 ++itSat )
00428 {
00429
00430
00431 var.setSatellite( (*itSat) );
00432
00433
00434
00435 currentUnkSet.insert(var);
00436 }
00437
00438 }
00439
00440 }
00441
00442
00443
00444
00445
00446
00447 for( SatIDSet::const_iterator itSat = visibleSatSet.begin();
00448 itSat != visibleSatSet.end();
00449 ++itSat )
00450 {
00451 tempEquation.header.equationSat = (*itSat);
00452
00453
00454 currentEquationsList.push_back( tempEquation );
00455 }
00456
00457 }
00458
00459 }
00460
00461
00462
00463
00464 int eqListSize( currentEquationsList.size() );
00465 for( int i = 0; i < eqListSize; ++i )
00466 {
00467
00468
00469 Equation tempEqu( currentEquationsList.front() );
00470
00471
00472 currentEquationsList.pop_front();
00473
00474
00475 VariableSet varSet( tempEqu.body );
00476
00477
00478 tempEqu.clear();
00479
00480
00481
00482 for( VariableSet::iterator itVar = varSet.begin();
00483 itVar != varSet.end();
00484 ++itVar )
00485 {
00486
00487
00488 if( !(*itVar).getSatIndexed() )
00489 {
00490
00491 tempEqu.addVariable( (*itVar) );
00492 }
00493 else
00494 {
00495
00496
00497 Variable var( (*itVar) );
00498 var.setSatellite( tempEqu.header.equationSat );
00499
00500 tempEqu.addVariable( var );
00501 }
00502
00503 }
00504
00505
00506 currentEquationsList.push_back( tempEqu );
00507
00508 }
00509
00510
00511
00512 return currentUnkSet;
00513
00514 }
00515
00516
00517
00518
00519 void EquationSystem::getPhiQ( const gnssDataMap& gdsMap )
00520 {
00521
00522 const int numVar( varUnknowns.size() );
00523
00524
00525 phiMatrix.resize( numVar, numVar, 0.0);
00526 qMatrix.resize( numVar, numVar, 0.0);
00527
00528
00529 int i(0);
00530
00531
00532 for( VariableSet::const_iterator itVar = varUnknowns.begin();
00533 itVar != varUnknowns.end();
00534 ++itVar )
00535 {
00536
00537
00538 if( currentUnknowns.find( (*itVar) ) != currentUnknowns.end() )
00539 {
00540
00541
00542 gnssRinex gRin( gdsMap.getGnssRinex( (*itVar).getSource() ) );
00543
00544
00545 (*itVar).getModel()->Prepare( (*itVar).getSatellite(),
00546 gRin );
00547
00548
00549 if( oldUnknowns.find( (*itVar) ) != oldUnknowns.end() )
00550 {
00551
00552 phiMatrix(i,i) = (*itVar).getModel()->getPhi();
00553 qMatrix(i,i) = (*itVar).getModel()->getQ();
00554 }
00555 else
00556 {
00557
00558
00559 phiMatrix(i,i) = 0.0;
00560 qMatrix(i,i) = (*itVar).getInitialVariance();
00561 }
00562
00563 }
00564 else
00565 {
00566
00567
00568 phiMatrix(i,i) = whiteNoiseModel.getPhi();
00569 qMatrix(i,i) = whiteNoiseModel.getQ();
00570 }
00571
00572
00573 ++i;
00574 }
00575
00576
00577 return;
00578
00579 }
00580
00581
00582
00583
00584 void EquationSystem::getPrefit( gnssDataMap& gdsMap )
00585 {
00586
00587
00588 std::vector<double> tempPrefit;
00589
00590
00591 for( std::list<Equation>::const_iterator itEq =
00592 currentEquationsList.begin();
00593 itEq != currentEquationsList.end();
00594 ++itEq )
00595 {
00596
00597
00598 tempPrefit.push_back( gdsMap.getValue( (*itEq).header.equationSource,
00599 (*itEq).header.equationSat,
00600 (*itEq).header.indTerm.getType() ) );
00601
00602
00603 }
00604
00605
00606 measVector = tempPrefit;
00607
00608 return;
00609
00610 }
00611
00612
00613
00614
00615 void EquationSystem::getGeometryWeights( gnssDataMap& gdsMap )
00616 {
00617
00618
00619 hMatrix.resize( measVector.size(), varUnknowns.size(), 0.0);
00620 rMatrix.resize( measVector.size(), measVector.size(), 0.0);
00621
00622
00623 gnssDataMap gds2( gdsMap.frontEpoch() );
00624
00625
00626 int row(0);
00627 for( std::list<Equation>::const_iterator itRow =
00628 currentEquationsList.begin();
00629 itRow != currentEquationsList.end();
00630 ++itRow )
00631 {
00632
00633
00634 SourceID source( (*itRow).header.equationSource );
00635 SatID sat( (*itRow).header.equationSat );
00636
00637
00638
00639 TypeIDSet typeSet;
00640
00641
00642 bool found( false );
00643
00644
00645 for( gnssDataMap::const_iterator itGDS = gds2.begin();
00646 itGDS != gds2.end() && !found;
00647 ++itGDS )
00648 {
00649
00650 sourceDataMap::const_iterator itSDM = (*itGDS).second.find(source);
00651 if( itSDM != (*itGDS).second.end() )
00652 {
00653
00654 typeSet = (*itSDM).second.getTypeID();
00655 found = true;
00656 }
00657 }
00658
00659
00660
00661
00662
00663 if( typeSet.find(TypeID::weight) != typeSet.end() )
00664 {
00665
00666 rMatrix(row,row) = (*itRow).header.constWeight
00667 * gds2.getValue(source, sat, TypeID::weight);
00668 }
00669 else
00670 {
00671
00672 rMatrix(row,row) = (*itRow).header.constWeight;
00673 }
00674
00675
00676 int col(0);
00677 for( VariableSet::const_iterator itCol = varUnknowns.begin();
00678 itCol != varUnknowns.end();
00679 ++itCol )
00680 {
00681
00682
00683
00684 if( (*itRow).body.find( (*itCol) ) != (*itRow).body.end() &&
00685 currentUnknowns.find( (*itCol) ) != currentUnknowns.end() )
00686 {
00687
00688
00689
00690 if( (*itCol).isDefaultForced() )
00691 {
00692
00693 hMatrix(row,col) = (*itCol).getDefaultCoefficient();
00694 }
00695 else
00696 {
00697
00698
00699
00700 TypeID type( (*itCol).getType() );
00701
00702
00703 if( typeSet.find(type) != typeSet.end() )
00704 {
00705
00706 hMatrix(row,col) = gds2.getValue(source, sat, type);
00707 }
00708 else
00709 {
00710
00711
00712 hMatrix(row,col) = (*itCol).getDefaultCoefficient();
00713 }
00714
00715 }
00716
00717 }
00718
00719
00720 ++col;
00721
00722 }
00723
00724
00725 for( VariableSet::const_iterator itCol = (*itRow).body.begin();
00726 itCol != (*itRow).body.end();
00727 ++itCol )
00728 {
00729
00730 VariableSet::const_iterator itr = rejectUnknowns.find( (*itCol) );
00731 if( itr == rejectUnknowns.end() || (*itr).getTypeIndexed()) continue;
00732
00733 Variable var(*itr);
00734
00735 col = 0;
00736 for( VariableSet::const_iterator it = varUnknowns.begin(); it != varUnknowns.end(); it++)
00737 {
00738 if(((*itCol).getType() == (*it).getType()) &&
00739 ((*itCol).getModel() == (*it).getModel()) &&
00740 ((*itCol).getSourceIndexed() == (*it).getSourceIndexed())&&
00741 ((*itCol).getSatIndexed() == (*it).getSatIndexed()) &&
00742 ((*itCol).getSource() == (*it).getSource()) &&
00743 ((*itCol).getSatellite() == (*it).getSatellite())
00744 )
00745 {
00746 break;
00747 }
00748
00749 col++;
00750 }
00751
00752
00753
00754
00755 if( (*itCol).isDefaultForced() )
00756 {
00757
00758 hMatrix(row,col) = (*itCol).getDefaultCoefficient();
00759 }
00760 else
00761 {
00762
00763
00764
00765 TypeID type( (*itCol).getType() );
00766
00767
00768 if( typeSet.find(type) != typeSet.end() )
00769 {
00770
00771 hMatrix(row,col) = gds2.getValue(source, sat, type);
00772 }
00773 else
00774 {
00775
00776
00777 hMatrix(row,col) = (*itCol).getDefaultCoefficient();
00778 }
00779
00780 }
00781
00782 }
00783
00784
00785 ++row;
00786
00787 }
00788
00789
00790 return;
00791
00792 }
00793
00794
00795
00796
00797 void EquationSystem::imposeConstraints()
00798 {
00799 if(!equationConstraints.hasConstraints()) return;
00800
00801 ConstraintList destList;
00802
00803 ConstraintList tempList = equationConstraints.getConstraintList();
00804 for(ConstraintList::iterator it = tempList.begin();
00805 it != tempList.end();
00806 ++it )
00807 {
00808 VariableDataMap dataMapOk;
00809
00810 bool validConstraint(true);
00811
00812 try
00813 {
00814 VariableDataMap dataMap = it->body;
00815 for(VariableDataMap::iterator itv = dataMap.begin();
00816 itv != dataMap.end();
00817 ++itv )
00818 {
00819 bool isFound(false);
00820
00821 VariableSet::iterator itv2 = varUnknowns.find(itv->first);
00822 if(itv2!=varUnknowns.end())
00823 {
00824 isFound = true;
00825 dataMapOk[*itv2] = dataMap[itv->first];
00826 }
00827 else
00828 {
00829 for(itv2 = varUnknowns.begin();
00830 itv2 != varUnknowns.end();
00831 ++itv2 )
00832 {
00833 if( (itv->first.getType() == itv2->getType()) &&
00834 (itv->first.getSource() == itv2->getSource()) &&
00835 (itv->first.getSatellite() == itv2->getSatellite()) )
00836 {
00837 isFound = true;
00838 dataMapOk[*itv2] = dataMap[itv->first];
00839 break;
00840 }
00841 }
00842 }
00843
00844 if( !isFound ) validConstraint = false;
00845 }
00846 }
00847 catch(...)
00848 {
00849 validConstraint = false;
00850 }
00851
00852 if(validConstraint)
00853 {
00854 destList.push_back(Constraint(it->header,dataMapOk));
00855 }
00856 else
00857 {
00858
00859 return;
00860 }
00861
00862 }
00863
00864 equationConstraints.setConstraintList(destList);
00865
00866
00867
00868 try
00869 {
00870 Vector<double> meas;
00871 Matrix<double> design;
00872 Matrix<double> cov;
00873
00874 equationConstraints.constraintMatrix(varUnknowns,
00875 meas, design, cov);
00876
00877 const int oldSize = measVector.size();
00878 const int newSize = oldSize + meas.size();
00879 const int colSize = hMatrix.cols();
00880
00881 Vector<double> tempPrefit(newSize,0.0);
00882 Matrix<double> tempGeometry(newSize,colSize,0.0);
00883 Matrix<double> tempWeight(newSize,newSize,0.0);
00884
00885 for(int i=0; i< newSize; i++)
00886 {
00887
00888 if(i<oldSize) tempPrefit(i) = measVector(i);
00889 else tempPrefit(i) = meas(i-oldSize);
00890
00891
00892 for(int j=0;j<colSize;j++)
00893 {
00894 if(i<oldSize) tempGeometry(i,j) = hMatrix(i,j);
00895 else tempGeometry(i,j) = design(i-oldSize,j);
00896 }
00897
00898
00899 if(i<oldSize) tempWeight(i,i) = rMatrix(i,i);
00900 else tempWeight(i,i) = 1.0/cov(i-oldSize,i-oldSize);
00901
00902 }
00903
00904 measVector = tempPrefit;
00905 hMatrix = tempGeometry;
00906 rMatrix = tempWeight;
00907 }
00908 catch(...)
00909 {
00910 return;
00911 }
00912
00913 }
00914
00915
00916
00917
00918
00919
00920
00921 int EquationSystem::getTotalNumVariables() const
00922 throw(InvalidEquationSystem)
00923 {
00924
00925
00926 if (!isPrepared)
00927 {
00928 GPSTK_THROW(InvalidEquationSystem("EquationSystem is not prepared"));
00929 }
00930
00931 return varUnknowns.size();
00932
00933 }
00934
00935
00936
00937
00938
00939
00940
00941
00942 VariableSet EquationSystem::getVarUnknowns() const
00943 throw(InvalidEquationSystem)
00944 {
00945
00946
00947 if (!isPrepared)
00948 {
00949 GPSTK_THROW(InvalidEquationSystem("EquationSystem is not prepared"));
00950 }
00951
00952 return varUnknowns;
00953
00954 }
00955
00956
00957
00958
00959
00960
00961
00962
00963
00964 int EquationSystem::getCurrentNumVariables() const
00965 throw(InvalidEquationSystem)
00966 {
00967
00968
00969 if (!isPrepared)
00970 {
00971 GPSTK_THROW(InvalidEquationSystem("EquationSystem is not prepared"));
00972 }
00973
00974 return currentUnknowns.size();
00975
00976 }
00977
00978
00979
00980
00981
00982
00983
00984
00985 VariableSet EquationSystem::getCurrentUnknowns() const
00986 throw(InvalidEquationSystem)
00987 {
00988
00989
00990 if (!isPrepared)
00991 {
00992 GPSTK_THROW(InvalidEquationSystem("EquationSystem is not prepared"));
00993 }
00994
00995 return currentUnknowns;
00996
00997 }
00998
00999
01000
01001
01002
01003
01004
01005
01006
01007 int EquationSystem::getCurrentNumSources() const
01008 throw(InvalidEquationSystem)
01009 {
01010
01011
01012 if (!isPrepared)
01013 {
01014 GPSTK_THROW(InvalidEquationSystem("EquationSystem is not prepared"));
01015 }
01016
01017 return currentSourceSet.size();
01018
01019 }
01020
01021
01022
01023
01024
01025
01026
01027
01028 SourceIDSet EquationSystem::getCurrentSources() const
01029 throw(InvalidEquationSystem)
01030 {
01031
01032
01033 if (!isPrepared)
01034 {
01035 GPSTK_THROW(InvalidEquationSystem("EquationSystem is not prepared"));
01036 }
01037
01038 return currentSourceSet;
01039
01040 }
01041
01042
01043
01044
01045
01046
01047
01048
01049
01050 int EquationSystem::getCurrentNumSats() const
01051 throw(InvalidEquationSystem)
01052 {
01053
01054
01055 if (!isPrepared)
01056 {
01057 GPSTK_THROW(InvalidEquationSystem("EquationSystem is not prepared"));
01058 }
01059
01060 return currentSatSet.size();
01061
01062 }
01063
01064
01065
01066
01067
01068
01069
01070
01071 SatIDSet EquationSystem::getCurrentSats() const
01072 throw(InvalidEquationSystem)
01073 {
01074
01075
01076 if (!isPrepared)
01077 {
01078 GPSTK_THROW(InvalidEquationSystem("EquationSystem is not prepared"));
01079 }
01080
01081 return currentSatSet;
01082
01083 }
01084
01085
01086
01087
01088
01089
01090
01091
01092
01093 Vector<double> EquationSystem::getPrefitsVector() const
01094 throw(InvalidEquationSystem)
01095 {
01096
01097
01098 if (!isPrepared)
01099 {
01100 GPSTK_THROW(InvalidEquationSystem("EquationSystem is not prepared"));
01101 }
01102
01103 return measVector;
01104
01105 }
01106
01107
01108
01109
01110
01111
01112
01113
01114
01115 Matrix<double> EquationSystem::getGeometryMatrix() const
01116 throw(InvalidEquationSystem)
01117 {
01118
01119
01120 if (!isPrepared)
01121 {
01122 GPSTK_THROW(InvalidEquationSystem("EquationSystem is not prepared"));
01123 }
01124
01125 return hMatrix;
01126
01127 }
01128
01129
01130
01131
01132
01133
01134
01135
01136
01137 Matrix<double> EquationSystem::getWeightsMatrix() const
01138 throw(InvalidEquationSystem)
01139 {
01140
01141
01142 if (!isPrepared)
01143 {
01144 GPSTK_THROW(InvalidEquationSystem("EquationSystem is not prepared"));
01145 }
01146
01147 return rMatrix;
01148
01149 }
01150
01151
01152
01153
01154
01155
01156
01157
01158 Matrix<double> EquationSystem::getPhiMatrix() const
01159 throw(InvalidEquationSystem)
01160 {
01161
01162
01163 if (!isPrepared)
01164 {
01165 GPSTK_THROW(InvalidEquationSystem("EquationSystem is not prepared"));
01166 }
01167
01168 return phiMatrix;
01169
01170 }
01171
01172
01173
01174
01175
01176
01177
01178
01179
01180 Matrix<double> EquationSystem::getQMatrix() const
01181 throw(InvalidEquationSystem)
01182 {
01183
01184
01185 if (!isPrepared)
01186 {
01187 GPSTK_THROW(InvalidEquationSystem("EquationSystem is not prepared"));
01188 }
01189
01190 return qMatrix;
01191
01192 }
01193
01194
01195
01196 }