Skip to content

Commit

Permalink
fix: spxs
Browse files Browse the repository at this point in the history
  • Loading branch information
egon committed Apr 16, 2012
1 parent 2ab0dc1 commit 1702193
Show file tree
Hide file tree
Showing 9 changed files with 62 additions and 70 deletions.
3 changes: 3 additions & 0 deletions src/spexs/spexs.go
Expand Up @@ -26,6 +26,7 @@ type Pooler interface {

type FilterFunc func(p Pattern, ref Reference) bool
type ExtenderFunc func(p Pattern, ref Reference) Patterns
type FitnessFunc func(p *Pattern) float64

type Setup struct {
Ref Reference
Expand All @@ -36,6 +37,8 @@ type Setup struct {

Extendable FilterFunc
Outputtable FilterFunc

Fitness FitnessFunc
}

func NewPatterns() Patterns {
Expand Down
2 changes: 1 addition & 1 deletion src/spexs/trie/pattern.go
Expand Up @@ -76,7 +76,7 @@ func (n *Pattern) Complexity() int {
return 0
}

func (n *Pattern) PValue(ref Reference) float64 {
func (n *Pattern) PValue(ref *Reference) float64 {
if n.pvalue >= 0 {
return n.pvalue
}
Expand Down
2 changes: 2 additions & 0 deletions src/spexs/trie/spexs.go
Expand Up @@ -27,6 +27,8 @@ type Setup struct {

Extendable FilterFunc
Outputtable FilterFunc

Fitness FitnessFunc
}

func NewPatterns() Patterns {
Expand Down
10 changes: 5 additions & 5 deletions src/spxs/extenders.go
Expand Up @@ -2,14 +2,14 @@ package main

import (
"log"
. "spexs"
. "spexs/trie"
)

type extenderConf interface{}
type extenderCreator func(conf extenderConf, setup Setup) TrieExtenderFunc
type extenderCreator func(conf extenderConf, setup Setup) ExtenderFunc

func simpleExtender(f TrieExtenderFunc) extenderCreator {
return func(conf extenderConf, setup Setup) TrieExtenderFunc {
func simpleExtender(f ExtenderFunc) extenderCreator {
return func(conf extenderConf, setup Setup) ExtenderFunc {
return f
}
}
Expand All @@ -21,7 +21,7 @@ var extenders = map[string]extenderCreator{
"regexp": simpleExtender(GroupStarExtender),
}

func CreateExtender(conf Conf, setup Setup) TrieExtenderFunc {
func CreateExtender(conf Conf, setup Setup) ExtenderFunc {
if conf.Extension.Method == "" {
log.Fatal("Extender not defined!")
}
Expand Down
50 changes: 25 additions & 25 deletions src/spxs/filters.go
Expand Up @@ -3,44 +3,44 @@ package main
import (
"log"
"math"
. "spexs"
. "spexs/trie"
)

type filterConf map[string]interface{}
type filterCreator func(filterConf, Setup) TrieFilterFunc
type filterCreator func(filterConf) FilterFunc

type genericFilterConf struct{ Min, Max float64 }

func trueFilter(p *TrieNode) bool {
func trueFilter(p *Pattern, ref *Reference) bool {
return true
}

var Filters = map[string]filterCreator{
"length": func(conf filterConf, setup Setup) TrieFilterFunc {
return genericFilter(func(p *TrieNode) float64 {
var Filters = map[string] filterCreator {
"length": func(conf filterConf) FilterFunc {
return genericFilter(func(p *Pattern, ref *Reference) float64 {
return float64(p.Len())
}, conf)
},
"count": func(conf filterConf, setup Setup) TrieFilterFunc {
return genericFilter(func(p *TrieNode) float64 {
return float64(p.Pos.Len()) / float64(len(setup.Ref.Pats))
"count": func(conf filterConf) FilterFunc {
return genericFilter(func(p *Pattern, ref *Reference) float64 {
return float64(p.Pos.Len()) / float64(len(ref.Pats))
}, conf)
},
"p-value": func(conf filterConf, setup Setup) TrieFilterFunc {
return genericFilter(func(p *TrieNode) float64 {
return p.PValue(setup.Ref)
"p-value": func(conf filterConf) FilterFunc {
return genericFilter(func(p *Pattern, ref *Reference) float64 {
return p.PValue(ref)
}, conf)
},
}

func CreateFilter(conf map[string]map[string]interface{}, setup Setup) TrieFilterFunc {
filters := make([]TrieFilterFunc, 0)
func CreateFilter(conf map[string]map[string]interface{}, setup Setup) FilterFunc {
filters := make([]FilterFunc, 0)

for name, args := range conf {
if _, valid := Filters[name]; !valid {
log.Fatal("No filter named: ", name)
}
f := Filters[name](args, setup)
f := Filters[name](args)
filters = append(filters, f)
}

Expand All @@ -51,19 +51,19 @@ func CreateFilter(conf map[string]map[string]interface{}, setup Setup) TrieFilte
}

// create a composite filter
return func(p *TrieNode) bool {
return func(p *Pattern, ref *Reference) bool {
for _, f := range filters {
if !f(p) {
if !f(p, ref) {
return false
}
}
return true
}
}

type valueFunc func(p *TrieNode) float64
type valueFunc func(*Pattern, *Reference) float64

func genericFilter(value valueFunc, config interface{}) TrieFilterFunc {
func genericFilter(value valueFunc, config interface{}) FilterFunc {
var conf genericFilterConf
conf.Min = math.NaN()
conf.Max = math.NaN()
Expand All @@ -74,16 +74,16 @@ func genericFilter(value valueFunc, config interface{}) TrieFilterFunc {
low, high := !math.IsNaN(conf.Min), !math.IsNaN(conf.Max)

if low && high {
return func(p *TrieNode) bool {
return (value(p) <= max) && (value(p) > min)
return func(p *Pattern, ref *Reference) bool {
return (value(p, ref) <= max) && (value(p, ref) > min)
}
} else if low {
return func(p *TrieNode) bool {
return value(p) > min
return func(p *Pattern, ref *Reference) bool {
return value(p, ref) > min
}
} else if high {
return func(p *TrieNode) bool {
return value(p) <= max
return func(p *Pattern, ref *Reference) bool {
return value(p, ref) <= max
}
}

Expand Down
22 changes: 11 additions & 11 deletions src/spxs/fitnesses.go
Expand Up @@ -2,44 +2,44 @@ package main

import (
"log"
. "spexs"
. "spexs/trie"
)

type fitnessConf map[string]interface{}

type fitnessCreator func(fitnessConf, Setup) TrieFitnessFunc
type fitnessCreator func(fitnessConf, Setup) FitnessFunc

func simpleFitness(f TrieFitnessFunc) fitnessCreator {
return func(conf fitnessConf, setup Setup) TrieFitnessFunc {
func simpleFitness(f FitnessFunc) fitnessCreator {
return func(conf fitnessConf, setup Setup) FitnessFunc {
return f
}
}

var fitnesses = map[string]fitnessCreator{
"def": simpleFitness(
func(p *TrieNode) float64 {
func(p *Pattern) float64 {
return float64(p.Len() * p.Pos.Len())
}),
"len": simpleFitness(
func(p *TrieNode) float64 {
func(p *Pattern) float64 {
return float64(p.Len())
}),
"count": simpleFitness(
func(p *TrieNode) float64 {
func(p *Pattern) float64 {
return float64(p.Pos.Len())
}),
"complexity": simpleFitness(
func(p *TrieNode) float64 {
func(p *Pattern) float64 {
return float64(p.Complexity())
}),
"p-value": func(conf fitnessConf, setup Setup) TrieFitnessFunc {
return func(p *TrieNode) float64 {
"p-value": func(conf fitnessConf, setup Setup) FitnessFunc {
return func(p *Pattern) float64 {
return p.PValue(setup.Ref)
}
},
}

func CreateFitness(conf Conf, setup Setup) TrieFitnessFunc {
func CreateFitness(conf Conf, setup Setup) FitnessFunc {
if conf.Output.Order == "" {
log.Fatal("Output ordering not defined!")
}
Expand Down
8 changes: 4 additions & 4 deletions src/spxs/reference.go
Expand Up @@ -6,13 +6,13 @@ import (
"io"
"log"
"os"
. "spexs"
. "spexs/trie"
"strings"
"unicode/utf8"
)

func CreateReference(conf Conf) *UnicodeReference {
ref := NewUnicodeReference(1024)
func CreateReference(conf Conf) *Reference {
ref := NewReference(1024)

if conf.Alphabet.Characters == "" {
log.Fatal("No alphabet defined!")
Expand Down Expand Up @@ -63,7 +63,7 @@ func pattern(data string, group int) ReferencePattern {
return p
}

func addPatternsFromFile(ref *UnicodeReference, filename string, group int) {
func addPatternsFromFile(ref *Reference, filename string, group int) {
var (
file *os.File
reader *bufio.Reader
Expand Down
29 changes: 8 additions & 21 deletions src/spxs/setup.go
@@ -1,40 +1,27 @@
package main

import (
. "spexs"
. "spexs/trie"
)

const MAX_POOL_SIZE = 1024 * 1024 * 1024

type Setup struct {
Ref *UnicodeReference
Out TriePooler
In TriePooler
type TrieFitnessCreator func(interface{}) FitnessFunc
type TrieExtenderCreator func(interface{}) ExtenderFunc

Extender TrieExtenderFunc

Extendable TrieFilterFunc
Outputtable TrieFilterFunc

Fitness TrieFitnessFunc
}

type TrieFitnessCreator func(interface{}) TrieFitnessFunc
type TrieExtenderCreator func(interface{}) TrieExtenderFunc

func lengthFitness(p *TrieNode) float64 {
func lengthFitness(p *Pattern) float64 {
return 1 / float64(p.Len())
}

type PatternFilterCreator func(limit int) TrieFilterFunc
type PatternFilterCreator func(limit int) FilterFunc

func CreateInput(conf Conf, setup Setup) TriePooler {
func CreateInput(conf Conf, setup Setup) Pooler {
in := NewPriorityPool(lengthFitness, MAX_POOL_SIZE)
in.Put(NewFullNodeFromRef(setup.Ref))
in.Put(NewFullPattern(setup.Ref))
return in
}

func CreateOutput(conf Conf, setup Setup) TriePooler {
func CreateOutput(conf Conf, setup Setup) Pooler {
size := conf.Output.Count
if size < 0 {
size = MAX_POOL_SIZE
Expand Down
6 changes: 3 additions & 3 deletions src/spxs/spxs.go
Expand Up @@ -4,7 +4,7 @@ import (
"flag"
"fmt"
"runtime"
. "spexs"
. "spexs/trie"
"time"

"log"
Expand Down Expand Up @@ -106,9 +106,9 @@ func main() {
}

if *procs <= 1 {
RunTrie(setup.Ref, setup.In, setup.Out, setup.Extender, setup.Extendable, setup.Outputtable)
Run(setup)
} else {
RunTrieParallel(setup.Ref, setup.In, setup.Out, setup.Extender, setup.Extendable, setup.Outputtable, *procs)
RunParallel(setup, *procs)
}

fmt.Printf("match, regexp, count, fitness, p-value\n")
Expand Down

0 comments on commit 1702193

Please sign in to comment.