p1788 0.1.0 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,102 @@
1
+ /* Copyright (C) 2022 Théotime Bollengier <theotime.bollengier@ensta-bretagne.fr>
2
+ *
3
+ * This file is part of P1788. <https://gitlab.ensta-bretagne.fr/bollenth/p1788>
4
+ *
5
+ * P1788 is free software: you can redistribute it and/or modify it
6
+ * under the terms of the GNU General Public License as published
7
+ * by the Free Software Foundation, either version 3 of the License,
8
+ * or (at your option) any later version.
9
+ *
10
+ * P1788 is distributed in the hope that it will be useful,
11
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
13
+ * See the GNU General Public License for more details.
14
+ *
15
+ * You should have received a copy of the GNU General Public License
16
+ * along with P1788. If not, see <https://www.gnu.org/licenses/>. 
17
+ */
18
+
19
+ #ifndef P1788_HH
20
+ #define P1788_HH
21
+
22
+ #include <ruby.h>
23
+ #include <vector>
24
+ #include <string>
25
+ #include <p1788/p1788.hpp>
26
+
27
+ using Interval = p1788::infsup::interval<double, p1788::flavor::infsup::setbased::mpfr_bin_ieee754_flavor>;
28
+ using IntervalVector = std::vector<Interval>;
29
+
30
+ extern VALUE m_P1788;
31
+ extern VALUE c_Interval;
32
+ extern VALUE c_IntervalVector;
33
+ extern VALUE c_Figure;
34
+
35
+ extern const rb_data_type_t p1788_interval_type;
36
+ extern const rb_data_type_t p1788_vector_type;
37
+
38
+
39
+ extern ID id_to_s;
40
+ extern ID id_to_f;
41
+ extern ID id_to_i;
42
+ extern ID id_match;
43
+ extern ID id_brackets;
44
+ extern ID id_eqeq;
45
+ extern ID id_inspect;
46
+ extern ID id_join;
47
+ extern ID id_undefined;
48
+ extern ID id_both_empty;
49
+ extern ID id_first_empty;
50
+ extern ID id_second_empty;
51
+ extern ID id_before;
52
+ extern ID id_meets;
53
+ extern ID id_overlaps;
54
+ extern ID id_starts;
55
+ extern ID id_contained_by;
56
+ extern ID id_finishes;
57
+ extern ID id_equal;
58
+ extern ID id_finished_by;
59
+ extern ID id_contains;
60
+ extern ID id_started_by;
61
+ extern ID id_overlapped_by;
62
+ extern ID id_met_by;
63
+ extern ID id_after;
64
+
65
+
66
+ #define P1788_NEW_RB_INTERVAL(new_rb_obj, ...) \
67
+ do { \
68
+ Interval *isdp_ = new Interval(__VA_ARGS__); \
69
+ new_rb_obj = TypedData_Wrap_Struct(c_Interval, &p1788_interval_type, isdp_); \
70
+ } while (0)
71
+
72
+
73
+ inline Interval& p1788_interval_rb2ref(VALUE obj) {
74
+ Interval *i;
75
+ TypedData_Get_Struct(obj, Interval, &p1788_interval_type, i);
76
+ return *i;
77
+ }
78
+
79
+
80
+ inline IntervalVector& p1788_vector_rb2ref(VALUE obj) {
81
+ IntervalVector *v;
82
+ TypedData_Get_Struct(obj, IntervalVector, &p1788_vector_type, v);
83
+ return *v;
84
+ }
85
+
86
+
87
+ inline VALUE p1788_vector_alloc_from_pointer(IntervalVector *p) {
88
+ return TypedData_Wrap_Struct(c_IntervalVector, &p1788_vector_type, p);
89
+ }
90
+
91
+
92
+ inline bool is_an_interval_vector(VALUE obj) {
93
+ return (rb_class_of(obj) == c_IntervalVector);
94
+ }
95
+
96
+
97
+ Interval p1788_rbobj2interval(VALUE obj);
98
+
99
+ void Init_p1788_figure();
100
+
101
+
102
+ #endif /* P1788_HH */
data/lib/p1788/version.rb CHANGED
@@ -1,4 +1,4 @@
1
1
  module P1788
2
2
  # Version of the P1788 gem
3
- VERSION = '0.1.0'
3
+ VERSION = '1.0.0'
4
4
  end
data/lib/p1788.rb CHANGED
@@ -1,24 +1,19 @@
1
+ # Copyright (C) 2022 Théotime Bollengier <theotime.bollengier@ensta-bretagne.fr>
1
2
  #
2
- # P1788
3
+ # This file is part of P1788. <https://gitlab.ensta-bretagne.fr/bollenth/p1788>
3
4
  #
4
- # A Ruby extension wrapping the C++ libieeep1788 interval arithmetic library.
5
+ # P1788 is free software: you can redistribute it and/or modify it
6
+ # under the terms of the GNU General Public License as published
7
+ # by the Free Software Foundation, either version 3 of the License,
8
+ # or (at your option) any later version.
5
9
  #
6
- # Copyright 2022
10
+ # P1788 is distributed in the hope that it will be useful,
11
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
13
+ # See the GNU General Public License for more details.
7
14
  #
8
- # Théotime Bollengier (theotime.bollengier@ensta-bretagne.fr)
9
- # ENSTA Bretagne, France
10
- #
11
- # Licensed under the Apache License, Version 2.0 (the "License");
12
- # you may not use this file except in compliance with the License.
13
- # You may obtain a copy of the License at
14
- #
15
- # http://www.apache.org/licenses/LICENSE-2.0
16
- #
17
- # Unless required by applicable law or agreed to in writing, software
18
- # distributed under the License is distributed on an "AS IS" BASIS,
19
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
20
- # See the License for the specific language governing permissions and
21
- # limitations under the License.
15
+ # You should have received a copy of the GNU General Public License
16
+ # along with P1788. If not, see <https://www.gnu.org/licenses/>. 
22
17
 
23
18
  require_relative 'p1788/p1788'
24
19
  require_relative 'p1788/version.rb'
data/p1788.gemspec CHANGED
@@ -3,10 +3,10 @@ require File.expand_path('../lib/p1788/version.rb', __FILE__)
3
3
  Gem::Specification.new do |s|
4
4
  s.name = 'p1788'
5
5
  s.version = P1788::VERSION
6
- s.date = '2022-01-07'
6
+ s.date = '2022-01-27'
7
7
  s.summary = 'P1788 is an interval arithmetic library'
8
8
  s.description = 'P1788 is a Ruby C extension wrapping the libieeep1788 interval arithmetic library.'
9
- s.license = 'Apache-2.0'
9
+ s.license = 'GPL-3.0+'
10
10
  s.authors = ['Théotime Bollengier']
11
11
  s.email = 'theotime.bollengier@ensta-bretagne.fr'
12
12
  s.homepage = 'https://gitlab.ensta-bretagne.fr/bollenth/p1788'
@@ -14,7 +14,6 @@ Gem::Specification.new do |s|
14
14
  s.files = [
15
15
  'LICENSE',
16
16
  'NOTICE',
17
- 'AUTHORS',
18
17
  'README.md',
19
18
  'p1788.gemspec',
20
19
  '.yardopts',
@@ -22,6 +21,10 @@ Gem::Specification.new do |s|
22
21
  'lib/p1788/version.rb',
23
22
  'ext/p1788/extconf.rb',
24
23
  'ext/p1788/p1788.cc',
24
+ 'ext/p1788/p1788.hh',
25
+ 'ext/p1788/figure.cc',
26
+ 'ext/p1788/figure.hh',
27
+ 'ext/p1788/figure_wrapper.cc',
25
28
  'ext/libieeep1788_copy/README',
26
29
  'ext/libieeep1788_copy/p1788/LICENSE',
27
30
  'ext/libieeep1788_copy/p1788/NOTICE',
@@ -66,7 +69,9 @@ Gem::Specification.new do |s|
66
69
  'ext/libieeep1788_copy/p1788/util/mixed_type_traits.hpp',
67
70
  'ext/libieeep1788_copy/p1788/util/mpfr_util.hpp',
68
71
  'ext/libieeep1788_copy/p1788/util/mpfr_var.hpp',
69
- 'ext/libieeep1788_copy/p1788/util/mpfr_var_impl.hpp'
72
+ 'ext/libieeep1788_copy/p1788/util/mpfr_var_impl.hpp',
73
+ 'samples/figure.rb',
74
+ 'samples/sivia.rb'
70
75
  ]
71
76
  end
72
77
 
data/samples/figure.rb ADDED
@@ -0,0 +1,23 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'p1788'
4
+ include P1788
5
+
6
+ nbbox = 100
7
+ x = IntervalVector.new(nbbox){|i| 2*Interval[i.to_f/nbbox, (i+1.0)/nbbox]-1}
8
+ b = x.map{|ix| IntervalVector[ix, ix**2]}
9
+ c = x.map{|ix| IntervalVector[ix, sqrt(ix)]}
10
+
11
+ f = Figure.new
12
+ f.background_color = 'W'
13
+ f.width = 720
14
+ f.xlabel = "Horizontal axis label"
15
+ f.ylabel = "Vertical axis label"
16
+ f.title = "Lorem ipsum title"
17
+ f.draw_boxes(b, 'k[g]')
18
+ f.draw_boxes(c, 'k[R]')
19
+ pp f.nice_range
20
+ f.write 'fig.png'
21
+ f.write 'fig.svg'
22
+ f.write 'fig.pdf'
23
+
data/samples/sivia.rb ADDED
@@ -0,0 +1,122 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'p1788'
4
+ include P1788
5
+
6
+ def sivia(initial_box, epsilon, &test)
7
+ l = [initial_box]
8
+ x_in = []
9
+ x_on = []
10
+ x_out = []
11
+ until l.empty? do
12
+ b = l.pop
13
+ case test.call(b)
14
+ when true
15
+ x_in << b
16
+ when false
17
+ x_out << b
18
+ else
19
+ if b.max_width <= epsilon then
20
+ x_on << b
21
+ else
22
+ l += b.bisect
23
+ end
24
+ end
25
+ end
26
+ return [x_in, x_on, x_out]
27
+ end
28
+
29
+
30
+ ################################################################################
31
+
32
+ ib = IntervalVector[-1.5..1.5, -1.5 .. 1.5]
33
+
34
+ bin, bon, bout = sivia(ib, 0.025) do |b|
35
+ (b[0]**2 + b[1]**2).sqrt.inclusion_test(0.7..1)
36
+ end
37
+
38
+ f = Figure.new
39
+ f.width = 512
40
+ f.xrange = ib.first
41
+ f.yrange = ib.last
42
+ f.draw_boxes(bout, 'w')
43
+ f.draw_boxes(bin, 'k[g]')
44
+ f.draw_boxes(bon, 'k[y]')
45
+ f.write_png 'donut.png'
46
+
47
+ ################################################################################
48
+
49
+ ib = IntervalVector[[-2, 2], [-2, 2]]
50
+
51
+ bin, bon, bout = sivia(ib, 0.05) do |b|
52
+ ((b[0]-0.4)**5 + (b[1] - 0.3)**5).inclusion_test(1..2)
53
+ end
54
+
55
+ f = Figure.new
56
+ f.width = 512
57
+ f.xrange = ib.first
58
+ f.yrange = ib.last
59
+ f.draw_boxes(bout, 'w')
60
+ f.draw_boxes(bin, 'k[g]')
61
+ f.draw_boxes(bon, 'k[y]')
62
+ f.write_png 'pow5.png'
63
+
64
+ ################################################################################
65
+
66
+ ib = IntervalVector[-3..3, -3..3]
67
+ dstbox = IntervalVector[[-4, -2], [4, 9], [7, 11]]
68
+ y = IntervalVector.new(3)
69
+
70
+ bin, bon, bout = sivia(ib, 0.04) do |b|
71
+ [-1, 1, 2].each_with_index do |t, i|
72
+ y[i] = (t*b[0])**2 + t*b[1]**2 + sin(b[0] + t*b[1])
73
+ end
74
+ y.inclusion_test(dstbox)
75
+ end
76
+
77
+ f = Figure.new
78
+ f.width = 512
79
+ f.xrange = ib.first
80
+ f.yrange = ib.last
81
+ f.draw_boxes(bout, 'w')
82
+ f.draw_boxes(bin, 'k[g]')
83
+ f.draw_boxes(bon, 'k[y]')
84
+ f.write_png 'smiley.png'
85
+
86
+ ################################################################################
87
+
88
+ ib = IntervalVector[[-0.5, 3], [-3, 0.5]]
89
+ l = 0.2
90
+
91
+ bin, bon, bout = sivia(ib, 0.02) do |b|
92
+ (exp(b[0]*b[1]) - sin(b[0]-b[1])).inclusion_test(-l..l)
93
+ end
94
+
95
+ f = Figure.new
96
+ f.width = 512
97
+ f.set_range ib
98
+ f.draw_boxes(bout, 'w')
99
+ f.draw_boxes(bin, 'k[g]')
100
+ f.draw_boxes(bon, 'k[y]')
101
+ f.write_png 'expsin.png'
102
+
103
+ ################################################################################
104
+
105
+ ib = IntervalVector[[-6, 2], [-3, 3]]
106
+ dsti = Interval[0.325, Float::INFINITY]
107
+
108
+ bin, bon, bout = sivia(ib, 0.05) do |b|
109
+ (sin(b[0]**2 + b[1]**2) / (exp(b[0]) + b[1]**2)).inclusion_test(dsti)
110
+ end
111
+
112
+ f = Figure.new
113
+ f.width = 512
114
+ f.set_range ib
115
+ f.draw_boxes(bout, 'w')
116
+ f.draw_boxes(bin, 'k[g]')
117
+ f.draw_boxes(bon, 'k[y]')
118
+ f.write_png 'sinexp.png'
119
+ puts f.allocated_size
120
+ f.reset!
121
+ puts f.allocated_size
122
+
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: p1788
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Théotime Bollengier
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-01-07 00:00:00.000000000 Z
11
+ date: 2022-01-27 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: P1788 is a Ruby C extension wrapping the libieeep1788 interval arithmetic
14
14
  library.
@@ -19,7 +19,6 @@ extensions:
19
19
  extra_rdoc_files: []
20
20
  files:
21
21
  - ".yardopts"
22
- - AUTHORS
23
22
  - LICENSE
24
23
  - NOTICE
25
24
  - README.md
@@ -69,13 +68,19 @@ files:
69
68
  - ext/libieeep1788_copy/p1788/util/mpfr_var_impl.hpp
70
69
  - ext/libieeep1788_copy/p1788/version.hpp
71
70
  - ext/p1788/extconf.rb
71
+ - ext/p1788/figure.cc
72
+ - ext/p1788/figure.hh
73
+ - ext/p1788/figure_wrapper.cc
72
74
  - ext/p1788/p1788.cc
75
+ - ext/p1788/p1788.hh
73
76
  - lib/p1788.rb
74
77
  - lib/p1788/version.rb
75
78
  - p1788.gemspec
79
+ - samples/figure.rb
80
+ - samples/sivia.rb
76
81
  homepage: https://gitlab.ensta-bretagne.fr/bollenth/p1788
77
82
  licenses:
78
- - Apache-2.0
83
+ - GPL-3.0+
79
84
  metadata: {}
80
85
  post_install_message:
81
86
  rdoc_options: []
data/AUTHORS DELETED
@@ -1,6 +0,0 @@
1
- == AUTHOR ==
2
-
3
- Théotime Bollengier (theotime.bollengier@ensta-bretagne.fr)
4
- ENSTA Bretagne engineering school and research institute, France
5
- https://gitlab.ensta-bretagne.fr/bollenth
6
-