symath 0.1.0 → 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +24 -2
- data/lib/symath/operation/match.rb +37 -0
- data/lib/symath/operation.rb +3 -3
- data/lib/symath/version.rb +1 -1
- data/symath.gemspec +1 -0
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9d903078ab94cf97187901574a014b88181b5e73abfa842a01903b62d7c9f22a
|
4
|
+
data.tar.gz: c2d0836540602c731aca5f7e1d105ff8bd368a0fac17e6cc0b4a5cd4803456f6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 18c3b80cb561ecaf389816d59f6f897373608dcc4226c6457339e36dca18bc32ea1448a0ec27d4788a221f1cfcdbcbd863b8f44c9396b2b5daa3b0a2ef3f6821
|
7
|
+
data.tar.gz: 3103890a22c71dcc232763990e1619d333323d789c03c7d95215144fd4a0733fb541594d0f8e51884c258a4cb2fe45ef798498651a79cd789e7218a85a387071
|
data/README.md
CHANGED
@@ -304,8 +304,15 @@ The partial derivative is available as well as 'syntactic sugar':
|
|
304
304
|
|
305
305
|
### Integration
|
306
306
|
|
307
|
-
Integration is available as the int-operator.
|
308
|
-
|
307
|
+
Integration is available as the int-operator. The algorithm is only a
|
308
|
+
very simple one, imitating the most basic techniques of finding the
|
309
|
+
anti-derivative, combined with a few well known equation patterns. The
|
310
|
+
operation also has a limitation when it comes to non-commutable
|
311
|
+
terms (matrices, quaternions, etc.). In that case, the result is not
|
312
|
+
reliable.
|
313
|
+
|
314
|
+
With one argument, the operator evaluates to the antiderivative of the
|
315
|
+
expression:
|
309
316
|
|
310
317
|
<pre>
|
311
318
|
> int(2**:x).evaluate
|
@@ -527,6 +534,21 @@ that it matches the original expression:
|
|
527
534
|
{a=>y**2 + 3, b=>x**2}]
|
528
535
|
</pre>
|
529
536
|
|
537
|
+
#### Match/replace operation
|
538
|
+
|
539
|
+
The match_replace method tries to find an occurence of a pattern in
|
540
|
+
the expression, and replaces it if it is found. The method can be used
|
541
|
+
together with the iterate method. The latter repeats a method until
|
542
|
+
there are no more changes:
|
543
|
+
|
544
|
+
<pre>
|
545
|
+
> a = sin(sin(sin(:a + :b) - sin(:f)))
|
546
|
+
> a.match_replace(sin(:x), :e*:x, [:x])
|
547
|
+
=> e*sin(sin(a + b) - sin(f))
|
548
|
+
> a.iterate('match_replace', sin(:x), :e*:x, [:x])
|
549
|
+
=> e*e*(e*(a + b) - e*f)
|
550
|
+
</pre>
|
551
|
+
|
530
552
|
#### Factorization and product expansion
|
531
553
|
|
532
554
|
The factorization method has been ripped from the python
|
@@ -102,6 +102,9 @@ module SyMath::Operation::Match
|
|
102
102
|
# match is found, nil is returned. An optional boundvars hash contains a
|
103
103
|
# map of variables to expressions which are required to match exactly.
|
104
104
|
def match(exp, freevars, boundvars = {})
|
105
|
+
# Mathify free variables
|
106
|
+
freevars = freevars.map { |v| v.to_m }
|
107
|
+
|
105
108
|
# Traverse self and exp in parallel. Match subexpressions recursively,
|
106
109
|
# and match end nodes one by one. The two value nodes are compared for
|
107
110
|
# equality and each argument are matched recursively.
|
@@ -163,4 +166,38 @@ module SyMath::Operation::Match
|
|
163
166
|
raise 'Don\'t know how to compare value type ' + exp.class.to_s
|
164
167
|
# :nocov:
|
165
168
|
end
|
169
|
+
|
170
|
+
def match_replace(exp, replace, freevars)
|
171
|
+
# Recursively try to match exp to subexpressions of self. If a match
|
172
|
+
# is found, replace it and return.
|
173
|
+
|
174
|
+
# First try to match the top expression
|
175
|
+
matches = match(exp, freevars)
|
176
|
+
if !matches.nil? and matches.length >= 1
|
177
|
+
# If there are more than one match, pick the first
|
178
|
+
ret = replace.deep_clone
|
179
|
+
ret.replace(matches[0])
|
180
|
+
return ret
|
181
|
+
end
|
182
|
+
|
183
|
+
# No match at top level. Try to match sub expressions.
|
184
|
+
if is_a?(SyMath::Operator)
|
185
|
+
gotmatch = false
|
186
|
+
|
187
|
+
args2 = @args
|
188
|
+
|
189
|
+
args2.each_with_index do |a, i|
|
190
|
+
matched = a.match_replace(exp, replace, freevars)
|
191
|
+
if matched != a
|
192
|
+
args[i] = matched
|
193
|
+
ret = deep_clone
|
194
|
+
ret.args[i] = matched
|
195
|
+
return ret
|
196
|
+
end
|
197
|
+
end
|
198
|
+
end
|
199
|
+
|
200
|
+
# No match.
|
201
|
+
return self
|
202
|
+
end
|
166
203
|
end
|
data/lib/symath/operation.rb
CHANGED
@@ -1,11 +1,11 @@
|
|
1
1
|
module SyMath::Operation
|
2
2
|
# Repeat method until there are no changes
|
3
|
-
def iterate(method)
|
4
|
-
ret = deep_clone.send(method)
|
3
|
+
def iterate(method, *args)
|
4
|
+
ret = deep_clone.send(method, *args)
|
5
5
|
if ret == self
|
6
6
|
return ret
|
7
7
|
else
|
8
|
-
return ret.iterate(method)
|
8
|
+
return ret.iterate(method, *args)
|
9
9
|
end
|
10
10
|
end
|
11
11
|
|
data/lib/symath/version.rb
CHANGED
data/symath.gemspec
CHANGED
@@ -18,6 +18,7 @@ Gem::Specification.new do |spec|
|
|
18
18
|
spec.metadata["allowed_push_host"] = 'https://rubygems.org'
|
19
19
|
|
20
20
|
spec.metadata["source_code_uri"] = "https://github.com/erikoest/symath"
|
21
|
+
spec.metadata["documentation_uri"] = "https://github.com/erikoest/symath/blob/main/README.md"
|
21
22
|
# spec.metadata["changelog_uri"] = ""
|
22
23
|
else
|
23
24
|
raise "RubyGems 2.0 or newer is required to protect against " \
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: symath
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- erikoest
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2022-01-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -138,6 +138,7 @@ licenses:
|
|
138
138
|
metadata:
|
139
139
|
allowed_push_host: https://rubygems.org
|
140
140
|
source_code_uri: https://github.com/erikoest/symath
|
141
|
+
documentation_uri: https://github.com/erikoest/symath/blob/main/README.md
|
141
142
|
post_install_message:
|
142
143
|
rdoc_options: []
|
143
144
|
require_paths:
|