From 1a4209882ee759b0ee214b99c308a4694c2f252e Mon Sep 17 00:00:00 2001 From: Pankaj Kumar Bind Date: Fri, 28 Mar 2025 18:16:08 +0530 Subject: [PATCH 1/3] Added performance test for allSubsets in CTOrderedSetTest --- .../CTOrderedSetTest.class.st | 10 +++++++++ .../CTOrderedSet.class.st | 21 +++++++++++++------ 2 files changed, 25 insertions(+), 6 deletions(-) diff --git a/src/Containers-OrderedSet-Tests/CTOrderedSetTest.class.st b/src/Containers-OrderedSet-Tests/CTOrderedSetTest.class.st index acea903..1e2a160 100644 --- a/src/Containers-OrderedSet-Tests/CTOrderedSetTest.class.st +++ b/src/Containers-OrderedSet-Tests/CTOrderedSetTest.class.st @@ -180,6 +180,16 @@ CTOrderedSetTest >> testAllSubsets [ self assert: actual equals: expected. ] +{ #category : #'performance tests' } +CTOrderedSetTest >> testAllSubsetsPerformance [ + | set time | + set := CTOrderedSet withAll: (1 to: 10) asArray. "Set of size 10" + + time := [ set allSubsets ] timeToRun. + self assert: set allSubsets size equals: (1 bitShift: 10) - 2. "1022 subsets" + self assert: time < 1 second description: 'Should complete within 1 second for size 10'. +] + { #category : #'ordered collection tests' } CTOrderedSetTest >> testAt [ | set expected actual | diff --git a/src/Containers-OrderedSet/CTOrderedSet.class.st b/src/Containers-OrderedSet/CTOrderedSet.class.st index 1a1c878..a646559 100644 --- a/src/Containers-OrderedSet/CTOrderedSet.class.st +++ b/src/Containers-OrderedSet/CTOrderedSet.class.st @@ -37,13 +37,22 @@ CTOrderedSet >> allLargestSubsets [ { #category : #'as yet unclassified' } CTOrderedSet >> allSubsets [ - "Generate all possible subsets of this self without self and an empty set. - Example: - {1, 2, 3} => {1}, {2}, {3}, {1, 2}, {1, 3}, {2, 3}" + "Generate all possible subsets of the receiver, excluding the receiver itself and the empty set. + Uses a bitmask approach for efficiency. + Example: #(a b c) => #(a), #(b), #(c), #(a b), #(a c), #(b c)" + + | subsets size | + size := self size. + subsets := OrderedCollection new: (1 bitShift: size) - 2. "Reserve space for 2^n - 2 subsets" + + 1 to: (1 bitShift: size) - 2 do: [ :mask | + | subset | + subset := self species new. + 1 to: size do: [ :index | + (mask bitAt: index) = 1 ifTrue: [ subset addLast: (self at: index) ] ]. + subsets add: subset ]. - "This implementation might not be very fast and has to be improved" - ^ (self combinations copyWithout: self asArray) collect: [ :eachArray | - self species withAll: eachArray ] + ^ subsets asArray ] { #category : #accessing } From ace73bea3081bb16e24e4349778c81f3250fc73c Mon Sep 17 00:00:00 2001 From: Pankaj Kumar Bind Date: Fri, 28 Mar 2025 18:22:54 +0530 Subject: [PATCH 2/3] Added performance test for allSubsets in CTOrderedSetTest --- .../CTOrderedSetTest.class.st | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/Containers-OrderedSet-Tests/CTOrderedSetTest.class.st b/src/Containers-OrderedSet-Tests/CTOrderedSetTest.class.st index 1e2a160..c434cc3 100644 --- a/src/Containers-OrderedSet-Tests/CTOrderedSetTest.class.st +++ b/src/Containers-OrderedSet-Tests/CTOrderedSetTest.class.st @@ -163,6 +163,16 @@ CTOrderedSetTest >> testAllLargestSubsets [ self assert: actual equals: expected. ] +{ #category : #'performance tests' } +CTOrderedSetTest >> testAllSubsetsPerformance [ + | set time | + set := CTOrderedSet withAll: (1 to: 10) asArray. "Set of size 10" + + time := [ set allSubsets ] timeToRun. + self assert: set allSubsets size equals: (1 bitShift: 10) - 2. "1022 subsets" + self assert: time < 1 second description: 'Should complete within 1 second for size 10'. +] + { #category : #tests } CTOrderedSetTest >> testAllSubsets [ | set expected actual | @@ -180,16 +190,6 @@ CTOrderedSetTest >> testAllSubsets [ self assert: actual equals: expected. ] -{ #category : #'performance tests' } -CTOrderedSetTest >> testAllSubsetsPerformance [ - | set time | - set := CTOrderedSet withAll: (1 to: 10) asArray. "Set of size 10" - - time := [ set allSubsets ] timeToRun. - self assert: set allSubsets size equals: (1 bitShift: 10) - 2. "1022 subsets" - self assert: time < 1 second description: 'Should complete within 1 second for size 10'. -] - { #category : #'ordered collection tests' } CTOrderedSetTest >> testAt [ | set expected actual | From 824d37aceebff9fd60806fa9bdf14037b35185d1 Mon Sep 17 00:00:00 2001 From: Pankaj Kumar Bind Date: Sat, 19 Apr 2025 16:48:43 +0530 Subject: [PATCH 3/3] testAllSubsets test was failing before but now fixed --- .../CTOrderedSetTest.class.st | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/Containers-OrderedSet-Tests/CTOrderedSetTest.class.st b/src/Containers-OrderedSet-Tests/CTOrderedSetTest.class.st index c434cc3..c4fac05 100644 --- a/src/Containers-OrderedSet-Tests/CTOrderedSetTest.class.st +++ b/src/Containers-OrderedSet-Tests/CTOrderedSetTest.class.st @@ -177,17 +177,17 @@ CTOrderedSetTest >> testAllSubsetsPerformance [ CTOrderedSetTest >> testAllSubsets [ | set expected actual | set := CTOrderedSet withAll: #(a c b). - + expected := { CTOrderedSet withAll: #(a) . CTOrderedSet withAll: #(c) . - CTOrderedSet withAll: #(b) . - CTOrderedSet withAll: #(a c) . + CTOrderedSet withAll: #(a c) . + CTOrderedSet withAll: #(b) . CTOrderedSet withAll: #(a b) . CTOrderedSet withAll: #(c b) }. - + actual := set allSubsets. - self assert: actual equals: expected. + self assert: actual equals: expected. ] { #category : #'ordered collection tests' }