Example #1
0
func TestSGD_ChooseManyEven(t *testing.T) {
	batchsize = 128
	samplesize := 32000
	source := rand.NewSource(1337)
	pRNG := rand.New(source)
	sgd := NewSGD(samplesize, pRNG)
	batches := sgd.ChooseMany(samplesize / batchsize)
	if len(batches) != samplesize/batchsize {
		t.Errorf("Expected %v Got %v For batchsize = %v and samplesize = %v",
			samplesize/batchsize, len(batches), batchsize, samplesize)
	}
	var samples sort.IntSlice
	for _, batch := range batches {
		if len(batch) < batchsize-1 || len(batch) > batchsize+1 {
			t.Errorf("Expected %v or %v Got %v For numbatches = %v and samplesize = %v",
				batchsize, batchsize-1, len(batch), samplesize/batchsize, samplesize)
		}
		for _, sample := range batch {
			samples = append(samples, sample)
		}
	}
	samples.Sort()
	for idx := range samples {
		if idx != samples[idx] {
			t.Error("Missing sample %v in batches", idx)
		}
	}
}
Example #2
0
File: table.go Project: aloidev/qb
func primaryKeys(s reflect.Type) ([]string, error) {
	pk := make(map[int]string, 0)
	var pkNum sort.IntSlice
	for i := 0; i < s.NumField(); i++ {
		field := s.Field(i)
		pkTag := field.Tag.Get("pk")
		if pkTag != "" {
			num, err := strconv.ParseInt(pkTag, 10, 8)
			if err != nil {
				return nil, err
			}
			fieldName := strings.ToLower(field.Name)
			n := int(num)
			if v, exist := pk[n]; exist {
				err = errors.New("key number conflict field " + v + "with " + fieldName)
				return nil, err
			}
			pk[n] = fieldName
			pkNum = append(pkNum, n)
		}
	}
	n := len(pk)
	if n == 0 {
		return nil, errors.New("struct doesn't have a primary key.")
	}
	pkNum.Sort()
	result := make([]string, n)
	for i, v := range pkNum {
		result[i] = pk[v]
	}
	return result, nil
}
Example #3
0
// convertIntList converts an intList expression into a sorted list of unique
// integers
func convertIntList(list jsonParser.IntList) ([]int, error) {

	intMap := make(map[int]bool)
	for _, r := range list {
		if strings.Contains(r, ":") {
			list, err := ConvertRangeToList(r)
			if err != nil {
				return nil, err
			}
			for _, i := range list {
				intMap[i] = true
			}
		} else {
			i, err := strconv.Atoi(r)
			if err != nil {
				return nil, fmt.Errorf("cannot convert range value %s into integer", r)
			}
			intMap[i] = true
		}
	}

	var outList sort.IntSlice //[]int
	for k := range intMap {
		outList = append(outList, k)
	}
	outList.Sort()

	return outList, nil
}
Example #4
0
// composeResponseMessages takes the ResponseErrors (if any) and creates ResponseMessages from them.
func composeResponseMessages(route restful.Route, decl *ApiDeclaration) (messages []ResponseMessage) {
	if route.ResponseErrors == nil {
		return messages
	}
	// sort by code
	codes := sort.IntSlice{}
	for code, _ := range route.ResponseErrors {
		codes = append(codes, code)
	}
	codes.Sort()
	for _, code := range codes {
		each := route.ResponseErrors[code]
		message := ResponseMessage{
			Code:    code,
			Message: each.Message,
		}
		if each.Model != nil {
			st := reflect.TypeOf(each.Model)
			isCollection, st := detectCollectionType(st)
			modelName := modelBuilder{}.keyFrom(st)
			if isCollection {
				modelName = "array[" + modelName + "]"
			}
			modelBuilder{Models: &decl.Models}.addModel(st, "")
			// reference the model
			message.ResponseModel = modelName
		}
		messages = append(messages, message)
	}
	return
}
Example #5
0
func verifySortedOrder(msg string, rbt *LinkedOrderedMap, insertedNums sort.IntSlice) bool {
	var sortedNums sort.IntSlice
	sortedNums = append(sortedNums, insertedNums...)
	sortedNums.Sort()

	i := 0
	for it := rbt.Iterator(); it.IsValid(); it.Next() {
		if sortedNums[i] != it.Value().(int) {
			t.Errorf("%s. Ordered iteration %d: Expecting %d but gets %d", msg, i, sortedNums[i], it.Value().(int))
			return false
		}
		i++
	}

	i = len(sortedNums) - 1
	for it := rbt.ReverseIterator(); it.IsValid(); it.Next() {
		if sortedNums[i] != it.Value().(int) {
			t.Errorf("%s. Reverse ordered iteration %d: Expecting %d but gets %d", msg, i, sortedNums[i], it.Value().(int))
			return false
		}
		i--
	}

	return true
}
Example #6
0
func TestHeap1(t *testing.T) {
	for tests := 0; tests < 10000; tests++ {
		var heap Heap
		var data sort.IntSlice

		var length = rand.Intn(50)
		var key int
		for i := 0; i < length; i++ {
			key = rand.Intn(100)
			heap.Insert(key, key)
			data = append(data, key)
		}

		data.Sort()
		for _, v := range data {
			if heap.IsEmpty() {
				t.Errorf("Heap unexpectedly empty")
			}
			key := heap.Extract().(int)
			if key != v {
				t.Errorf("Keys are not equal %v %v", key, v)
			}
		}
		if !heap.IsEmpty() {
			t.Errorf("Heap not empty")
		}
	}
}
Example #7
0
func (e *mongoEngine) getPermIds(resString string, perms []string, create bool) (sort.IntSlice, error) {
	var ids sort.IntSlice
	var err error
	for _, p := range perms {
		id, exist := e.GetPerm(p, resString, create)
		if !exist {
			err = errs.ErrPermNotExist
		}
		ids = append(ids, id)
	}
	ids.Sort()
	return ids, err
}
Example #8
0
// Prefs returns sorted preferences
func (list *MXlist) Prefs() []uint16 {
	prefs := sort.IntSlice{}
	for pref := range *list {
		prefs = append(prefs, int(pref))
	}
	prefs.Sort()

	ret := []uint16{}
	for _, pref := range prefs {
		ret = append(ret, uint16(pref))
	}
	return ret
}
Example #9
0
func TestHeap2(t *testing.T) {
	for tests := 0; tests < 10000; tests++ {
		var heap Heap
		var data sort.IntSlice

		var length = rand.Intn(50)
		var key int

		var inserted = 0
		for i := 0; i < length; i++ {
			var insert = rand.Intn(10) >= 5
			if insert {
				key = rand.Intn(100)
				heap.Insert(key, key)
				data = append(data, key)
				inserted++
			} else {
				if inserted == 0 {
					continue
				}
				key = heap.Extract().(int)
				data.Sort()
				if key != data[0] {
					t.Errorf("Keys are not equal %v %v", key, data[0])
				}
				data = data[1:]
				inserted--
			}
		}

		data.Sort()
		for _, v := range data {
			if heap.IsEmpty() {
				t.Errorf("Heap is unexpectedly empty, removing")
			}
			key = heap.Extract().(int)
			if key != v {
				t.Errorf("Keys are not equal %v %v", key, v)
			}
			inserted--
		}
		if !heap.IsEmpty() {
			t.Errorf("Heap not empty")
		}
		if inserted != 0 {
			t.Errorf("inserted not 0")
		}
	}
}
Example #10
0
func Test_InitSorted(t *testing.T) {
	data := sort.IntSlice{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13}
	tree := Tree{}
	tree.InitSorted(data.Len())
	check(t, data, &tree, tree.root)
	check_iter(t, data, &tree)

	data = sort.IntSlice{}
	f := map[int]struct{}{}
	tree = Tree{}
	for i := 100; i > 0; i-- {
		v := rand.Intn(1000)
		if _, ok := f[v]; ok {
			continue
		}
		data = append(data, v)
	}
	sort.Sort(data)
	tree.InitSorted(data.Len())
	check(t, data, &tree, tree.root)
	check_iter(t, data, &tree)
}
Example #11
0
func GetWords(ctx *gin.Context) {
	count := 40
	level := ctx.Params.ByName("level")
	switch level {
	case "1":
		count = 25
	case "3":
		count = 60
	default:

	}
	maper := make(map[int]int)
	arr_id := sort.IntSlice{}
	rander := rand.New(rand.NewSource(time.Now().Unix()))
	for len(maper) < count {
		v := rander.Intn(1709)
		maper[v] = v
	}
	for k, _ := range maper {
		arr_id = append(arr_id, k)
	}
	arr_id.Sort()

	sqlstr := "select word,interpretation from word where id in (" + getsql(count) + ")"
	var words []db.Word
	var args []interface{}
	for _, v := range arr_id {
		args = append(args, v)
	}
	if _, err := db.DB.Select(&words, sqlstr, args...); err != nil {
		ctx.String(200, err.Error()+sqlstr)
		// ctx.HTML(http.StatusBadRequest, "main", err)
		return
	}
	ctx.HTML(http.StatusOK, "main", words)

}
Example #12
0
// state 2 - Build and train test set
func interactiveBuildTrainAndTestSet() {
	var (
		err         os.Error
		inputString string
		inputInt    int
	)
	// STEP 1:
	// Begin building training and test set
	fmt.Println("Building train and test set")
	inputString = promptString("filename", "What file would you like to split?")
	debugMsg("Opening file: %s", inputString)
	// Open the file for reading
	dataFile, err := os.Open(inputString)
	errCheck(err)
	// We do not need this file after, so close it upon leaving this method
	defer dataFile.Close()
	// Create a buffered reader for the file
	dataReader := bufio.NewReader(dataFile)
	var line string

	// STEP 2:
	// Create a map for storing the temporary files

	tempFileMap := map[string]*os.File{}
	countMap := map[string]int{}
	var exists bool       // For checking if element exists
	var tempFile *os.File // Place holder for the temporary file
	// which is to be put in the map.
	for line, err = dataReader.ReadString('\n'); // read line by line
	err == nil;                                  // stop on error
	line, err = dataReader.ReadString('\n') {
		// Take each instance and write it to a label specific file
		line = strings.Trim(line, "\n")
		feature := strings.Split(line, ",")
		label := feature[len(feature)-1]
		tempFile, exists = tempFileMap[label]
		countMap[label]++
		if exists {
			// Write to the file
			_, err = tempFile.WriteString(line + "\n")
			errCheck(err)
		} else {
			// Create the file and write the line
			tempFileName := dataFile.Name() + "." + label + ".tmp"
			debugMsg("Creating temporary file: %s", tempFileName)
			tempFile, err := os.OpenFile(
				tempFileName,
				os.O_CREATE+os.O_WRONLY+os.O_TRUNC,
				0666)
			tempFileMap[label] = tempFile
			defer tempFile.Close()
			defer os.Remove(tempFileName)
			_, err = tempFile.WriteString(line + "\n")
			errCheck(err)
		}
	}
	// Close and re-open the files as readable
	debugMsg("Closing all temporary files for writing. Re-opening as read-only.")
	for k, v := range tempFileMap {
		fileName := v.Name()
		v.Close()
		tempFileMap[k], err = os.Open(fileName)
		errCheck(err)
		// We do not need this file after, so close it upon leaving this method
		defer tempFileMap[k].Close()
	}

	// STEP 3:
	// Receive the number of each label (class) we'd like to add to the training
	// set

	// Hold the amount of each label we'd like in the training set in a map
	trainCountMap := map[string]int{}
	fmt.Println("Please enter the number of each type of label you'd",
		"like in the training set.")
	// Ask user how much of each label they want and put it in a map
	// trainCountMap
	for k, v := range countMap {
		inputInt = promptInt(k, "label: %s max: %d", k, v)
		trainCountMap[k] = inputInt
	}
	debugMsg("Creating: %s", dataFile.Name()+".train")
	// Open a file for writing training data
	trainFile, err := os.OpenFile(
		dataFile.Name()+".train",
		os.O_CREATE+os.O_WRONLY+os.O_TRUNC,
		0666)
	errCheck(err)
	// We do not need this file after, so close it upon leaving this method
	defer trainFile.Close()
	// STEP 4:
	// Read the correct amount of each label in

	for k, v := range trainCountMap {
		debugMsg("label: %s count: %d", k, v)
		dataReader := bufio.NewReader(tempFileMap[k])
		// Open a file for writing testing data
		testFile, err := os.OpenFile(
			dataFile.Name()+"."+k+".test",
			os.O_CREATE+os.O_WRONLY+os.O_TRUNC,
			0666)
		errCheck(err)
		// We do not need this file after, so close it upon leaving this method
		defer testFile.Close()

		if v > 0 {
			// Generate a random permuation
			var randomized sort.IntSlice
			randomized = rand.Perm(countMap[k])
			// use a slice the first /v/ of them
			randomized = randomized[0:v]
			// sort the ints so that as we iterate through each instance we can
			// easily find the next one we need to export
			randomized.Sort()
			// Read through the file, writing the included instances to
			// .train and the others to .test
			lineCount := 0
			if len(randomized) > 0 {
				for line, err = dataReader.ReadString('\n'); // read line by line
				err == nil;                                  // stop on error
				line, err = dataReader.ReadString('\n') {
					if lineCount == randomized[0] {
						_, err = trainFile.WriteString(line)
						errCheck(err)
						if len(randomized) > 1 {
							randomized = randomized[1:len(randomized)]
						} else {
							randomized[0] = -1 // skip the rest
						}
					} else {
						_, err = testFile.WriteString(line)
						errCheck(err)
					}
					lineCount++
				}
			} else {

			}
		} else {
			//TODO: Add a handler for -1
			// None of the label were requested in the training set, so dump to test
			for line, err = dataReader.ReadString('\n'); // read line by line
			err == nil;                                  // stop on error
			line, err = dataReader.ReadString('\n') {
				_, err = testFile.WriteString(line)
				errCheck(err)
			}
		}
		testFile.Close()
	}
	fmt.Println()
}
Example #13
0
func (f *File) saveUsingXrefStream() error {
	info, err := os.Stat(f.filename)
	if err != nil {
		return err
	}

	file, err := os.OpenFile(f.filename, os.O_RDWR|os.O_APPEND, 0666)
	if err != nil {
		return err
	}
	defer func() {
		err := file.Close()
		if err != nil {
			panic(err)
		}
	}()

	offset := info.Size() + 1

	n, err := writeLineBreakTo(file)
	if err != nil {
		return err
	}
	offset += n

	xrefs := map[Integer]crossReference{}

	xrefs[0] = crossReference{0, 0, 65535}

	free := sort.IntSlice{0}
	for i := range f.objects {
		switch typed := f.objects[i].(type) {
		case crossReference:
			// no-op, don't need to write unchanged objects to file
			// however, we do need to handle the free list
			// xrefs[Integer(i)] = typed
			if typed[0] == 0 {
				free = append(free, int(i))
			}
		case IndirectObject:
			xrefs[Integer(i)] = crossReference{1, uint(offset - 1), typed.GenerationNumber}
			n, err = typed.writeTo(file)
			if err != nil {
				return err
			}
			offset += n

			n, err = writeLineBreakTo(file)
			if err != nil {
				return err
			}
			offset += n
		case freeObject:
			xrefs[Integer(i)] = crossReference{0, 0, uint(typed)}
			free = append(free, int(i))
		default:
			panic(fmt.Sprintf("unhandled type: %T", typed))
		}
	}

	// Figure out the highest object number to set Size properly
	var maxObjNum uint
	for objNum := range f.objects {
		if objNum > maxObjNum {
			maxObjNum = objNum
		}
	}

	// add an xref for the xrefstream
	xrefstreamObjectNumber := uint(maxObjNum + 1)
	maxObjNum++
	xref := crossReference{1, uint(offset - 1), 0}
	xrefs[Integer(xrefstreamObjectNumber)] = xref
	f.objects[xrefstreamObjectNumber] = xref

	// fill in the free linked list
	free.Sort()
	for i := 0; i < free.Len()-1; i++ {
		xref := xrefs[Integer(free[i])]
		xref[1] = uint(free[i+1])
		xrefs[Integer(free[i])] = xref
	}

	objects := make(sort.IntSlice, 0, len(xrefs))
	for objectNumber := range xrefs {
		objects = append(objects, int(objectNumber))
	}
	objects.Sort()

	// group into consecutive sets
	groups := []sort.IntSlice{}
	groupStart := 0
	for i := range objects {
		if i == 0 {
			continue
		}

		if objects[i] != objects[i-1]+1 {
			groups = append(groups, objects[groupStart:i])
			groupStart = i
		}
	}
	groups = append(groups, objects[groupStart:])

	// Create the xrefstream dictionary (the trailer)
	trailer := Dictionary{}
	trailer[Name("Size")] = Integer(maxObjNum + 1)

	// Prev
	if f.prev != 0 {
		trailer[Name("Prev")] = f.prev
	}

	// Root
	trailer[Name("Root")] = f.Root

	// Encrypt
	if len(f.Encrypt) != 0 {
		trailer[Name("Encrypt")] = f.Encrypt
	}

	// Info
	if f.Info.ObjectNumber != 0 {
		trailer[Name("Info")] = f.Info
	}

	// ID
	if len(f.ID) != 0 {
		trailer[Name("ID")] = f.ID
	}

	// Add xrefstream specific things to trailer
	trailer["Type"] = Name("XRef")

	// Index
	index := Array{}
	// fmt.Println(groups)
	for _, group := range groups {
		index = append(index, Integer(group[0]), Integer(len(group)))
	}
	trailer["Index"] = index

	// layout for the stream (W)
	maxXref := [3]uint{}
	for _, xref := range xrefs {
		for i := 0; i < len(xref); i++ {
			if xref[i] > maxXref[i] {
				maxXref[i] = xref[i]
			}
		}
	}
	nBytes := [3]int{}
	for i := range nBytes {
		nBytes[i] = nBytesForInt(int(maxXref[i]))
	}
	trailer["W"] = Array{Integer(nBytes[0]), Integer(nBytes[1]), Integer(nBytes[2])}

	// log.Println(xrefs)

	stream := &bytes.Buffer{}
	for _, group := range groups {
		for _, objectNumber := range group {
			xref := xrefs[Integer(objectNumber)]
			for i := range xref {
				_, err = stream.Write(intToBytes(xref[i], nBytes[i]))
				if err != nil {
					return err
				}
			}
		}
	}

	xrefstream := IndirectObject{
		ObjectReference: ObjectReference{
			ObjectNumber: xrefstreamObjectNumber,
		},
		Object: Stream{
			Dictionary: trailer,
			Stream:     stream.Bytes(),
		},
	}
	_, err = f.Add(xrefstream)
	if err != nil {
		return err
	}

	_, err = xrefstream.writeTo(file)
	if err != nil {
		return err
	}

	fmt.Fprintf(file, "\nstartxref\n%d\n%%%%EOF", offset-1)

	return nil
}
Example #14
0
func (f *File) saveUsingXrefTable() error {
	info, err := os.Stat(f.filename)
	if err != nil {
		return err
	}

	file, err := os.OpenFile(f.filename, os.O_WRONLY|os.O_APPEND, 0666)
	if err != nil {
		return err
	}
	defer func() {
		err := file.Close()
		if err != nil {
			panic(err)
		}
	}()

	offset := info.Size() + 1

	n, err := writeLineBreakTo(file)
	if err != nil {
		return err
	}
	offset += n

	xrefs := map[Integer]crossReference{}

	xrefs[0] = crossReference{0, 0, 65535}

	free := sort.IntSlice{}
	for i := range f.objects {
		switch typed := f.objects[i].(type) {
		case crossReference:
			// no-op, don't need to write unchanged objects to file
			// however, we do need to handle the free list
			// xrefs[Integer(i)] = typed
			if typed[0] == 0 {
				free = append(free, int(i))
			}
		case IndirectObject:
			xrefs[Integer(i)] = crossReference{1, uint(offset - 1), typed.GenerationNumber}
			n, err = typed.writeTo(file)
			if err != nil {
				return err
			}
			offset += n

			n, err = writeLineBreakTo(file)
			if err != nil {
				return err
			}
			offset += n
		case freeObject:
			xrefs[Integer(i)] = crossReference{0, 0, uint(typed)}
			free = append(free, int(i))
		default:
			panic(fmt.Sprintf("unhandled type: %T", typed))
		}
	}

	// fill in the free linked list
	free.Sort()
	for i := 0; i < free.Len()-1; i++ {
		xref := xrefs[Integer(free[i])]
		xref[1] = uint(free[i+1])
		xrefs[Integer(free[i])] = xref
	}

	objects := make(sort.IntSlice, 0, len(xrefs))
	for objectNumber := range xrefs {
		objects = append(objects, int(objectNumber))
	}
	objects.Sort()

	// group into consecutive sets
	groups := []sort.IntSlice{}
	groupStart := 0
	for i := range objects {
		if i == 0 {
			continue
		}

		if objects[i] != objects[i-1]+1 {
			groups = append(groups, objects[groupStart:i])
			groupStart = i
		}
	}
	// add remaining group
	groups = append(groups, objects[groupStart:])

	// write as an xref table to file
	fmt.Fprintf(file, "xref\n")
	for _, group := range groups {
		fmt.Fprintf(file, "%d %d\n", group[0], len(group))
		for _, objectNumber := range group {
			xref := xrefs[Integer(objectNumber)]
			fmt.Fprintf(file, "%010d %05d ", xref[1], xref[2])
			switch xref[0] {
			case 0:
				// f entries
				fmt.Fprintf(file, "f\r\n")
			case 1:
				// n entries
				fmt.Fprintf(file, "n\r\n")
			case 2:
				panic("can't be in xref table")
			default:
				panic("unhandled case")
			}
		}
	}

	// Setup create the trailer
	fmt.Fprintf(file, "\ntrailer\n")
	trailer := Dictionary{}

	// Size
	// Figure out the highest object number to set Size properly
	var maxObjNum uint
	for objNum := range f.objects {
		if objNum > maxObjNum {
			maxObjNum = objNum
		}
	}
	trailer[Name("Size")] = Integer(maxObjNum + 1)

	// Prev
	if f.prev != 0 {
		trailer[Name("Prev")] = f.prev
	}

	// Root
	trailer[Name("Root")] = f.Root

	// Encrypt
	if len(f.Encrypt) != 0 {
		trailer[Name("Encrypt")] = f.Encrypt
	}

	// Info
	if f.Info.ObjectNumber != 0 {
		trailer[Name("Info")] = f.Info
	}

	// ID
	if len(f.ID) != 0 {
		trailer[Name("ID")] = f.ID
	}

	_, err = trailer.writeTo(file)
	if err != nil {
		return err
	}

	fmt.Fprintf(file, "\nstartxref\n%d\n%%%%EOF", offset-1)

	return nil
}
Example #15
0
func main() {

	//Exercise 1.
	var numbers sort.IntSlice = []int{9, 2, 12, 1, 16, 12, 10, 12, 12, 9, 8, 9, 0, 11, 2, 1}
	numbers.Sort() //numbers are sorted and can be used as is.
	result := UniqueInts(numbers)
	fmt.Println("Exercise 1\n", result)

	//Exercise 2.
	irregularMatrix := [][]int{{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11}, {12, 13, 14, 15}, {16, 17, 18, 19, 20}}
	slice := Flatten(irregularMatrix)

	fmt.Println("Exercise 2")
	fmt.Printf("1x%d: %v\n", len(slice), slice)

	//Exercise 3.
	numbers_exer3 := []int{155, 2, 12, 1, 16, 12, 222, 12, 12, 11, 8, 9, 5, 11, 2, 20}

	var column_count = 2
	var fraction int
	var fraction_float float64

	fraction_float = float64(len(numbers_exer3)) / float64(column_count)
	fraction = len(numbers_exer3) / column_count

	if fraction_float != float64(int64(fraction_float)) {

		numbers_exer3 := Make2D_helper(fraction_float, numbers_exer3, column_count)
		numbers_exer3_result := Make2D(numbers_exer3, column_count, fraction+1)
		fmt.Println("Exercise 3", column_count, numbers_exer3_result[column_count:])

	} else {
		numbers_exer3_result := Make2D(numbers_exer3, column_count, fraction)
		fmt.Println("Exercise 3\n", column_count, numbers_exer3_result[column_count:])
	}

	//Exercise 4.

	iniData := []string{
		"#filter substitution",
		"[App]",
		";",
		"; This field specifies your organization's name.  This field is recommended,",
		"; but optional.",
		"Vendor=MozillaTest",
		";",
		"; This field specifies your application's name.  This field is required.",
		"Name=Simple",
		";",
		"; This field specifies your application's version.  This field is required.",
		"Version=0.1",
		";",
		"; This field specifies your application's build ID (timestamp).  This field is",
		"; required.",
		"BuildID=20070625",
		";",
		"; This field specifies a compact copyright notice for your application.  This",
		"; field is optional.",
		"Copyright=Copyright (c) 2004 Mozilla.org",
		";",
		"; This ID is just an example.  Every XUL app ought to have it's own unique ID.",
		"; You can use the microsoft 'guidgen' or 'uuidgen' tools, or go on",
		"; irc.mozilla.org and /msg botbot uuid.  This field is optional.",
		"ID={3aea3f07-ffe3-4060-bb03-bff3a5365e90}",
		"",
		"[Gecko]",
		";",
		"; This field is required.  It specifies the minimum Gecko version that this",
		"; application requires.",
		"MinVersion=@MOZILLA_VERSION_U@",
		";",
		"; This field is optional.  It specifies the maximum Gecko version that this",
		"; application requires.  It should be specified if your application uses",
		"; unfrozen interfaces.",
		"MaxVersion=@MOZILLA_VERSION_U@",
		"",
		"[Shell]",
		";",
		"; This field specifies the location of your application's main icon with file",
		"; extension excluded.  NOTE: Unix style file separators are required.  This",
		"; field is optional.",
		"Icon=chrome/icons/default/simple",
	}

	fmt.Println("Exercise 4,5")

	//Exercise 5

	//	PrintIni()

	map_data := ParseIni(iniData)
	PrintIni(map_data)
}
//Be careful to use same partioning as in lecture
//and return total number of comparisons
func Quicksort(input sort.IntSlice, ps pivotSelector) int {
	if input.Len() < 2 {
		return 0
	}
	input.Swap(0, ps(input))
	i := 1
	for j := 1; j < input.Len(); j++ {
		if input.Less(j, 0) {
			input.Swap(i, j)
			i++
		}
	}
	input.Swap(0, i-1)
	comparisons := input.Len() - 1
	comparisons += Quicksort(input[:i-1], ps)
	comparisons += Quicksort(input[i:], ps)
	return comparisons
}