gps_pvt 0.9.1 → 0.9.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +1 -1
- data/ext/gps_pvt/Coordinate/Coordinate_wrap.cxx +31 -19
- data/ext/gps_pvt/GPS/GPS_wrap.cxx +640 -4176
- data/ext/gps_pvt/SylphideMath/SylphideMath_wrap.cxx +829 -2574
- data/ext/ninja-scan-light/tool/swig/Coordinate.i +12 -12
- data/ext/ninja-scan-light/tool/swig/GPS.i +93 -85
- data/ext/ninja-scan-light/tool/swig/SylphideMath.i +52 -32
- data/ext/ninja-scan-light/tool/swig/spec/GPS_spec.rb +1 -1
- data/ext/ninja-scan-light/tool/swig/spec/SylphideMath_spec.rb +8 -8
- data/lib/gps_pvt/receiver/rtcm3.rb +215 -37
- data/lib/gps_pvt/receiver.rb +1 -0
- data/lib/gps_pvt/rtcm3.rb +263 -32
- data/lib/gps_pvt/version.rb +1 -1
- metadata +2 -2
@@ -16,6 +16,7 @@
|
|
16
16
|
%include std_common.i
|
17
17
|
%include std_string.i
|
18
18
|
%include exception.i
|
19
|
+
%include std_except.i
|
19
20
|
|
20
21
|
//%import "SylphideMath.i"
|
21
22
|
|
@@ -29,7 +30,13 @@ type set_ ## name (const type &v) {
|
|
29
30
|
%enddef
|
30
31
|
|
31
32
|
#if !defined(SWIGIMPORTED)
|
32
|
-
%
|
33
|
+
%exceptionclass native_exception;
|
34
|
+
%typemap(throws,noblock=1) native_exception {
|
35
|
+
$1.regenerate();
|
36
|
+
SWIG_fail;
|
37
|
+
}
|
38
|
+
%ignore native_exception;
|
39
|
+
%inline {
|
33
40
|
struct native_exception : public std::exception {
|
34
41
|
#if defined(SWIGRUBY)
|
35
42
|
int state;
|
@@ -67,22 +74,15 @@ struct native_exception : public std::exception {
|
|
67
74
|
}
|
68
75
|
}
|
69
76
|
#endif
|
70
|
-
%
|
77
|
+
%typemap(in,numinputs=0) const void *check_block {
|
71
78
|
#ifdef SWIGRUBY
|
72
79
|
if(!rb_block_given_p()){
|
73
|
-
return rb_enumeratorize(self, ID2SYM(
|
80
|
+
return rb_enumeratorize(self, ID2SYM(rb_frame_callee()), argc, argv);
|
74
81
|
}
|
75
82
|
#endif
|
76
|
-
try {
|
77
|
-
$action
|
78
|
-
} catch (const native_exception &e) {
|
79
|
-
e.regenerate();
|
80
|
-
SWIG_fail;
|
81
|
-
} catch (const std::exception& e) {
|
82
|
-
SWIG_exception(SWIG_RuntimeError, e.what());
|
83
|
-
}
|
84
83
|
}
|
85
|
-
|
84
|
+
%catches(native_exception) each;
|
85
|
+
void each(const void *check_block) const {
|
86
86
|
for(int i(0); i < 3; ++i){
|
87
87
|
#ifdef SWIGRUBY
|
88
88
|
int state;
|
@@ -48,9 +48,16 @@ inline std::string to_string(const T &value){
|
|
48
48
|
%include std_common.i
|
49
49
|
%include std_string.i
|
50
50
|
%include exception.i
|
51
|
+
%include std_except.i
|
51
52
|
|
52
53
|
#if !defined(SWIGIMPORTED)
|
53
|
-
%
|
54
|
+
%exceptionclass native_exception;
|
55
|
+
%typemap(throws,noblock=1) native_exception {
|
56
|
+
$1.regenerate();
|
57
|
+
SWIG_fail;
|
58
|
+
}
|
59
|
+
%ignore native_exception;
|
60
|
+
%inline {
|
54
61
|
struct native_exception : public std::exception {
|
55
62
|
#if defined(SWIGRUBY)
|
56
63
|
int state;
|
@@ -61,16 +68,6 @@ struct native_exception : public std::exception {
|
|
61
68
|
#endif
|
62
69
|
};
|
63
70
|
}
|
64
|
-
%exception {
|
65
|
-
try {
|
66
|
-
$action
|
67
|
-
} catch (const native_exception &e) {
|
68
|
-
e.regenerate();
|
69
|
-
SWIG_fail;
|
70
|
-
} catch (const std::exception& e) {
|
71
|
-
SWIG_exception_fail(SWIG_RuntimeError, e.what());
|
72
|
-
}
|
73
|
-
}
|
74
71
|
#endif
|
75
72
|
|
76
73
|
#ifdef SWIGRUBY
|
@@ -117,47 +114,82 @@ static std::string inspect_str(const VALUE &v){
|
|
117
114
|
%import "SylphideMath.i"
|
118
115
|
%import "Coordinate.i"
|
119
116
|
|
120
|
-
%
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
%append_output(SWIG_From(int)($1.tm_mday));
|
125
|
-
%append_output(SWIG_From(int)($1.tm_hour));
|
126
|
-
%append_output(SWIG_From(int)($1.tm_min));
|
127
|
-
%append_output(SWIG_From(int)($1.tm_sec));
|
117
|
+
%typemap(in,numinputs=0) const void *check_block {
|
118
|
+
#ifdef SWIGRUBY
|
119
|
+
if(!rb_block_given_p()){
|
120
|
+
return rb_enumeratorize(self, ID2SYM(rb_frame_callee()), argc, argv);
|
128
121
|
}
|
129
|
-
#
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
122
|
+
#endif
|
123
|
+
}
|
124
|
+
|
125
|
+
%fragment(SWIG_From_frag(std::tm), "header", fragment=SWIG_From_frag(int)) {
|
126
|
+
SWIGINTERNINLINE SWIG_Object
|
127
|
+
SWIG_From_dec(std::tm)(const std::tm &value){
|
128
|
+
SWIG_Object res(SWIG_From(int)(value.tm_year + 1900));
|
129
|
+
res = SWIG_AppendOutput(res, SWIG_From(int)(value.tm_mon + 1));
|
130
|
+
res = SWIG_AppendOutput(res, SWIG_From(int)(value.tm_mday));
|
131
|
+
res = SWIG_AppendOutput(res, SWIG_From(int)(value.tm_hour));
|
132
|
+
res = SWIG_AppendOutput(res, SWIG_From(int)(value.tm_min));
|
133
|
+
return SWIG_AppendOutput(res, SWIG_From(int)(value.tm_sec));
|
134
|
+
}
|
135
|
+
}
|
136
|
+
%fragment(SWIG_AsVal_frag(std::tm), "header", fragment=SWIG_AsVal_frag(int)){
|
137
|
+
SWIGINTERN int
|
138
|
+
SWIG_AsVal_dec(std::tm)(SWIG_Object obj, std::tm *val) {
|
139
|
+
#ifdef SWIGRUBY
|
140
|
+
int *dst[] = {
|
141
|
+
&(val->tm_year),
|
142
|
+
&(val->tm_mon),
|
143
|
+
&(val->tm_mday),
|
144
|
+
&(val->tm_hour),
|
145
|
+
&(val->tm_min),
|
146
|
+
&(val->tm_sec),
|
147
|
+
};
|
148
|
+
if(RB_TYPE_P(obj, T_ARRAY)){
|
149
|
+
int i_max(RARRAY_LEN(obj));
|
150
|
+
if(i_max > sizeof(dst) / sizeof(dst[0])){return SWIG_ERROR;}
|
151
|
+
VALUE obj_i;
|
152
|
+
int v;
|
142
153
|
for(int i(0); i < i_max; ++i){
|
143
|
-
|
144
|
-
int v
|
145
|
-
|
146
|
-
if(dst[i] == &(temp.tm_year)){
|
154
|
+
obj_i = RARRAY_AREF(obj, i);
|
155
|
+
if(SWIG_IsOK(SWIG_AsVal(int)(obj_i, &v))){
|
156
|
+
if(dst[i] == &(val->tm_year)){
|
147
157
|
*dst[i] = v - 1900;
|
148
|
-
}else if(dst[i] == &(
|
158
|
+
}else if(dst[i] == &(val->tm_mon)){
|
149
159
|
*dst[i] = v - 1;
|
150
160
|
}else{
|
151
161
|
*dst[i] = v;
|
152
162
|
}
|
153
163
|
}else{
|
154
|
-
SWIG_exception(SWIG_TypeError,
|
164
|
+
SWIG_exception(SWIG_TypeError,
|
165
|
+
std::string("Unexpected input [").append(std::to_string(i)).append("]: ")
|
166
|
+
.append(inspect_str(obj_i)).c_str());
|
155
167
|
}
|
156
168
|
}
|
169
|
+
return SWIG_OK;
|
157
170
|
}
|
158
|
-
|
159
|
-
|
171
|
+
#endif
|
172
|
+
return SWIG_ERROR;
|
173
|
+
}
|
174
|
+
}
|
175
|
+
%typemap(out, fragment=SWIG_From_frag(std::tm)) std::tm {
|
176
|
+
$result = SWIG_From(std::tm)($1);
|
177
|
+
}
|
178
|
+
%typemap(in, fragment=SWIG_AsVal_frag(std::tm)) const std::tm & (std::tm temp = {0}) {
|
179
|
+
if(SWIG_AsVal(std::tm)($input, $1 = &temp) != SWIG_OK){
|
180
|
+
SWIG_exception(SWIG_TypeError, "int[1..6] is expected");
|
160
181
|
}
|
182
|
+
}
|
183
|
+
%typemap(typecheck, precedence=SWIG_TYPECHECK_POINTER) const std::tm & {
|
184
|
+
#ifdef SWIGRUBY
|
185
|
+
$1 = (TYPE($input) == T_ARRAY) ? 1 : 0;
|
186
|
+
#else
|
187
|
+
$1 = 0;
|
188
|
+
#endif
|
189
|
+
}
|
190
|
+
|
191
|
+
%extend GPS_Time {
|
192
|
+
#if defined(SWIGRUBY)
|
161
193
|
%typemap(varout,fragment="SWIG_Traits_frag(FloatT)") leap_second_event_t [] {
|
162
194
|
$result = rb_ary_new2(sizeof($1) / sizeof($1[0]));
|
163
195
|
for(std::size_t i(0); i < sizeof($1) / sizeof($1[0]); ++i){
|
@@ -275,11 +307,12 @@ struct GPS_Ionospheric_UTC_Parameters : public GPS_SpaceNode<FloatT>::Ionospheri
|
|
275
307
|
MAKE_ACCESSOR(WN_LSF, unsigned int);
|
276
308
|
MAKE_ACCESSOR(DN, unsigned int);
|
277
309
|
MAKE_ACCESSOR(delta_t_LSF, int);
|
310
|
+
%catches(std::invalid_argument) parse;
|
278
311
|
static GPS_Ionospheric_UTC_Parameters<FloatT> parse(const unsigned int buf[10]){
|
279
312
|
typedef typename GPS_SpaceNode<FloatT>
|
280
313
|
::BroadcastedMessage<unsigned int, 30> parser_t;
|
281
314
|
if((parser_t::subframe_id(buf) != 4) || (parser_t::sv_page_id(buf) != 56)){
|
282
|
-
throw std::
|
315
|
+
throw std::invalid_argument("Not valid data");
|
283
316
|
}
|
284
317
|
typename GPS_SpaceNode<FloatT>::Ionospheric_UTC_Parameters::raw_t raw;
|
285
318
|
raw.update<2, 0>(buf);
|
@@ -571,7 +604,7 @@ struct SBAS_Ephemeris : public SBAS_SpaceNode<FloatT>::SatelliteProperties::Ephe
|
|
571
604
|
|
572
605
|
MAKE_ACCESSOR(WN, unsigned int);
|
573
606
|
MAKE_ACCESSOR(t_0, FloatT);
|
574
|
-
MAKE_ACCESSOR(URA,
|
607
|
+
MAKE_ACCESSOR(URA, FloatT);
|
575
608
|
MAKE_ACCESSOR( x, FloatT); MAKE_ACCESSOR( y, FloatT); MAKE_ACCESSOR( z, FloatT);
|
576
609
|
MAKE_ACCESSOR( dx, FloatT); MAKE_ACCESSOR( dy, FloatT); MAKE_ACCESSOR( dz, FloatT);
|
577
610
|
MAKE_ACCESSOR(ddx, FloatT); MAKE_ACCESSOR(ddy, FloatT); MAKE_ACCESSOR(ddz, FloatT);
|
@@ -654,6 +687,10 @@ struct GLONASS_Ephemeris
|
|
654
687
|
bool is_consistent() const {
|
655
688
|
return has_string == 0x1F;
|
656
689
|
}
|
690
|
+
bool is_in_range(const GPS_Time<FloatT> &t) const {
|
691
|
+
// "invalidate()" is used to make raw and converted data inconsistent.
|
692
|
+
return eph_t::is_valid(t);
|
693
|
+
}
|
657
694
|
bool is_valid(const GPS_Time<FloatT> &t) const {
|
658
695
|
return is_consistent() && eph_t::is_valid(t);
|
659
696
|
}
|
@@ -800,10 +837,6 @@ struct GLONASS_Ephemeris
|
|
800
837
|
%rename("valid?") is_valid;
|
801
838
|
%rename("in_range?") is_in_range;
|
802
839
|
#endif
|
803
|
-
bool is_in_range(const GPS_Time<FloatT> &t) const {
|
804
|
-
// "invalidate()" is used to make raw and converted data inconsistent.
|
805
|
-
return self->is_valid(t);
|
806
|
-
}
|
807
840
|
}
|
808
841
|
|
809
842
|
%extend GLONASS_SpaceNode {
|
@@ -894,11 +927,12 @@ struct GPS_User_PVT
|
|
894
927
|
ERROR_VELOCITY_LS,
|
895
928
|
};
|
896
929
|
int error_code() const {return (int)(base_t::error_code);}
|
897
|
-
const
|
898
|
-
|
899
|
-
|
930
|
+
// Returning Type because returning const Type & causes reference problem after GC
|
931
|
+
GPS_Time<FloatT> receiver_time() const {return base_t::receiver_time;}
|
932
|
+
System_XYZ<FloatT, WGS84> xyz() const {return base_t::user_position.xyz;}
|
933
|
+
System_LLH<FloatT, WGS84> llh() const {return base_t::user_position.llh;}
|
900
934
|
const FloatT &receiver_error() const {return base_t::receiver_error;}
|
901
|
-
|
935
|
+
System_ENU<FloatT, WGS84> velocity() const {return base_t::user_velocity_enu;}
|
902
936
|
const FloatT &receiver_error_rate() const {return base_t::receiver_error_rate;}
|
903
937
|
const FloatT &gdop() const {return base_t::dop.g;}
|
904
938
|
const FloatT &pdop() const {return base_t::dop.p;}
|
@@ -975,23 +1009,9 @@ struct GPS_User_PVT
|
|
975
1009
|
%extend GPS_Measurement {
|
976
1010
|
%ignore items_t;
|
977
1011
|
%ignore items;
|
978
|
-
%exception each {
|
979
|
-
#ifdef SWIGRUBY
|
980
|
-
if(!rb_block_given_p()){
|
981
|
-
return rb_enumeratorize(self, ID2SYM(rb_intern("each")), argc, argv);
|
982
|
-
}
|
983
|
-
#endif
|
984
|
-
try {
|
985
|
-
$action
|
986
|
-
} catch (const native_exception &e) {
|
987
|
-
e.regenerate();
|
988
|
-
SWIG_fail;
|
989
|
-
} catch (const std::exception& e) {
|
990
|
-
SWIG_exception_fail(SWIG_RuntimeError, e.what());
|
991
|
-
}
|
992
|
-
}
|
993
1012
|
%fragment(SWIG_Traits_frag(FloatT));
|
994
|
-
|
1013
|
+
%catches(native_exception) each;
|
1014
|
+
void each(const void *check_block) const {
|
995
1015
|
for(typename GPS_Measurement<FloatT>::items_t::const_iterator
|
996
1016
|
it(self->items.begin()), it_end(self->items.end());
|
997
1017
|
it != it_end; ++it){
|
@@ -1322,6 +1342,7 @@ struct HookableSolver : public BaseT {
|
|
1322
1342
|
%ignore user_correctors;
|
1323
1343
|
%immutable hooks;
|
1324
1344
|
%ignore mark;
|
1345
|
+
%catches(native_exception, std::runtime_error) solve;
|
1325
1346
|
%fragment("hook"{GPS_Solver<FloatT>}, "header",
|
1326
1347
|
fragment=SWIG_From_frag(int),
|
1327
1348
|
fragment=SWIG_Traits_frag(FloatT),
|
@@ -1385,7 +1406,7 @@ struct HookableSolver : public BaseT {
|
|
1385
1406
|
if((!RB_TYPE_P(res_hook, T_ARRAY))
|
1386
1407
|
|| (RARRAY_LEN(res_hook) != prop_items)){
|
1387
1408
|
throw std::runtime_error(
|
1388
|
-
std::string("[d * ").append(std::to_string(prop_items))
|
1409
|
+
std::string("relative_property() returning [d * ").append(std::to_string(prop_items))
|
1389
1410
|
.append("] is expected (d: " %str(FloatT) "), however ")
|
1390
1411
|
.append(inspect_str(res_hook)));
|
1391
1412
|
}
|
@@ -1393,7 +1414,7 @@ struct HookableSolver : public BaseT {
|
|
1393
1414
|
VALUE v(RARRAY_AREF(res_hook, i));
|
1394
1415
|
if(!SWIG_IsOK(swig::asval(v, &res.values[i]))){
|
1395
1416
|
throw std::runtime_error(
|
1396
|
-
std::string(%str(FloatT) " is exepcted, however ")
|
1417
|
+
std::string("relative_property() returning " %str(FloatT) " is exepcted, however ")
|
1397
1418
|
.append(inspect_str(v))
|
1398
1419
|
.append(" @ [").append(std::to_string(i)).append("]"));
|
1399
1420
|
}
|
@@ -1516,7 +1537,7 @@ struct HookableSolver : public BaseT {
|
|
1516
1537
|
list_t input;
|
1517
1538
|
if(update){
|
1518
1539
|
if(!RB_TYPE_P(hash, T_HASH)){
|
1519
|
-
throw std::
|
1540
|
+
throw std::invalid_argument(
|
1520
1541
|
std::string("Hash is expected, however ").append(inspect_str(hash)));
|
1521
1542
|
}
|
1522
1543
|
for(std::size_t i(0); i < sizeof(k_root) / sizeof(k_root[0]); ++i){
|
@@ -1594,6 +1615,7 @@ struct HookableSolver : public BaseT {
|
|
1594
1615
|
VALUE get_correction() const {
|
1595
1616
|
return const_cast<GPS_Solver<FloatT> *>(self)->update_correction(false, Qnil);
|
1596
1617
|
}
|
1618
|
+
%catches(std::invalid_argument) set_correction;
|
1597
1619
|
VALUE set_correction(VALUE hash){
|
1598
1620
|
return self->update_correction(true, hash);
|
1599
1621
|
}
|
@@ -1824,23 +1846,9 @@ struct GPS_Solver
|
|
1824
1846
|
%fragment(SWIG_From_frag(char));
|
1825
1847
|
|
1826
1848
|
%extend RINEX_Observation {
|
1827
|
-
%exception read {
|
1828
|
-
#ifdef SWIGRUBY
|
1829
|
-
if(!rb_block_given_p()){
|
1830
|
-
return rb_enumeratorize(self, ID2SYM(rb_intern("read")), argc, argv);
|
1831
|
-
}
|
1832
|
-
#endif
|
1833
|
-
try {
|
1834
|
-
$action
|
1835
|
-
} catch (const native_exception &e) {
|
1836
|
-
e.regenerate();
|
1837
|
-
SWIG_fail;
|
1838
|
-
} catch (const std::exception& e) {
|
1839
|
-
SWIG_exception_fail(SWIG_RuntimeError, e.what());
|
1840
|
-
}
|
1841
|
-
}
|
1842
1849
|
%fragment(SWIG_Traits_frag(FloatT));
|
1843
|
-
|
1850
|
+
%catches(native_exception) read;
|
1851
|
+
static void read(const char *fname, const void *check_block) {
|
1844
1852
|
std::fstream fin(fname, std::ios::in | std::ios::binary);
|
1845
1853
|
struct reader_t : public RINEX_OBS_Reader<FloatT> {
|
1846
1854
|
typedef RINEX_OBS_Reader<FloatT> super_t;
|
@@ -31,9 +31,17 @@
|
|
31
31
|
%include std_string.i
|
32
32
|
//%include std_vector.i
|
33
33
|
%include exception.i
|
34
|
+
%include std_except.i
|
34
35
|
|
36
|
+
%ignore native_exception;
|
35
37
|
#if !defined(SWIGIMPORTED)
|
36
|
-
%
|
38
|
+
%exceptionclass native_exception;
|
39
|
+
%typemap(throws,noblock=1) native_exception {
|
40
|
+
$1.regenerate();
|
41
|
+
SWIG_fail;
|
42
|
+
}
|
43
|
+
%ignore native_exception;
|
44
|
+
%inline {
|
37
45
|
struct native_exception : public std::exception {
|
38
46
|
#if defined(SWIGRUBY)
|
39
47
|
int state;
|
@@ -44,16 +52,6 @@ struct native_exception : public std::exception {
|
|
44
52
|
#endif
|
45
53
|
};
|
46
54
|
}
|
47
|
-
%exception {
|
48
|
-
try {
|
49
|
-
$action
|
50
|
-
} catch (const native_exception &e) {
|
51
|
-
e.regenerate();
|
52
|
-
SWIG_fail;
|
53
|
-
} catch (const std::exception& e) {
|
54
|
-
SWIG_exception_fail(SWIG_RuntimeError, e.what());
|
55
|
-
}
|
56
|
-
}
|
57
55
|
#endif
|
58
56
|
|
59
57
|
%define MAKE_ACCESSOR(name, type)
|
@@ -548,7 +546,7 @@ struct MatrixUtil {
|
|
548
546
|
#if defined(SWIGRUBY)
|
549
547
|
static const each_which_t &sym2each_which(const VALUE &value){
|
550
548
|
if(!RB_TYPE_P(value, T_SYMBOL)){
|
551
|
-
std::
|
549
|
+
std::invalid_argument("Symbol is required");
|
552
550
|
}
|
553
551
|
static const struct {
|
554
552
|
VALUE sym;
|
@@ -567,7 +565,7 @@ struct MatrixUtil {
|
|
567
565
|
if(++i >= (sizeof(cmp) / sizeof(cmp[0]))){break;}
|
568
566
|
}
|
569
567
|
if(i >= (sizeof(cmp) / sizeof(cmp[0]))){
|
570
|
-
std::
|
568
|
+
std::invalid_argument("Unknown enumerate direction");
|
571
569
|
}
|
572
570
|
return cmp[i].which;
|
573
571
|
}
|
@@ -602,16 +600,16 @@ struct MatrixUtil {
|
|
602
600
|
if(value && RB_TYPE_P(*value, T_ARRAY)){
|
603
601
|
if(RB_TYPE_P(RARRAY_AREF(*value, 0), T_ARRAY)){ // [[r0c0, r0c1, ...], ...]
|
604
602
|
if((unsigned int)RARRAY_LEN(*value) < r){
|
605
|
-
throw std::
|
603
|
+
throw std::invalid_argument("Length is too short");
|
606
604
|
}
|
607
605
|
VALUE value_r;
|
608
606
|
for(; i_elm < len; i_elm++){
|
609
607
|
if(j == 0){
|
610
608
|
value_r = RARRAY_AREF(*value, i);
|
611
609
|
if(!RB_TYPE_P(value_r, T_ARRAY)){
|
612
|
-
throw std::
|
610
|
+
throw std::invalid_argument("double array [[...], ...] is required");
|
613
611
|
}else if((unsigned int)RARRAY_LEN(value_r) < c){
|
614
|
-
throw std::
|
612
|
+
throw std::invalid_argument("Length is too short");
|
615
613
|
}
|
616
614
|
}
|
617
615
|
v_elm = RARRAY_AREF(value_r, j);
|
@@ -620,7 +618,7 @@ struct MatrixUtil {
|
|
620
618
|
}
|
621
619
|
}else{ // [r0c0, r0c1, ...]
|
622
620
|
if((unsigned int)RARRAY_LEN(*value) < len){
|
623
|
-
throw std::
|
621
|
+
throw std::invalid_argument("Length is too short");
|
624
622
|
}
|
625
623
|
for(; i_elm < len; i_elm++){
|
626
624
|
v_elm = RARRAY_AREF(*value, i_elm);
|
@@ -647,7 +645,7 @@ struct MatrixUtil {
|
|
647
645
|
if(replaced && (i_elm < len)){
|
648
646
|
std::stringstream s;
|
649
647
|
s << "Unexpected input [" << i << "," << j << "]: ";
|
650
|
-
throw std::
|
648
|
+
throw std::invalid_argument(s.str().append(inspect_str(v_elm)));
|
651
649
|
}
|
652
650
|
#endif
|
653
651
|
return replaced;
|
@@ -668,6 +666,12 @@ struct MatrixUtil {
|
|
668
666
|
%}
|
669
667
|
|
670
668
|
%extend Matrix_Frozen {
|
669
|
+
%catches(std::logic_error) trace;
|
670
|
+
%catches(std::out_of_range) partial;
|
671
|
+
%catches(std::out_of_range) rowVector;
|
672
|
+
%catches(std::out_of_range) columnVector;
|
673
|
+
%catches(std::logic_error, std::runtime_error) determinant;
|
674
|
+
|
671
675
|
T __getitem__(const unsigned int &row, const unsigned int &column) const {
|
672
676
|
return ($self)->operator()(row, column);
|
673
677
|
}
|
@@ -705,6 +709,7 @@ struct MatrixUtil {
|
|
705
709
|
return (Matrix<T, Array2D_Dense<T> >)(($self)->operator-());
|
706
710
|
}
|
707
711
|
|
712
|
+
%catches(std::invalid_argument) operator+;
|
708
713
|
template <class T2, class Array2D_Type2, class ViewType2>
|
709
714
|
Matrix<T, Array2D_Dense<T> > operator+(
|
710
715
|
const Matrix_Frozen<T2, Array2D_Type2, ViewType2> &matrix) const {
|
@@ -715,6 +720,7 @@ struct MatrixUtil {
|
|
715
720
|
return (Matrix<T, Array2D_Dense<T> >)(($self)->operator+(scalar));
|
716
721
|
}
|
717
722
|
|
723
|
+
%catches(std::invalid_argument) operator-;
|
718
724
|
template <class T2, class Array2D_Type2, class ViewType2>
|
719
725
|
Matrix<T, Array2D_Dense<T> > operator-(
|
720
726
|
const Matrix_Frozen<T2, Array2D_Type2, ViewType2> &matrix) const {
|
@@ -727,7 +733,8 @@ struct MatrixUtil {
|
|
727
733
|
|
728
734
|
template <class T2, class Array2D_Type2, class ViewType2>
|
729
735
|
Matrix<T, Array2D_Dense<T> > operator*(
|
730
|
-
const Matrix_Frozen<T2, Array2D_Type2, ViewType2> &matrix)
|
736
|
+
const Matrix_Frozen<T2, Array2D_Type2, ViewType2> &matrix)
|
737
|
+
const throw(std::invalid_argument) {
|
731
738
|
return (Matrix<T, Array2D_Dense<T> >)(($self)->operator*(matrix));
|
732
739
|
}
|
733
740
|
INSTANTIATE_MATRIX_FUNC(operator*, __mul__);
|
@@ -750,6 +757,7 @@ struct MatrixUtil {
|
|
750
757
|
Matrix<T, Array2D_Dense<T> > &output_R {
|
751
758
|
%append_output(SWIG_NewPointerObj((new $*1_ltype(*$1)), $1_descriptor, SWIG_POINTER_OWN));
|
752
759
|
}
|
760
|
+
%catches(std::logic_error, std::runtime_error) lup;
|
753
761
|
void lup(
|
754
762
|
Matrix<T, Array2D_Dense<T> > &output_L,
|
755
763
|
Matrix<T, Array2D_Dense<T> > &output_U,
|
@@ -775,6 +783,7 @@ struct MatrixUtil {
|
|
775
783
|
output_U = LU.partial($self->rows(), $self->columns(), 0, $self->rows()).copy();
|
776
784
|
output_P = buf.P();
|
777
785
|
}
|
786
|
+
%catches(std::logic_error) ud;
|
778
787
|
void ud(
|
779
788
|
Matrix<T, Array2D_Dense<T> > &output_U,
|
780
789
|
Matrix<T, Array2D_Dense<T> > &output_D) const {
|
@@ -790,12 +799,14 @@ struct MatrixUtil {
|
|
790
799
|
output_R = QR.partial($self->rows(), $self->columns(), 0, $self->rows()).copy();
|
791
800
|
}
|
792
801
|
|
802
|
+
%catches(std::logic_error, std::runtime_error) inverse;
|
793
803
|
Matrix<T, Array2D_Dense<T> > inverse() const {
|
794
804
|
return (Matrix<T, Array2D_Dense<T> >)(($self)->inverse());
|
795
805
|
}
|
796
806
|
template <class T2, class Array2D_Type2, class ViewType2>
|
797
807
|
Matrix<T, Array2D_Dense<T> > operator/(
|
798
|
-
const Matrix_Frozen<T2, Array2D_Type2, ViewType2> &matrix)
|
808
|
+
const Matrix_Frozen<T2, Array2D_Type2, ViewType2> &matrix)
|
809
|
+
const throw(std::logic_error, std::runtime_error) {
|
799
810
|
return (Matrix<T, Array2D_Dense<T> >)(($self)->operator/(matrix));
|
800
811
|
}
|
801
812
|
INSTANTIATE_MATRIX_FUNC(operator/, __div__);
|
@@ -835,7 +846,7 @@ struct MatrixUtil {
|
|
835
846
|
if(assign && !SWIG_IsOK(swig::asval(v, dst))){
|
836
847
|
std::stringstream s;
|
837
848
|
s << "Unknown input (T expected) [" << i << "," << j << "]: ";
|
838
|
-
throw std::
|
849
|
+
throw std::invalid_argument(s.str().append(inspect_str(v)));
|
839
850
|
}
|
840
851
|
}
|
841
852
|
static void matrix_yield(
|
@@ -890,10 +901,11 @@ struct MatrixUtil {
|
|
890
901
|
%typemap(in) const typename MatrixUtil::each_which_t &each_which {
|
891
902
|
try{
|
892
903
|
$1 = &const_cast<typename MatrixUtil::each_which_t &>(MatrixUtil::sym2each_which($input));
|
893
|
-
}catch(std::
|
894
|
-
SWIG_exception(
|
904
|
+
}catch(std::invalid_argument &e){
|
905
|
+
SWIG_exception(SWIG_ValueError, e.what());
|
895
906
|
}
|
896
907
|
}
|
908
|
+
%catches(native_exception) each;
|
897
909
|
const Matrix_Frozen<T, Array2D_Type, ViewType> &each(
|
898
910
|
void (*each_func)(
|
899
911
|
const T &src, T *dst,
|
@@ -904,6 +916,7 @@ struct MatrixUtil {
|
|
904
916
|
}
|
905
917
|
%alias each "each_with_index";
|
906
918
|
|
919
|
+
%catches(native_exception, std::invalid_argument) map;
|
907
920
|
Matrix<T, Array2D_Dense<T> > map(
|
908
921
|
void (*each_func)(
|
909
922
|
const T &src, T *dst,
|
@@ -950,7 +963,8 @@ MAKE_TO_S(Matrix_Frozen)
|
|
950
963
|
%fragment(SWIG_Traits_frag(T));
|
951
964
|
|
952
965
|
Matrix(const unsigned int &rows, const unsigned int &columns,
|
953
|
-
const void *replacer = NULL)
|
966
|
+
const void *replacer = NULL)
|
967
|
+
throw(native_exception, std::invalid_argument) {
|
954
968
|
Matrix<T, Array2D_Type, ViewType> res(rows, columns);
|
955
969
|
MatrixUtil::replace(res, replacer);
|
956
970
|
return new Matrix<T, Array2D_Type, ViewType>(res);
|
@@ -964,7 +978,7 @@ MAKE_TO_S(Matrix_Frozen)
|
|
964
978
|
#if defined(SWIGRUBY)
|
965
979
|
%fragment(SWIG_AsVal_frag(unsigned int));
|
966
980
|
%fragment("check_value"{unsigned int});
|
967
|
-
Matrix(const void *replacer){
|
981
|
+
Matrix(const void *replacer) throw(native_exception, std::invalid_argument) {
|
968
982
|
const SWIG_Object *value(static_cast<const SWIG_Object *>(replacer));
|
969
983
|
static const ID id_r(rb_intern("row_size")), id_c(rb_intern("column_size"));
|
970
984
|
if(value && RB_TYPE_P(*value, T_ARRAY) && RB_TYPE_P(RARRAY_AREF(*value, 0), T_ARRAY)){
|
@@ -978,8 +992,8 @@ MAKE_TO_S(Matrix_Frozen)
|
|
978
992
|
VALUE v_r(rb_funcall(*value, id_r, 0, 0)), v_c(rb_funcall(*value, id_c, 0, 0));
|
979
993
|
if(!SWIG_IsOK(SWIG_AsVal(unsigned int)(v_r, &r)) || is_lt_zero_after_asval(r)
|
980
994
|
|| !SWIG_IsOK(SWIG_AsVal(unsigned int)(v_c, &c)) || is_lt_zero_after_asval(c)){
|
981
|
-
throw std::
|
982
|
-
std::string("
|
995
|
+
throw std::invalid_argument(
|
996
|
+
std::string("Invalid length [")
|
983
997
|
.append(inspect_str(v_r)).append(", ")
|
984
998
|
.append(inspect_str(v_c)).append("]"));
|
985
999
|
}
|
@@ -987,7 +1001,7 @@ MAKE_TO_S(Matrix_Frozen)
|
|
987
1001
|
MatrixUtil::replace(res, replacer);
|
988
1002
|
return new Matrix<T, Array2D_Type, ViewType>(res);
|
989
1003
|
}else{
|
990
|
-
throw std::
|
1004
|
+
throw std::invalid_argument("double array [[...], ...] or Matrix is required");
|
991
1005
|
}
|
992
1006
|
}
|
993
1007
|
#endif
|
@@ -1026,11 +1040,13 @@ MAKE_TO_S(Matrix_Frozen)
|
|
1026
1040
|
%rename("scalar") getScalar;
|
1027
1041
|
%rename("I") getI;
|
1028
1042
|
|
1043
|
+
%catches(std::out_of_range) swap_rows;
|
1029
1044
|
void swap_rows(
|
1030
1045
|
self_t *self_p,
|
1031
1046
|
const unsigned int &r1, const unsigned int &r2){
|
1032
1047
|
$self->swapRows(r1, r2);
|
1033
1048
|
}
|
1049
|
+
%catches(std::out_of_range) swap_columns;
|
1034
1050
|
void swap_columns(
|
1035
1051
|
self_t *self_p,
|
1036
1052
|
const unsigned int &c1, const unsigned int &c2){
|
@@ -1040,18 +1056,20 @@ MAKE_TO_S(Matrix_Frozen)
|
|
1040
1056
|
template <class T2, class Array2D_Type2, class ViewType2>
|
1041
1057
|
void replace(
|
1042
1058
|
self_t *self_p,
|
1043
|
-
const Matrix_Frozen<T2, Array2D_Type2, ViewType2> &matrix)
|
1059
|
+
const Matrix_Frozen<T2, Array2D_Type2, ViewType2> &matrix)
|
1060
|
+
throw(std::invalid_argument) {
|
1044
1061
|
$self->replace(matrix);
|
1045
1062
|
}
|
1046
1063
|
INSTANTIATE_MATRIX_FUNC(replace, replace);
|
1047
1064
|
|
1048
|
-
void replace(self_t *self_p, const void *replacer = NULL)
|
1065
|
+
void replace(self_t *self_p, const void *replacer = NULL)
|
1066
|
+
throw(native_exception, std::invalid_argument, std::runtime_error){
|
1049
1067
|
if(!MatrixUtil::replace(*$self, replacer)){
|
1050
1068
|
throw std::runtime_error("Unsupported replacement");
|
1051
1069
|
}
|
1052
1070
|
}
|
1053
1071
|
|
1054
|
-
void replace(self_t *self_p, const T *serialized){
|
1072
|
+
void replace(self_t *self_p, const T *serialized) throw(std::runtime_error) {
|
1055
1073
|
if(!MatrixUtil::replace(*$self, serialized)){
|
1056
1074
|
throw std::runtime_error("Unsupported replacement");
|
1057
1075
|
}
|
@@ -1062,6 +1080,7 @@ MAKE_TO_S(Matrix_Frozen)
|
|
1062
1080
|
%bang swap_columns;
|
1063
1081
|
%rename("replace!") replace;
|
1064
1082
|
|
1083
|
+
%catches(native_exception, std::invalid_argument) map_bang;
|
1065
1084
|
void map_bang(
|
1066
1085
|
self_t *self_p,
|
1067
1086
|
void (*each_func)(
|
@@ -1129,6 +1148,7 @@ MAKE_TO_S(Matrix_Frozen)
|
|
1129
1148
|
Matrix<ctype, Array2D_Dense<ctype > > &output_V {
|
1130
1149
|
%append_output(SWIG_NewPointerObj((new $*1_ltype(*$1)), $1_descriptor, SWIG_POINTER_OWN));
|
1131
1150
|
}
|
1151
|
+
%catches(std::logic_error, std::runtime_error) eigen;
|
1132
1152
|
void eigen(
|
1133
1153
|
Matrix<ctype, Array2D_Dense<ctype > > &output_V,
|
1134
1154
|
Matrix<ctype, Array2D_Dense<ctype > > &output_D) const {
|
@@ -1258,7 +1278,7 @@ INSTANTIATE_MATRIX_PARTIAL(type, Array2D_Dense<type >, MatView_pt, MatView_pt);
|
|
1258
1278
|
}
|
1259
1279
|
Matrix<type, Array2D_Dense<type > > &resize(
|
1260
1280
|
const unsigned int *r_p, const unsigned int *c_p){
|
1261
|
-
unsigned int r(r_p ? *r_p : $self->rows()), c(c_p ? *c_p : self->columns());
|
1281
|
+
unsigned int r(r_p ? *r_p : $self->rows()), c(c_p ? *c_p : $self->columns());
|
1262
1282
|
Matrix<type, Array2D_Dense<type > > mat_new(r, c);
|
1263
1283
|
unsigned int r_min(r), c_min(c);
|
1264
1284
|
if(r_min > $self->rows()){r_min = $self->rows();}
|
@@ -918,7 +918,7 @@ __RINEX_CLK_TEXT__
|
|
918
918
|
expect(solver.options[:skip_exclusion]).to eq(true)
|
919
919
|
expect(solver.correction[:gps_ionospheric]).to include(:klobuchar)
|
920
920
|
expect(solver.correction[:gps_tropospheric]).to include(:hopfield)
|
921
|
-
expect{solver.correction = nil}.to raise_error(
|
921
|
+
expect{solver.correction = nil}.to raise_error(ArgumentError)
|
922
922
|
expect{solver.correction = {
|
923
923
|
:gps_ionospheric => [proc{|t, usr_pos, sat_pos|
|
924
924
|
expect(t).to be_a_kind_of(GPS::Time)
|