Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
E
edx-platform
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
edx
edx-platform
Commits
5d6c5de8
Commit
5d6c5de8
authored
Jan 22, 2013
by
ichuang
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #1324 from MITx/pbaratta/symmath
Added some symmath comments
parents
26f7b984
45f2a690
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
46 additions
and
7 deletions
+46
-7
lms/lib/symmath/formula.py
+12
-4
lms/lib/symmath/symmath_check.py
+34
-3
No files found.
lms/lib/symmath/formula.py
View file @
5d6c5de8
...
...
@@ -154,8 +154,9 @@ def my_sympify(expr, normphase=False, matrix=False, abcsym=False, do_qubit=False
class
formula
(
object
):
'''
Representation of a mathematical formula object. Accepts mathml math expression for constructing,
and can produce sympy translation. The formula may or may not include an assignment (=).
Representation of a mathematical formula object. Accepts mathml math expression
for constructing, and can produce sympy translation. The formula may or may not
include an assignment (=).
'''
def
__init__
(
self
,
expr
,
asciimath
=
''
,
options
=
None
):
self
.
expr
=
expr
.
strip
()
...
...
@@ -194,8 +195,12 @@ class formula(object):
def
preprocess_pmathml
(
self
,
xml
):
'''
Pre-process presentation MathML from ASCIIMathML to make it more acceptable for SnuggleTeX, and also
to accomodate some sympy conventions (eg hat(i) for
\
hat{i}).
Pre-process presentation MathML from ASCIIMathML to make it more
acceptable for SnuggleTeX, and also to accomodate some sympy
conventions (eg hat(i) for
\
hat{i}).
This method would be a good spot to look for an integral and convert
it, if possible...
'''
if
type
(
xml
)
==
str
or
type
(
xml
)
==
unicode
:
...
...
@@ -266,6 +271,9 @@ class formula(object):
'''
Return sympy expression for the math formula.
The math formula is converted to Content MathML then that is parsed.
This is a recursive function, called on every CMML node. Support for
more functions can be added by modifying opdict, abould halfway down
'''
if
self
.
the_sympy
:
return
self
.
the_sympy
...
...
lms/lib/symmath/symmath_check.py
View file @
5d6c5de8
...
...
@@ -157,13 +157,33 @@ def symmath_check(expect, ans, dynamath=None, options=None, debug=None, xml=None
'''
Check a symbolic mathematical expression using sympy.
The input may be presentation MathML. Uses formula.
This is the default Symbolic Response checking function
Desc of args:
expect is a sympy string representing the correct answer. It is interpreted
using my_sympify (from formula.py), which reads strings as sympy input
(e.g. 'integrate(x^2, (x,1,2))' would be valid, and evaluate to give 1.5)
ans is student-typed answer. It is expected to be ascii math, but the code
below would support a sympy string.
dynamath is the PMathML string converted by MathJax. It is used if
evaluation with ans is not sufficient.
options is a string with these possible substrings, set as an xml property
of the problem:
-matrix - make a sympy matrix, rather than a list of lists, if possible
-qubit - passed to my_sympify
-imaginary - used in formla, presumably to signal to use i as sqrt(-1)?
-numerical - force numerical comparison.
'''
msg
=
''
# msg += '<p/>abname=%s' % abname
# msg += '<p/>adict=%s' % (repr(adict).replace('<','<'))
threshold
=
1.0e-3
threshold
=
1.0e-3
# for numerical comparison (also with matrices)
DEBUG
=
debug
if
xml
is
not
None
:
...
...
@@ -184,13 +204,17 @@ def symmath_check(expect, ans, dynamath=None, options=None, debug=None, xml=None
msg
+=
'<p>Error
%
s in parsing OUR expected answer "
%
s"</p>'
%
(
err
,
expect
)
return
{
'ok'
:
False
,
'msg'
:
make_error_message
(
msg
)}
###### Sympy input #######
# if expected answer is a number, try parsing provided answer as a number also
try
:
fans
=
my_sympify
(
str
(
ans
),
matrix
=
do_matrix
,
do_qubit
=
do_qubit
)
except
Exception
,
err
:
fans
=
None
if
hasattr
(
fexpect
,
'is_number'
)
and
fexpect
.
is_number
and
fans
and
hasattr
(
fans
,
'is_number'
)
and
fans
.
is_number
:
# do a numerical comparison if both expected and answer are numbers
if
(
hasattr
(
fexpect
,
'is_number'
)
and
fexpect
.
is_number
and
fans
and
hasattr
(
fans
,
'is_number'
)
and
fans
.
is_number
):
if
abs
(
abs
(
fans
-
fexpect
)
/
fexpect
)
<
threshold
:
return
{
'ok'
:
True
,
'msg'
:
msg
}
else
:
...
...
@@ -208,6 +232,8 @@ def symmath_check(expect, ans, dynamath=None, options=None, debug=None, xml=None
msg
+=
'<p>You entered:
%
s</p>'
%
to_latex
(
fans
)
return
{
'ok'
:
True
,
'msg'
:
msg
}
###### PMathML input ######
# convert mathml answer to formula
try
:
if
dynamath
:
...
...
@@ -216,6 +242,7 @@ def symmath_check(expect, ans, dynamath=None, options=None, debug=None, xml=None
mmlans
=
None
if
not
mmlans
:
return
{
'ok'
:
False
,
'msg'
:
'[symmath_check] failed to get MathML for input; dynamath=
%
s'
%
dynamath
}
f
=
formula
(
mmlans
,
options
=
options
)
# get sympy representation of the formula
...
...
@@ -238,7 +265,7 @@ def symmath_check(expect, ans, dynamath=None, options=None, debug=None, xml=None
msg
+=
'<hr>'
return
{
'ok'
:
False
,
'msg'
:
make_error_message
(
msg
)}
#
compare
with expected
#
do numerical comparison
with expected
if
hasattr
(
fexpect
,
'is_number'
)
and
fexpect
.
is_number
:
if
hasattr
(
fsym
,
'is_number'
)
and
fsym
.
is_number
:
if
abs
(
abs
(
fsym
-
fexpect
)
/
fexpect
)
<
threshold
:
...
...
@@ -250,6 +277,10 @@ def symmath_check(expect, ans, dynamath=None, options=None, debug=None, xml=None
# msg += "<p>cmathml = <pre>%s</pre></p>" % str(f.cmathml).replace('<','<')
return
{
'ok'
:
False
,
'msg'
:
make_error_message
(
msg
)}
# Here is a good spot for adding calls to X.simplify() or X.expand(),
# allowing equivalence over binomial expansion or trig identities
# exactly the same?
if
fexpect
==
fsym
:
return
{
'ok'
:
True
,
'msg'
:
msg
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment