-
Notifications
You must be signed in to change notification settings - Fork 1
/
markovnode.py
138 lines (116 loc) · 4.35 KB
/
markovnode.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
#!/usr/bin/python2
# coding=utf-8
from __future__ import division
import random
class MarkovNode:
def __init__( self, word, nonRandomizedWord, isEnd = False, isBold = False, isItalic = False, isUnderlined = False, font = None ):
'''Initialize. Duh.
Args:
word: The word this node represents. May or may not have randomized capitalization.
nonRandomizedWord: The non-randomized version of the word.
isEnd: A Boolean indicating whether this node is the end of a sentence.
isBold: Whether this node, newly created, represents a bold word (after the node is created, this status can be affected by calling addBold() or addNormal() )
isItalic: Whether this node, newly created, represents an italic word (after the node is created, this status can be affected by calling addItalic() or addNormal() )
isUnderlined: Whether this node, newly created, represents an underlined word (after the node is created, this status can be affected by calling addUnderlined() or addNormal() )
font: The PIL ImageFont associated with this node.
'''
self.links = []
self.isEnd = isEnd
self.numTotal = 0
self.numBold = 0
self.numItalic = 0
self.numUnderlined = 0
if isBold:
self.addBold()
if isItalic:
self.addItalic()
if isUnderlined:
self.addUnderlined()
if not isBold and not isItalic and not isUnderlined:
self.addNormal()
self.boldDecided = False #We only want to randomly decide boldness once
self.bold = False
self.italicDecided = False #We only want to randomly decide boldness once
self.italic = False
self.underlinedDecided = False #We only want to randomly decide boldness once
self.underlined = False
self.word = word
self.nonRandomizedWord = nonRandomizedWord
self.font = font
def unselectStyle( self ):
'''Set boldDecided, italicDecided, and underlinedDecided to False.
'''
self.boldDecided = False
self.italicDecided = False
self.underlinedDecided = False
def randomBoolean( self, probability = 0.5 ):
'''Get a random true or false value, with the given probability of being true.
Args:
probability: a number between 0.0 and 1.0 inclusive. Defaults to 0.5.
Returns:
A Boolean.
'''
if probability < 0 or probability > 1:
raise ValueError( "probability must be between 0 and 1 inclusive" )
return( random.random() <= probability )
def isBold( self ):
'''Determine randomly whether this node should be rendered as bold text.
'''
if not self.boldDecided:
self.bold = self.randomBoolean( self.numBold / self.numTotal )
self.boldDecided = True
return self.bold
def isItalic( self ):
'''Determine randomly whether this node should be rendered as italicized text.
'''
if not self.italicDecided:
self.italic = self.randomBoolean( self.numItalic / self.numTotal )
self.italicDecided = True
return self.italic
def isUnderlined( self ):
'''Determine randomly whether this node should be rendered as underlined text.
'''
if not self.underlinedDecided:
self.underlined = self.randomBoolean( self.numUnderlined / self.numTotal )
self.underlinedDecided = True
return self.underlined
def addNormal( self ):
'''Increment the total counter only.
'''
self.numTotal += 1
def addBold( self ):
'''Increment the bold and total counters.
'''
self.numBold += 1
self.numTotal += 1
def addItalic( self ):
'''Increment the italic and total counters.
'''
self.numItalic += 1
self.numTotal += 1
def addUnderlined( self ):
'''Increment the underlined and total counters.
'''
self.numUnderlined += 1
self.numTotal += 1
def getRandomLinkedNode( self ):
'''Randomly select one of the nodes to which this node is linked.
'''
return random.choice( self.links )
def hasLinks( self ):
'''Determine whether this node has any links.
'''
return len( self.links ) > 0
def addLink( self, other ):
'''Add to this node a link to another node.
Args:
other: The other node to which to link.
Returns:
The number of links this node has after adding the new link.
'''
self.links.append( other )
#if other not in self.links:
# self.links[ other ] = 1
#else:
# self.links[ other ] += 1 #If there is already a link to the other node, increase the link's value.
return len( self.links )