Skip to content

Commit 9af292b

Browse files
committed
Add serialization methods
1 parent ac824bb commit 9af292b

6 files changed

+760
-95
lines changed

benchmarks.txt

+57
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
goos: linux
2+
goarch: arm64
3+
pkg: github.com/goloop/trit
4+
BenchmarkBasicOperations/IsTrue-6 1000000000 0.3874 ns/op 0 B/op 0 allocs/op
5+
BenchmarkBasicOperations/IsFalse-6 1000000000 0.3856 ns/op 0 B/op 0 allocs/op
6+
BenchmarkBasicOperations/IsUnknown-6 1000000000 0.3926 ns/op 0 B/op 0 allocs/op
7+
BenchmarkBasicOperations/Not-6 1000000000 0.4373 ns/op 0 B/op 0 allocs/op
8+
BenchmarkLogicOperations/And/True/True-6 234911097 5.150 ns/op 0 B/op 0 allocs/op
9+
BenchmarkLogicOperations/Or/True/True-6 507487512 2.346 ns/op 0 B/op 0 allocs/op
10+
BenchmarkLogicOperations/Xor/True/True-6 256011415 4.640 ns/op 0 B/op 0 allocs/op
11+
BenchmarkLogicOperations/And/True/False-6 517155758 2.314 ns/op 0 B/op 0 allocs/op
12+
BenchmarkLogicOperations/Or/True/False-6 516872677 2.359 ns/op 0 B/op 0 allocs/op
13+
BenchmarkLogicOperations/Xor/True/False-6 280535136 4.262 ns/op 0 B/op 0 allocs/op
14+
BenchmarkLogicOperations/And/True/Unknown-6 258602820 4.629 ns/op 0 B/op 0 allocs/op
15+
BenchmarkLogicOperations/Or/True/Unknown-6 516034815 2.313 ns/op 0 B/op 0 allocs/op
16+
BenchmarkLogicOperations/Xor/True/Unknown-6 440733981 2.703 ns/op 0 B/op 0 allocs/op
17+
BenchmarkLogicOperations/And/False/True-6 621918684 1.939 ns/op 0 B/op 0 allocs/op
18+
BenchmarkLogicOperations/Or/False/True-6 442660225 2.740 ns/op 0 B/op 0 allocs/op
19+
BenchmarkLogicOperations/Xor/False/True-6 280399836 4.288 ns/op 0 B/op 0 allocs/op
20+
BenchmarkLogicOperations/And/False/False-6 620087143 1.935 ns/op 0 B/op 0 allocs/op
21+
BenchmarkLogicOperations/Or/False/False-6 308936335 3.900 ns/op 0 B/op 0 allocs/op
22+
BenchmarkLogicOperations/Xor/False/False-6 388179104 3.132 ns/op 0 B/op 0 allocs/op
23+
BenchmarkLogicOperations/And/False/Unknown-6 620732149 1.950 ns/op 0 B/op 0 allocs/op
24+
BenchmarkLogicOperations/Or/False/Unknown-6 278881376 4.308 ns/op 0 B/op 0 allocs/op
25+
BenchmarkLogicOperations/Xor/False/Unknown-6 513034950 2.343 ns/op 0 B/op 0 allocs/op
26+
BenchmarkLogicOperations/And/Unknown/True-6 280650795 4.289 ns/op 0 B/op 0 allocs/op
27+
BenchmarkLogicOperations/Or/Unknown/True-6 383859872 3.120 ns/op 0 B/op 0 allocs/op
28+
BenchmarkLogicOperations/Xor/Unknown/True-6 509072382 2.337 ns/op 0 B/op 0 allocs/op
29+
BenchmarkLogicOperations/And/Unknown/False-6 509856184 2.339 ns/op 0 B/op 0 allocs/op
30+
BenchmarkLogicOperations/Or/Unknown/False-6 279811515 4.288 ns/op 0 B/op 0 allocs/op
31+
BenchmarkLogicOperations/Xor/Unknown/False-6 509464034 2.355 ns/op 0 B/op 0 allocs/op
32+
BenchmarkLogicOperations/And/Unknown/Unknown-6 275796327 4.267 ns/op 0 B/op 0 allocs/op
33+
BenchmarkLogicOperations/Or/Unknown/Unknown-6 256793510 4.652 ns/op 0 B/op 0 allocs/op
34+
BenchmarkLogicOperations/Xor/Unknown/Unknown-6 514765712 2.329 ns/op 0 B/op 0 allocs/op
35+
BenchmarkParallelOperations/All/size=100-6 1292320 917.3 ns/op 448 B/op 9 allocs/op
36+
BenchmarkParallelOperations/Any/size=100-6 1270347 892.1 ns/op 448 B/op 9 allocs/op
37+
BenchmarkParallelOperations/Known/size=100-6 1310016 928.1 ns/op 448 B/op 9 allocs/op
38+
BenchmarkParallelOperations/All/size=1000-6 1253952 944.0 ns/op 448 B/op 9 allocs/op
39+
BenchmarkParallelOperations/Any/size=1000-6 1258168 883.4 ns/op 448 B/op 9 allocs/op
40+
BenchmarkParallelOperations/Known/size=1000-6 1312274 927.6 ns/op 448 B/op 9 allocs/op
41+
BenchmarkParallelOperations/All/size=10000-6 1274380 904.0 ns/op 448 B/op 9 allocs/op
42+
BenchmarkParallelOperations/Any/size=10000-6 1212654 1013 ns/op 448 B/op 9 allocs/op
43+
BenchmarkParallelOperations/Known/size=10000-6 1225298 911.5 ns/op 448 B/op 9 allocs/op
44+
BenchmarkParallelOperations/All/size=100000-6 1000000 1012 ns/op 448 B/op 9 allocs/op
45+
BenchmarkParallelOperations/Any/size=100000-6 1000000 1044 ns/op 448 B/op 9 allocs/op
46+
BenchmarkParallelOperations/Known/size=100000-6 1297084 886.2 ns/op 448 B/op 9 allocs/op
47+
BenchmarkConversions/FromBool/true-6 566544928 2.236 ns/op 0 B/op 0 allocs/op
48+
BenchmarkConversions/FromInt/positive-6 238871332 5.028 ns/op 0 B/op 0 allocs/op
49+
BenchmarkConversions/FromFloat64/negative-6 281565132 4.306 ns/op 0 B/op 0 allocs/op
50+
BenchmarkConversions/ToString-6 1000000000 0.3881 ns/op 0 B/op 0 allocs/op
51+
BenchmarkExtendedOperations/Nand-6 308205770 3.860 ns/op 0 B/op 0 allocs/op
52+
BenchmarkExtendedOperations/Nor-6 257230102 4.729 ns/op 0 B/op 0 allocs/op
53+
BenchmarkExtendedOperations/Nxor-6 181579539 6.767 ns/op 0 B/op 0 allocs/op
54+
BenchmarkExtendedOperations/Imp-6 216840918 5.597 ns/op 0 B/op 0 allocs/op
55+
BenchmarkExtendedOperations/Eq-6 278241660 4.299 ns/op 0 B/op 0 allocs/op
56+
PASS
57+
ok github.com/goloop/trit 80.146s

benchmarks_test.go

+169
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,169 @@
1+
package trit
2+
3+
import (
4+
"fmt"
5+
"testing"
6+
)
7+
8+
// BenchmarkBasicOperations benchmarks basic trit operations
9+
func BenchmarkBasicOperations(b *testing.B) {
10+
b.Run("IsTrue", func(b *testing.B) {
11+
t := True
12+
b.ResetTimer()
13+
for i := 0; i < b.N; i++ {
14+
_ = t.IsTrue()
15+
}
16+
})
17+
18+
b.Run("IsFalse", func(b *testing.B) {
19+
t := False
20+
b.ResetTimer()
21+
for i := 0; i < b.N; i++ {
22+
_ = t.IsFalse()
23+
}
24+
})
25+
26+
b.Run("IsUnknown", func(b *testing.B) {
27+
t := Unknown
28+
b.ResetTimer()
29+
for i := 0; i < b.N; i++ {
30+
_ = t.IsUnknown()
31+
}
32+
})
33+
34+
b.Run("Not", func(b *testing.B) {
35+
t := True
36+
b.ResetTimer()
37+
for i := 0; i < b.N; i++ {
38+
_ = t.Not()
39+
}
40+
})
41+
}
42+
43+
// BenchmarkLogicOperations benchmarks binary logic operations
44+
func BenchmarkLogicOperations(b *testing.B) {
45+
values := []Trit{True, False, Unknown}
46+
47+
for _, v1 := range values {
48+
for _, v2 := range values {
49+
b.Run("And/"+v1.String()+"/"+v2.String(), func(b *testing.B) {
50+
for i := 0; i < b.N; i++ {
51+
_ = v1.And(v2)
52+
}
53+
})
54+
55+
b.Run("Or/"+v1.String()+"/"+v2.String(), func(b *testing.B) {
56+
for i := 0; i < b.N; i++ {
57+
_ = v1.Or(v2)
58+
}
59+
})
60+
61+
b.Run("Xor/"+v1.String()+"/"+v2.String(), func(b *testing.B) {
62+
for i := 0; i < b.N; i++ {
63+
_ = v1.Xor(v2)
64+
}
65+
})
66+
}
67+
}
68+
}
69+
70+
// BenchmarkParallelOperations benchmarks operations that use goroutines
71+
func BenchmarkParallelOperations(b *testing.B) {
72+
// Create large slices of different sizes to test parallel processing
73+
sizes := []int{100, 1000, 10000, 100000}
74+
75+
for _, size := range sizes {
76+
values := make([]Trit, size)
77+
for i := range values {
78+
if i%3 == 0 {
79+
values[i] = True
80+
} else if i%3 == 1 {
81+
values[i] = False
82+
} else {
83+
values[i] = Unknown
84+
}
85+
}
86+
87+
b.Run("All/size="+fmt.Sprint(size), func(b *testing.B) {
88+
for i := 0; i < b.N; i++ {
89+
_ = All(values...)
90+
}
91+
})
92+
93+
b.Run("Any/size="+fmt.Sprint(size), func(b *testing.B) {
94+
for i := 0; i < b.N; i++ {
95+
_ = Any(values...)
96+
}
97+
})
98+
99+
b.Run("Known/size="+fmt.Sprint(size), func(b *testing.B) {
100+
for i := 0; i < b.N; i++ {
101+
_ = Known(values...)
102+
}
103+
})
104+
}
105+
}
106+
107+
// BenchmarkConversions benchmarks type conversion operations
108+
func BenchmarkConversions(b *testing.B) {
109+
b.Run("FromBool/true", func(b *testing.B) {
110+
for i := 0; i < b.N; i++ {
111+
_ = Define(true)
112+
}
113+
})
114+
115+
b.Run("FromInt/positive", func(b *testing.B) {
116+
for i := 0; i < b.N; i++ {
117+
_ = Define(42)
118+
}
119+
})
120+
121+
b.Run("FromFloat64/negative", func(b *testing.B) {
122+
for i := 0; i < b.N; i++ {
123+
_ = Define(-42.0)
124+
}
125+
})
126+
127+
b.Run("ToString", func(b *testing.B) {
128+
t := True
129+
b.ResetTimer()
130+
for i := 0; i < b.N; i++ {
131+
_ = t.String()
132+
}
133+
})
134+
}
135+
136+
// BenchmarkExtendedOperations benchmarks more complex operations
137+
func BenchmarkExtendedOperations(b *testing.B) {
138+
v1, v2 := True, False
139+
140+
b.Run("Nand", func(b *testing.B) {
141+
for i := 0; i < b.N; i++ {
142+
_ = v1.Nand(v2)
143+
}
144+
})
145+
146+
b.Run("Nor", func(b *testing.B) {
147+
for i := 0; i < b.N; i++ {
148+
_ = v1.Nor(v2)
149+
}
150+
})
151+
152+
b.Run("Nxor", func(b *testing.B) {
153+
for i := 0; i < b.N; i++ {
154+
_ = v1.Nxor(v2)
155+
}
156+
})
157+
158+
b.Run("Imp", func(b *testing.B) {
159+
for i := 0; i < b.N; i++ {
160+
_ = v1.Imp(v2)
161+
}
162+
})
163+
164+
b.Run("Eq", func(b *testing.B) {
165+
for i := 0; i < b.N; i++ {
166+
_ = v1.Eq(v2)
167+
}
168+
})
169+
}

doc.go

+153
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,153 @@
1+
// Package trit implements three-valued logic operations with False,
2+
// Unknown, and True states.
3+
//
4+
// # Overview
5+
//
6+
// Trit (short for "trinary digit") is an information unit that can take three
7+
// states: False (-1), Unknown (0), and True (1). It serves as the fundamental
8+
// unit of trinary/ternary logic systems, with applications in:
9+
// - Database systems (SQL NULL handling)
10+
// - Logic circuits and digital design
11+
// - Decision systems with uncertainty
12+
// - Artificial intelligence and expert systems
13+
// - Configuration management
14+
//
15+
// Key Features
16+
// - Basic type conversion (from/to bool, int, float)
17+
// - Fundamental unary operations (NOT, MA, LA, IA)
18+
// - Binary logic operations (AND, OR, XOR, etc.)
19+
// - Extended operations (IMP, EQ, MIN, MAX)
20+
// - Thread-safe parallel operations for slices
21+
// - Full set of comparison and testing methods
22+
//
23+
// # Quick Start
24+
//
25+
// Basic usage example:
26+
//
27+
// t1 := trit.True
28+
// t2 := trit.Unknown
29+
// result := t1.And(t2) // Unknown
30+
// isTrue := result.IsTrue() // false
31+
//
32+
// # Type System
33+
//
34+
// The package implements type Trit as int8 with three main states:
35+
// - False: Any negative value (-1 and below)
36+
// - Unknown: Zero (0)
37+
// - True: Any positive value (1 and above)
38+
//
39+
// # Truth Tables
40+
//
41+
// The package implements the following truth tables for three-valued logic:
42+
//
43+
// 1. Unary Operations:
44+
//
45+
// - NA (Not): Logical negation
46+
//
47+
// - MA (Modus Ponens Absorption)
48+
//
49+
// - LA (Law of Absorption)
50+
//
51+
// - IA (Implication Absorption)
52+
//
53+
// A | NA A | MA A | LA A | IA
54+
// ----+---- ----+---- ----+---- ----+----
55+
// F | T F | F F | F F | F
56+
// U | U U | T U | F U | T
57+
// T | F T | T T | T T | F
58+
//
59+
// 2. Basic Binary Operations:
60+
//
61+
// - AND: Logical conjunction
62+
//
63+
// - OR: Logical disjunction
64+
//
65+
// - XOR: Exclusive OR
66+
//
67+
// A | B | AND A | B | OR A | B | XOR
68+
// ---+---+------ ---+---+------ ---+---+------
69+
// F | F | F F | F | F F | F | F
70+
// F | U | F F | U | U F | U | U
71+
// F | T | F F | T | T F | T | T
72+
// U | F | F U | F | U U | F | U
73+
// U | U | U U | U | U U | U | U
74+
// U | T | U U | T | T U | T | U
75+
// T | F | F T | F | T T | F | T
76+
// T | U | U T | U | T T | U | U
77+
// T | T | T T | T | T T | T | F
78+
//
79+
// 3. Negative Binary Operations:
80+
//
81+
// - NAND: Logical NAND (NOT AND)
82+
//
83+
// - NOR: Logical NOR (NOT OR)
84+
//
85+
// - NXOR: Logical XNOR (NOT XOR)
86+
//
87+
// A | B | NAND A | B | NOR A | B | NXOR
88+
// ---+---+------ ---+---+------ ---+---+------
89+
// F | F | T F | F | T F | F | T
90+
// F | U | T F | U | U F | U | U
91+
// F | T | T F | T | F F | T | F
92+
// U | F | T U | F | U U | F | U
93+
// U | U | U U | U | U U | U | U
94+
// U | T | U U | T | F U | T | U
95+
// T | F | T T | F | F T | F | F
96+
// T | U | U T | U | F T | U | U
97+
// T | T | F T | T | F T | T | T
98+
//
99+
// 4. Extended Operations:
100+
//
101+
// - IMP: Implication (Lukasiewicz Logic)
102+
//
103+
// - EQ: Equivalence (If and only if)
104+
//
105+
// - MIN: Minimum value
106+
//
107+
// - NIMP: Inverse implication
108+
//
109+
// - NEQ: Non-equivalence
110+
//
111+
// - MAX: Maximum value
112+
//
113+
// A | B | IMP A | B | EQ A | B | MIN
114+
// ---+---+------ ---+---+------ ---+---+------
115+
// F | F | T F | F | T F | F | F
116+
// F | U | T F | U | U F | U | F
117+
// F | T | T F | T | F F | T | F
118+
// U | F | U U | F | U U | F | F
119+
// U | U | T U | U | U U | U | U
120+
// U | T | T U | T | U U | T | U
121+
// T | F | F T | F | F T | F | F
122+
// T | U | U T | U | U T | U | U
123+
// T | T | T T | T | T T | T | T
124+
//
125+
// A | B | NIMP A | B | NEQ A | B | MAX
126+
// ---+---+------ ---+---+------ ---+---+------
127+
// F | F | F F | F | F F | F | F
128+
// F | U | F F | U | U F | U | U
129+
// F | T | F F | T | T F | T | T
130+
// U | F | U U | F | U U | F | U
131+
// U | U | F U | U | U U | U | U
132+
// U | T | F U | T | U U | T | T
133+
// T | F | T T | F | T T | F | T
134+
// T | U | U T | U | U T | U | T
135+
// T | T | F T | T | F T | T | T
136+
//
137+
// # Thread Safety
138+
//
139+
// All operations in this package are thread-safe. The parallel operations
140+
// (All, Any, Known) use goroutines for processing large slices and include
141+
// proper synchronization mechanisms.
142+
//
143+
// # Performance Considerations
144+
//
145+
// The package optimizes performance by:
146+
// - Using int8 as the underlying type
147+
// - Implementing efficient parallel processing for slice operations
148+
// - Providing direct value access methods
149+
// - Minimizing memory allocations
150+
//
151+
// For more examples and detailed API documentation, see the individual method
152+
// documentation and the package examples.
153+
package trit

0 commit comments

Comments
 (0)