Commit 828c7f4a authored by Carsten Eie Frigaard's avatar Carsten Eie Frigaard
Browse files

update

parent 0f975de9
......@@ -588,22 +588,19 @@ CONTENT L00
\itemize{
\item{Antal studerende per grupper er = 3.}
\item{Grupper med 2 eller 1}
\item{studerende vil blive sammelagt. Skriv til undervisere, hvis du har
en gyldig grund til at være SOLO i en gruppe.}
\item{studerende vil blive sammelagt. Skriv til undervisere, hvis du har en gyldig grund til at være SOLO i en gruppe.}
}
\p{\i{Installation}: de obligatoriske værktøjer til ITMAL inden kursusstart (dvs.
L01).}
\p{\i{Forberedelse til L01:} Hent GIT repositories til litteraturen [GITHOML], prøv at
kører et par Jupyter Notebooks [JPYNB], og læs mere om pythons NumPy
\p{\i{Forberedelse til L01:} Hent GIT repositories til litteraturen [GITHOML],
prøv at kører et par Jupyter Notebooks [JPYNB], og læs mere om pythons NumPy
bibliotek.}
\p{\i{Ekstra materiale til forberedelse:} optionelle python opgaver, hvis du vil sætte
dig mere ind i sproget.}
\p{\i{Ekstra materiale til forberedelse:} optionelle python opgaver, hvis du
vil sætte dig mere ind i sproget.}
\sub{Installation}
......@@ -629,13 +626,10 @@ dig mere ind i sproget.}
\item{få fat i litteratur til kurset,}
\item{clone [GITHOML] til din egen PC, se how-to under [KURSUSFORKORTELSER].}
\item{skim denne tutorial igennem:}
\displaystyle{\em{§ Scientific Python tutorials:} NumPy, \ipynb{tools_numpy.ipynb}, [GITHOML]
[BR][BR]
Læs blot, hvad du finder relevant så som 'iteration', men spring blot over
emner, der er for komplekse eller for 'pythoniske', så som 'Stacking arrays' og
'QR decomposition'.
\subitem{\em{§ Scientific Python tutorials:} NumPy, \ipynb{tools_numpy.ipynb}, [GITHOML]
\subitem{Læs blot, hvad du finder relevant så som 'iteration', men
spring blot over emner, der er for komplekse eller for 'pythoniske', så
som 'Stacking arrays' og 'QR decomposition'.}
}
}
......@@ -645,9 +639,9 @@ dig mere ind i sproget.}
information (informations-overload), så du skal danne dig en metode til at
kunne selektere og navigere i materialet.}
\p{Vi vil primært holde os til [HOML], [GITHOML] og Scikit-learn, med en note
om, at nettet flyder over med ekstra (til tider ubrugelig/ufiltreret)
information: en kildekritiks holdning er vigtig!}
\p{Vi holder os primært til [HOML], [GITHOML] og Scikit-learn, med en note om,
at nettet flyder over med ekstra (til tider ubrugelig/ufiltreret) information:
en kildekritiks holdning er vigtig!}
\sub{Ekstra materiale til forberedelse}
......@@ -691,14 +685,14 @@ at vi præsentere de formelle rammer vdr.
\p{Herefter vil vi præsentere machine learning [ML] som koncept overordnet, og
kort ridse lektionsplanen for kurset op.}
\p{Software til brug for kurset introduceres og skal installeres på jeres PC'er,
se 'L00: Forberedelse' for en installationsguide. Vi anvender python
\p{Software til brug for kurset introduceres og skal installeres på jeres
PC'er, se 'L00: Forberedelse' for en installationsguide. Vi anvender python
distributionen anaconda og i henter og installere den sidste nye version. På
klassen vil der blive givet en kort demo af jupyter notebooks, dvs. et at de
udviklingsværktøjer til python vi vil bruge.}
\p{Vi kigge på Scikit-learn, det primære eksterne web-sted vi vil bruge i kurset,
samt forsøge os med et par små programmer i python.}
\p{Vi kigge på Scikit-learn, det primære eksterne web-sted vi vil bruge i
kurset, samt forsøge os med et par små programmer i python.}
\p{Til slut kigger vi på supervised learning og at kunne predicte
'life-satisfactory' via demo projektet i [HOML], og vi ser på pythons modul- og
......@@ -713,9 +707,8 @@ lektioner..}
\itemize{
\item{et sæt obligatoriske skriftlige gruppe-journaler med afleveringsdeadlines,}
\item{en poster-session, med aflevering af poster og mundtlig præsentation af poster,}
\item{en mundtlig gennemgang af den sidste journal med alle medlemmer i ITMAL gruppen, samt evaluering af hver gruppemedlems
bidrag.}
\displaystyle{\b{\style{color: #ff3333, => Endelig godkendelse af kurset sker på en samlet vurdering af de tre punkter ovenfor.}}}
\item{en mundtlig gennemgang af den sidste journal med alle medlemmer i ITMAL gruppen, samt evaluering af hver gruppemedlems bidrag.}
\subitem{[BR]\b{\style{color: #ff3333, => Endelig godkendelse af kurset sker på en samlet vurdering af de tre punkter ovenfor.}}}
}
\item{Læringsmål.}
\item{Litteratur.}
......@@ -738,12 +731,11 @@ lektioner..}
\sub{Litteratur}
\displaystyle{\i{§ Preface}, p. xv [HOML] (eksklusiv fra \i{Using Code Examples}...og resten af
intro kapitlet)}
\displaystyle{\i{§ 1 The machine Learning Landscape} [HOML]}
\displaystyle{\i{§ 2 End-to-End Machine Learning Project} [HOML]}
\itemize*{
\item{\i{§ Preface}, p. xv [HOML] (eksklusiv fra \i{Using Code Examples}...og resten af intro kapitlet)}
\item{\i{§ 1 The machine Learning Landscape} [HOML]}
\item{\i{§ 2 End-to-End Machine Learning Project} [HOML]}
}
\p{Dette kapitel indeholder mange nye koncepter og en del kode. Vi vender
senere tilbage til kapitlet senere, så læs det og prøv at danne dig et overblik
......@@ -751,9 +743,10 @@ senere tilbage til kapitlet senere, så læs det og prøv at danne dig et overbl
\p{Når du har installeret anaconda (se L00):}
\displaystyle{\i{§ Scientific Python tutorials: NumPy}}
\displaystyle{\indent{\ipynb{tools_numpy.ipynb} [GITHOML]}}
\itemize*{
\item{\i{§ Scientific Python tutorials: NumPy}}
\subitem*{\ipynb{tools_numpy.ipynb} [GITHOML]}
}
\p{Læs blot, hvad du finder relevant så som 'iteration', men spring blot over
emner, der er for komplekse eller for 'pythoniske', så som 'Stacking arrays' og
......@@ -771,7 +764,7 @@ emner, der er for komplekse eller for 'pythoniske', så som 'Stacking arrays' og
\enumerate{
\item{Diskussion om ML (indlejret i forelæsningen).}
\item{\b{Opgave} (introduktion): \link**{[HOME]/L01/intro.ipynb}}
\item{\b{Opgave} (introduktion): \link**{[HOME]/L01/intro.ipynb} }
\subitem*{HUSK DATA til intro'en (download og udpak så dataset dir ligger sammen med intro.ipynb): \link**{[HOME]/L01/datasets.zip}}
\item{\b{Opgave} (python introduktion): \link**{[HOME]/L01/modules_and_classes.ipynb}}
}
......@@ -783,8 +776,8 @@ brug for en python og lineær algebra kick-start.}
\sub{Slides}
\displaystyle{
\link**{[HOME]/L01/lesson01.pdf}
\itemize*{
\item{\link**{[HOME]/L01/lesson01.pdf} (vil blive opdateret inden lektion)}
}
......@@ -854,20 +847,11 @@ læring den pågældende algoritme har opnået på de pågældende data.}
\sub{Litteratur}
\displaystyle{
\i{§ 2 End-to-End Machine Learning Project}, \i{Select a Performance Measure}, [HOML]
[BR]
\indent{Genlæs KUN \i{Select a Performance Measure} (pp.39-41)}
}
\displaystyle{
\i{§ 3 Classification} [HOML]
[BR]
\indent{Skim eller spring over: \i{The ROC Curve} (pp.97-1o0) \i{Multilabel
Classification} og \i{Multioutput Classification} (pp.106-108).}
\itemize*{
\item{\i{§ 2 End-to-End Machine Learning Project}, \i{Select a Performance Measure}, [HOML]}
\subitem{Genlæs KUN \i{Select a Performance Measure} (pp.39-41)}
\item{\i{§ 3 Classification} [HOML]}
\subitem{Skim eller spring over: \i{The ROC Curve} (pp.97-100) \i{Multilabel Classification} og \i{Multioutput Classification} (pp.106-108).}
}
\sub{Forberedelse inden lektionen}
......@@ -887,8 +871,8 @@ læring den pågældende algoritme har opnået på de pågældende data.}
\sub{Slides}
\displaystyle{
\link**{[HOME]/L02/lesson02.pdf}
\itemize*{
\item{\link**{[HOME]/L02/lesson02.pdf}}
}
......@@ -916,38 +900,47 @@ til at komme igennem alle grundliggende koncepter i \i{§ 2}.}
sammensættes i en samlet processerings-\i{pipeline}. Programmerings-teknisk
ser vi derfor til sidst på Scikit-learns Pipelines.}
\displaystyle{
\itemize*{
\item{
\link{\img{[FIGS]/ml_supervised_map.png, Supervised map image.}, [HOME]/Etc/ml_supervised_map.pdf}
[BR] \i{Figur: \link*{Oversigtskortet for Supervised learning (The Map)., [HOME]/Etc/ml_supervised_map.pdf}}
[BR]
\i{Figur: \link*{Oversigtskortet for Supervised learning (The Map)., [HOME]/Etc/ml_supervised_map.pdf}}
}
}
\sub{Indhold}
\itemize{
\item{Generel genlæsning og repetition af § 2}
\item{Generel genlæsning og repetition af \i{§ 2}}
\item{K-fold Cross-validation}
\item{Pipelines}
}
\sub{Litteratur}
\enumerate{
\item{Genlæs: \i{§ 2 End-to-End Machine Learning Project} [HOML]}
\subitem*{(eksklusiv \i{Create the Workspace} og \i{Download the Data})}
\item{Scikit's dokumentations-side vdr. k-fold CV}
\itemize*{
\item{\i{§ 2 End-to-End Machine Learning Project} [HOML]}
\subitem*{genlæsning (eksklusiv \i{Create the Workspace} og \i{Download the Data})}
\item{\i{§ Scikit's dokumentations-side vdr. K-fold CV}}
\subitem*{\link{https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.KFold.html}}
}
\sub{Forberedelse inden lektionen}
\itemize{
\item{Læs litteraturen.}
\item{Læs litteraturen,}
\item{Forbered een eller flere af gruppe medlerne på en mundtlig repetition af \i{§ 2 End-to-End:}:}
\subitem{i skal kunne give et kort mundligt resume af hele \i{§ 2} til en anden gruppe (på nær, som nævnt, \i{Create the Workspace} og \i{Download the Data}),}
\subitem{resume holdes til konceptplan, dvs. prøv at genfortælle, hvad de overordnede linier i kaptilerne i [HOML].}
}
\sub{På klassen}
\itemize{
\enumerate{
\item{Supergruppe [SG] resume af \i{§ 2 End-to-End}:}
\subitem{en supergruppe [SG], sammensættes af to grupper [G], on-the-fly på klassen,}
\subitem{hver gruppe [G] forbereder og giver en anden gruppe [G] et mundtligt resume af \i{§ 2} til en anden gruppe,}
\subitem{tid: ca. 30 min- sammenlagt, den ene grupper genfortæller første haldel af \i{§ 2} i ca. 15 min., hvorefter den anden gruppe genfortæller resten i ca. 15 min.}
\item{Almindelig forelæsning}
\subitem*{ekstra materiale: \link**{[HOME]/L03/Extra/k-fold_demo.ipynb}}
\item{\b{Opgave} (pipelines): \link**{[HOME]/L03/pipelines.ipynb}}
......@@ -957,10 +950,12 @@ ser vi derfor til sidst på Scikit-learns Pipelines.}
\sub{Slides}
\displaystyle{
\itemize*{
\link**{[HOME]/L03/lesson03.pdf}
}
END
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
......@@ -978,7 +973,7 @@ CONTENT L04
supervised klassifikation metode.}
\p{Modellen lineær regression gennemanalyseres og der angives både analytiske
og numeriske løsninger til træning af en lineær model.
og numeriske løsninger til træning af en lineær model.}
\p{For den numeriske løsning går vi i dybden med træningsmetoden \i{Stochastic
Gradient Decent metoden} (SGD).}
......@@ -1019,11 +1014,6 @@ grundlag for neuroner i neurale net.)}
\link**{[HOME]/L04/lesson04.pdf}
}
END
Formål :
......
......@@ -21,6 +21,7 @@ CONTENT
NOTES
Tidpunkt: Fredage 08:15 til 12:00
Lokale: 5106-110
BA: 15/12 aflevering af bachelorprojekt
REFS
[1] sdf
[2] sfd zdf
......
......@@ -8,16 +8,18 @@ PWD = $(shell pwd)
COURSEFILES = ITMAL_E21
MKDIFF=colordiff -dw Refs/$1 $1 && echo "DIFF OK" && rm $1
build:
@ $(PYCOURSE) -c $(COURSEFILES)/course.tex -v -o ../../Html/
@ $(PYPLAN) -p $(COURSEFILES)/plan.txt -v -o ../../Html/plan.html
@ cd ../.. && $(PWD)/$(PYFILETREE) -v -o Html/filetree.html
sync: build
@ echo "SYNC.."
@ #nmap -T5 -p 22 si | grep -v "Note: Host seems down" >/dev/null
@ ssh si "cd ITMAL_E21 && rm -f Html/*.html && git pull"
@ cd ../../ && scp -q -C -r Html si:ITMAL_E21/
@ echo "SYNC..DONE"
build:
@ $(PYCOURSE) -c $(COURSEFILES)/course.tex -v -o ../../Html/
@ $(PYPLAN) -p $(COURSEFILES)/plan.txt -v -o ../../Html/plan.html
@ cd ../.. && $ $(PWD)/$(PYFILETREE) -v -o Html/filetree.html
TESTARGS=-v -v
test:
......@@ -26,7 +28,7 @@ test:
@ $(call MKDIFF,L01.html)
@ $(PYPLAN) -p Test/plan.txt $(TESTARGS) -o plan.html
@ $(call MKDIFF,plan.html)
@ cd Test && $(PWD)/$(PYFILETREE) $(TESTARGS) -o $(PWD)/tree.html
@ cd Test && $(PWD)/$(PYFILETREE) $(TESTARGS) -header "ITMAL Backend File Structure" -o $(PWD)/tree.html
@ $(call MKDIFF,tree.html)
edit:
......
......@@ -255,7 +255,7 @@ class Diagnostics:
linetag = '", line '
m = ii.find(linetag)
if m>=0:
ii = FiltPwd(ii[0:m]) + Col('BLUE') + str(linetag) + ii[m+len(linetag):]
ii = FiltPwd(ii[0:m]) + Col('LCYAN') + str(linetag) + ii[m+len(linetag):]
t = Col('CYAN') + str(ii) + ColEnd()
if n==0:
maxlen = len(t) if len(t)>maxlen else maxlen
......
......@@ -3,71 +3,69 @@
from Utils.dbg import ERR, DiagStdErr, PrettyPrintTracebackDiagnostics
from sys import stdout, stderr
def isStr(t, checknonempty=True):
def Str(t, checknonempty=True):
assert isinstance(t, str), f"exected string but got type='{type(t)}'"
assert (not checknonempty) or (len(t)>0), f"string is empty, and this was unexpected"
return t
def isBool(t):
def Bool(t):
assert isinstance(t, bool), f"exected bool but got type='{type(t)}'"
return t
def isInt(t, minval=0):
def Int(t, minval=0):
assert isinstance(t, int), f"exected int but got type='{type(t)}'"
assert t>=minval
return t
def isList(t):
def List(t):
assert isinstance(t, list), f"exected list but got type='{type(t)}'"
return t
def isDict(t):
def Dict(t):
assert isinstance(t, dict), f"exected dict but got type='{type(t)}'"
return t
def isTuple(t, expectedlen=2):
def Tuple(t, expectedlen=2):
assert isinstance(t, tuple),f"exected tuple but got type='{type(t)}'"
assert len(t)==isInt(expectedlen, 1)
assert len(t)==Int(expectedlen, 1)
return t
def Check(expr, msg):
isStr(msg)
if not expr:
Str(msg)
if not Bool(expr):
ERR("EXPRESSION NOT FULLFILLED: " + msg)
def Trim(s, checknonempty=True):
s = isStr(s, isBool(checknonempty)).replace("\t"," ")
s = Str(s, Bool(checknonempty)).replace("\t"," ")
s = s.strip()
return s
def SuffixFrom(s, splitstr):
n = isStr(s).rfind(isStr(splitstr))
n = Str(s).rfind(Str(splitstr))
if n<0:
ERR(f"string '{s}' does not contain split string '{splitstr}' at all")
return s[n+len(splitstr):]
def Dbg(verbose, msg, level=1):
isInt(verbose)
isStr(msg)
isInt(level)
if level <= verbose:
Str(msg)
if Int(level) <= Int(verbose):
print(msg, file=stderr)
def Outputfile(outputfile):
assert outputfile is not None
outputfile = isStr(outputfile).replace(" ", "_")
outputfile = Str(outputfile).replace(" ", "_")
f = stdout if (outputfile is None or len(outputfile)==0 or outputfile=="None") else open(outputfile, 'w')
return f
def LoadText(filename, timeout=4000, split=True):
with open(isStr(filename), 'r', timeout) as f:
with open(Str(filename), 'r', timeout) as f:
c = f.read()
if split:
c = c.split("\n")
return c
def MkHtmlPage(htmlcontent):
assert isStr(htmlcontent).find("DOCTYPE")<0 and htmlcontent.find("<html>")<=0 and htmlcontent.find("<body>")<=0
assert Str(htmlcontent).find("DOCTYPE")<0 and htmlcontent.find("<html>")<=0 and htmlcontent.find("<body>")<=0
meta = "<meta http-equiv='Content-Type' content='text/html; charset=utf-8'/>"
comment = "<!-- AUTOGENERATED HTML from CourseBuilder, CEF -->"
......
......@@ -17,13 +17,13 @@ if __name__ == '__main__':
RIGHT= '>'
def HtmlEncode(s):
return escape(isStr(s, False))
return escape(Str(s, False))
def HtmlDecode(s):
return unescape(isStr(s, False))
return unescape(Str(s, False))
def _mkHtml(tag, style=""):
if len(isStr(style, False)) > 0:
if len(Str(style, False)) > 0:
if style[0]!=" ":
style = " " + style
if style.find("'") >= 0:
......@@ -31,7 +31,7 @@ if __name__ == '__main__':
if style.find('"') >= 0:
ERR(f"no quotes in style, please, got style = '{style}'")
return f"{LEFT}{isStr(tag)}{style}{RIGHT}"
return f"{LEFT}{Str(tag)}{style}{RIGHT}"
class Cmd:
__cmdstate = 0 # 0: txt, 1: cmd, 2: args
......@@ -59,11 +59,11 @@ if __name__ == '__main__':
def Ok(self):
assert Cmd.isCmd(self)
assert isInt(self.__cmdstate)>=0 and self.__cmdstate<=2
assert Int(self.__cmdstate)>=0 and self.__cmdstate<=2
isStr(self.__st, False)
isStr(self.__cmd, False)
isStr(self.__args, False)
Str(self.__st, False)
Str(self.__cmd, False)
Str(self.__args, False)
#if self.__cmdstate==0:
# assert self.__args==""
......@@ -79,7 +79,7 @@ if __name__ == '__main__':
@staticmethod
def __MkParseArg(a, checknonempty0=True, checknonempty1=True):
args = isStr(a).split(",")
args = Str(a).split(",")
assert len(args)==2
arg0 = Trim(args[0], checknonempty0)
......@@ -92,16 +92,16 @@ if __name__ == '__main__':
@staticmethod
def __MkLink(a, isstar, uselinkfilename, left, right):
if isStr(a).find(",")<=0:
if Str(a).find(",")<=0:
Dbg(verbose, f"one argument link command '{a}'..", 2)
arg0 = ""
arg1 = Trim(a)
else:
args = isStr(a).split(",")
args = Str(a).split(",")
assert len(args)==2
arg0 = isStr(args[0], False)
arg0 = Str(args[0], False)
arg1 = Trim(args[1])
if len(arg1)==0:
......@@ -145,25 +145,25 @@ if __name__ == '__main__':
else:
Dbg(verbose, f"exernal link = '{arg1}'..", 2)
extra = " rel='noopener' target='_blank'" if isBool(exlink) else ""
style = " style='font-family: courier new, courier;'" if not isBool(isstar) else ""
return f"{isStr(left)}span{style}{isStr(right)}{left}a href='{arg1}'{extra}{right}{arg0}{left}/a{right}{left}/span{right}"
extra = " rel='noopener' target='_blank'" if Bool(exlink) else ""
style = " style='font-family: courier new, courier;'" if not Bool(isstar) else ""
return f"{Str(left)}span{style}{Str(right)}{left}a href='{arg1}'{extra}{right}{arg0}{left}/a{right}{left}/span{right}"
@staticmethod
def __MkStyle(a, left, right):
arg0, arg1 = Cmd.__MkParseArg(a)
return f"{isStr(left)}span style='{arg0}'{isStr(right)}{arg1}{left}/span{right}"
return f"{Str(left)}span style='{arg0}'{Str(right)}{arg1}{left}/span{right}"
@staticmethod
def __MkImg(a, left, right):
arg0, arg1 = Cmd.__MkParseArg(a, True, False)
if arg1=="":
arg1="the-missing-link: " + arg0
return f"{isStr(left)}img src='{arg0}' alt='{arg1}'{isStr(right)}"
return f"{Str(left)}img src='{arg0}' alt='{arg1}'{Str(right)}"
@staticmethod
def __isCmd(c):
return isStr(c) in ["b", "i", "p", "pre", "dl", "dt", "dd", "em", "itemize", "enumerate", "item", "item*", "subitem", "subitem*", "header", "sub", "subsub", "indent", "code", "ipynb", "quote", "displaystyle", "displaycode", "cite"]
return Str(c) in ["b", "i", "p", "pre", "dl", "dt", "dd", "em", "itemize", "itemize*", "enumerate", "item", "item*", "subitem", "subitem*", "header", "sub", "subsub", "indent", "code", "ipynb", "quote", "displaystyle", "displaycode", "cite"]
def __MkCmd(self):
......@@ -195,6 +195,9 @@ if __name__ == '__main__':
pass
elif c=="itemize":
c = "ul"
elif c=="itemize*":
c = "ul"
style = " style='list-style-type:none;'"
elif c=="enumerate":
c = "ol"
style = " type='i'"
......@@ -269,7 +272,7 @@ if __name__ == '__main__':
def Add(self, text):
assert self.State()==2
self.__st += isStr(text)
self.__st += Str(text)
def Parse(self, c):
assert self.Ok()
......@@ -281,7 +284,7 @@ if __name__ == '__main__':
if c=='}':
self.__cmdstate = 0
assert self.__args==""
self.__args = isStr(self.__st, False)
self.__args = Str(self.__st, False)
self.__st = ""
return True, self.__MkCmd()
else:
......@@ -290,7 +293,7 @@ if __name__ == '__main__':
if c=='{':
self.__cmdstate = 2
assert self.__cmd==""
self.__cmd = isStr(self.__st)
self.__cmd = Str(self.__st)
self.__st = ""
else:
if c=='(' or c=='[':
......@@ -315,8 +318,8 @@ if __name__ == '__main__':
curr = Cmd()
st = []
for j in isList(elems):
N = len(isStr(j, False))
for j in List(elems):
N = len(Str(j, False))
for i in range(N):
Cmd.isCmd(curr)
......@@ -343,7 +346,7 @@ if __name__ == '__main__':
ERR(f"still {len(st)} elements on stack, expected zero")
txt = curr.Text()
Dbg(verbose, f"{Col('CYAN')}{isStr(txt)}{ColEnd()}", 3)
Dbg(verbose, f"{Col('CYAN')}{Str(txt)}{ColEnd()}", 3)
return txt
......@@ -351,7 +354,7 @@ if __name__ == '__main__':
r = {}
for i in refs.split("\n"):
if len(Trim(i, False))>0:
n = isStr(i).find(']')
n = Str(i).find(']')
if n<=0 or i[0]!='[':
ERR(f"refs need to be of the form '[key] value', got='{i}'")
......@@ -371,10 +374,10 @@ if __name__ == '__main__':
def ParseDefs2(defs):
r = {}
for i in isList(defs):
for i in List(defs):
d = HtmlDecode(Trim(i, False))
if len(d) > 0:
n = isStr(d).find(']')
n = Str(d).find(']')
if n<=0 or d[0]!='[':
ERR(f"refs need to be of the form '[key] value', got='{i}'")
......@@ -393,7 +396,7 @@ if __name__ == '__main__':
return r
def ParseBasetructure(courselist):
N = len(isList(courselist))
N = len(List(courselist))
if N<=0:
ERR("file seems to be empty")
......@@ -427,24 +430,24 @@ if __name__ == '__main__':
# 2: preprocess, search and replace defs
defs = {}
if isDict(s).get("DEFS"):
if Dict(s).get("DEFS"):
r =s["DEFS"]
del s["DEFS"]
defs = ParseDefs2(r)
for i in s:
n = isStr(i).find("CONTENT")
n = Str(i).find("CONTENT")
if n>0:
ERR("CONTENT tag not in column 1, but in column {n} for entry '{i}'")
elif n==0:
l = []
for line in isList(s[i]):
for line in List(s[i]):
for key in defs:
assert isStr(key)[0]==