Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Refactor Polynomials: Extract Method to Introduce RootFinder Factory Method and Tighten Encapsulation #322

Merged
merged 20 commits into from
Dec 25, 2023
Merged
Show file tree
Hide file tree
Changes from 18 commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
9709c54
refactor: using Parallel Change, introduced a new message that return…
hemalvarambhia Dec 24, 2023
1487a64
refactor: migrated the client to no longer use roots message.
hemalvarambhia Dec 24, 2023
b8434f0
refactor: Extract Method where a method instantiates a root finding a…
hemalvarambhia Dec 24, 2023
eee00a7
refactor: made the method a class method. Next we can inline the inst…
hemalvarambhia Dec 24, 2023
ea7419e
refactor: Move Method to a more sensible place.
hemalvarambhia Dec 24, 2023
32ebd8a
refactor: Inline Method, as it has no clients.
hemalvarambhia Dec 24, 2023
218a2e5
refactor: clarified the name of the method.
hemalvarambhia Dec 24, 2023
91e14e3
style: corrected a Smalltalk code critique.
hemalvarambhia Dec 24, 2023
251c5b6
refactor: Inline Method as it has no clients.
hemalvarambhia Dec 24, 2023
8dbe917
refactor: Rename Method, and now we have the interface that a client …
hemalvarambhia Dec 24, 2023
6ebf707
style: removed redundant comment.
hemalvarambhia Dec 24, 2023
a585d96
refactor: Rename Variable - it looks like it is a root.
hemalvarambhia Dec 24, 2023
22005cb
test: added a simple test for x^2 + 2x + 1, whose roots are x = -1 an…
hemalvarambhia Dec 24, 2023
3dfdc8e
test: changed the example and added a comment to make it clear what t…
hemalvarambhia Dec 24, 2023
371e9c8
test: added some interesting and missing tests.
hemalvarambhia Dec 24, 2023
22e219c
fix: corrected the comment.
hemalvarambhia Dec 24, 2023
25ba113
test: clarified naming using domain language (repeated roots).
hemalvarambhia Dec 24, 2023
fc66d1d
fix: corrected a comment.
hemalvarambhia Dec 24, 2023
2fc4e5d
test: clarified the name of a test.
hemalvarambhia Dec 24, 2023
6de9e74
refactor: Rename Variable where we make the roles of the objects clea…
hemalvarambhia Dec 24, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions src/Math-Numerical/PMNewtonZeroFinder.class.st
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,15 @@ PMNewtonZeroFinder class >> function: aBlock1 derivative: aBlock2 [
^(self new) setFunction: aBlock1; setDerivative: aBlock2; yourself
]

{ #category : #information }
PMNewtonZeroFinder class >> with: precision [

| rootFinder |
rootFinder := self new.
rootFinder desiredPrecision: precision.
^ rootFinder
]

{ #category : #operation }
PMNewtonZeroFinder >> computeInitialValues [
"Private - If no derivative has been defined, take an ad-hoc definition.
Expand Down
30 changes: 15 additions & 15 deletions src/Math-Polynomials/PMPolynomial.class.st
Original file line number Diff line number Diff line change
Expand Up @@ -233,27 +233,27 @@ PMPolynomial >> reciprocal [

{ #category : #information }
PMPolynomial >> roots [

^ self roots: Float defaultComparisonPrecision
^ (self roots: Float defaultComparisonPrecision) asSortedCollection asArray
]

{ #category : #information }
PMPolynomial >> roots: aNumber [

| pol roots x rootFinder |
rootFinder := PMNewtonZeroFinder new.
rootFinder desiredPrecision: aNumber.
pol := self class coefficients: ( coefficients reverse collect: [ :each | each asFloat]).
| pol roots root rootFinder |
rootFinder := PMNewtonZeroFinder with: aNumber.
pol := self class coefficients:
(coefficients reverse collect: [ :each | each asFloat ]).
roots := OrderedCollection new: self degree.
[ rootFinder setFunction: pol; setDerivative: pol derivative.
x := rootFinder evaluate.
rootFinder hasConverged
] whileTrue: [ roots add: x.
pol := pol deflatedAt: x.
pol degree > 0
ifFalse: [ ^roots].
].
^roots
[
rootFinder
setFunction: pol;
setDerivative: pol derivative.
root := rootFinder evaluate.
rootFinder hasConverged ] whileTrue: [
roots add: root.
pol := pol deflatedAt: root.
pol degree > 0 ifFalse: [ ^ roots ] ].
^ roots
]

{ #category : #'double dispatching' }
Expand Down
36 changes: 35 additions & 1 deletion src/Math-Tests-Polynomials/PMPolynomialTest.class.st
Original file line number Diff line number Diff line change
Expand Up @@ -235,13 +235,36 @@ PMPolynomialTest >> testPolynomialRoots [

| polynomial roots |
polynomial := PMPolynomial coefficients: #( -10 -13 -2 1 ).
roots := polynomial roots asSortedCollection asArray.
roots := polynomial roots .
self assert: roots size equals: 3.
self assert: (roots at: 1) + 2 closeTo: 0.
self assert: (roots at: 2) + 1 closeTo: 0.
self assert: (roots at: 3) - 5 closeTo: 0
]

{ #category : #'iterative algorithms' }
PMPolynomialTest >> testPolynomialRootsForConstant [

| polynomial |
"Here, compute the roots of the constant C = 1"
polynomial := PMPolynomial coefficients: #( 1 ).
self
should: [ polynomial roots ]
raise: Error
description: 'Function''s derivative seems to be zero everywhere'
]

{ #category : #'iterative algorithms' }
PMPolynomialTest >> testPolynomialRootsForLinear [

| polynomial roots |
"Here, compute the roots of the linear (2x + 1)"
polynomial := PMPolynomial coefficients: #( 1 2 ).
roots := polynomial roots.
self assert: roots size equals: 1.
self assert: (roots at: 1) closeTo: -0.5
]

{ #category : #'function evaluation' }
PMPolynomialTest >> testPolynomialSubtraction [
| polynomial |
Expand All @@ -253,3 +276,14 @@ PMPolynomialTest >> testPolynomialSubtraction [
self assert: (polynomial at: 3) equals: -1.
self assert: (polynomial at: 4) equals: 0
]

{ #category : #'iterative algorithms' }
PMPolynomialTest >> testPolynomialWithRepeatedRoots [
| polynomial roots |
"Here, compute the roots of the quadratic (2x + 1)^2 = 4 x^2 + 4 x + 1"
polynomial := PMPolynomial coefficients: #(1 4 4).
roots := polynomial roots .
self assert: roots size equals: 2.
self assert: (roots at: 1) closeTo: -0.5 .
self assert: (roots at: 2) closeTo: -0.5 .
]