The Herbie API allows applications to interface with Herbie using HTTP requests. The API is designed to be stateless: the order in which endpoints are called shouldn't matter.
All the endpoints listed below respond to POST requests unless otherwise specified. A typical example of sending a POST request to a running Herbie server is:
curl -d \ '{"formula": "(FPCore (x) (- (sqrt (+ x 1))))", "seed": 5}' \ -H 'Content-Type: application/json' \ http://127.0.0.1:8000/api/sample
Request:
{ formula: <FPCore expression>, seed: <random seed for point generation> }
Response:
{ points: [[point, exact], ... ] }
The sample
endpoint allows the user to request a
sample of points given the FPCore expression and a seed.
Returns a collection of points and the exact evaluation of each
point with the given spec. The results are returned through the
"points" field and are represented by an array of point-exact
pairs with the first value representing the point and the second
value representing the exact evaluation; the exact value of
point n
is points[n][1]
.
Herbie calculates the "ground truth" by calculating the values with more precise numbers. This can be slow.
Request:
{ formula: <FPCore expression>, sample: [point, ... ] }
Response:
{ points: [[point, exact], ... ] }
The exacts
endpoint allows the user to request the
exact value of a set of points evaluated at a real number
specification given as an FPCore expression.
Some points may not be calculable given the FPCore expression.
Returns a collection of points and the exact evaluation of each
point with the given spec. The results are returned through the
"points" field and are represented by an array of point-exact
pairs with the first value representing the point and the second
value representing the exact evaluation; the exact value of
point n
is points[n][1]
.
Herbie calculates the "ground truth" by calculating the values with more precise numbers. This can be slow.
Request:
{ formula: <FPCore expression>, sample: [point ... ] }
Response:
{ points: [[point, exact], ... ] }
The calculate
endpoint allows the user to request
the evaluation of a set of points evaluated at a floating-point
implementation given as an FPCore expression.
Some points may not be calculable given the FPCore expression.
Returns a collection of points and the evaluation of each point
using the given FPCore as a floating-point implementation. The
results are returned through the "points" field and are
represented by an array of point-exact pairs with the first value
representing the point and the second value representing the
evaluated value; the evaluated value of point n
is points[n][1]
.
Request:
{ formula: <FPCore expression>, sample: [[point, exact], ... ] }
Response:
{ points: [[point, error], ... ] }
The analyze
endpoint allows the user to request
error analysis of a set of point-exact pairs and a given
floating-point implementation.
Given a collection of points, their exact values, and an FPCore
expression to analyze on, the analyze
endpoint
returns the error for each point for that expression. The error
value returned is Herbie's internal error heuristic.
Request:
{ formula: <FPCore expression>, sample: [[point, exact], ... ] }
Response:
{ alternatives: [alt, ... ], histories: [history, ... ], splitpoints: [splitpoint, ... ] }
The alternatives
endpoint allows the user to
request rewrites from Herbie given an expression to rewrite and a
set of point-exact pairs.
Returns a list of alternatives represented by FPCore expressions through the "alternatives" field.
Returns a list of derivations of each alternative through the
"histories" field where history[n]
corresponds
to alternatives[n]
.
Returns a list of splitpoints for each alternative through the
"splitpoints" field where splitpoints[n]
corresponds
to alternatives[n]
. splitpoints[n]
will
only contain information about the corresponding alternative.s
splitpoints if the alternative is a branch-expression.
Request:
{ formula: <FPCore expression> }
Response:
{ mathjs: <mathjs expression> }
The mathjs
endpoint allows the user to translate
FPCore expressions into mathjs expressions.
Request:
{ formula: <FPCore expression>, sample: [point ... ] }
Response:
{ cost: cost }
Specific Example: sqrt(x+1)-sqrt(x)
Request:
{ formula: <(FPCore (x) (- (sqrt (+ x 1)) (sqrt x)))>, sample: [ [[1], -1.4142135623730951] ] }
Response:
{ cost: 13120 }
Lower-Cost Example: (x+1)-(x)
Request:
{ formula: <(FPCore (x) (- (+ x 1 ) x))>, sample: [ [[1], -1.4142135623730951] ] }
Response:
{ cost: 320 }
The cost
endpoint allows the user to request
the evaluation of an expression's overall cost. Cost is
calculated depending on the complexity of operations contained
in the expression.
Given an FPCore expression and a collection of points, returns the cost of the expression. The cost value returned is calculated internally by Herbie.
The points should be of the same format as the points generated in the sample endpoint. Refer to /api/sample for more details.
Note the sample points are not used in the cost calculation. The contents of the points do not matter as long as they are in the correct format as mentioned above.
Request:
{ formula: <FPCore expression>, language: "language" }
Response:
{ result: "translated expression" }
Specific Example: sqrt(x+1)-sqrt(x)
Request:
{ formula: <(FPCore (x) (- (sqrt (+ x 1)) (sqrt x)))>, language: "python" }
Response:
{ result: "def expr(x): return math.sqrt((x + 1.0)) - math.sqrt(x)" }
The translate
endpoint allows users to translate
FPCore expressions into equivalent expressions in various programming
languages.
Given an FPCore expression and a target language, this endpoint returns the translated expression in the specified language. The language parameter should be a string representing the desired programming language. The response includes the translated expression.
Currently supported languages are: python
, c
,
fortran
, java
, julia
, matlab
,
wls
, tex
, and js
.
The endpoints below are currently a work in progress.
Retrieves the timeline
data for a given API call. You may find the job id in either the JSON response or in the headers of the HTTP response for of the endpoints in Herbie.
The timeline is an exception to the others in that it uses a GET request. Below is a sample of what the request might look like. You may consult the /infra/testApi.mjs
file for current examples of how to use this API.
curl -X GET \ http://127.0.0.1:8000/api/timeline/0b95161a77fc3e29376bbb013d96c2827e2a1cd7