Including BSDLicenced code in Inkscape
Hi,
TLDR: I want to include 3clause BSD licenced code in Inkscape.
I want to improve curve fitting in Inkscape. I was told that Inkscape uses the GSL for root finding etc. so I thought I might implement curve fitting using the headers <gsl/gsl_multifit_nlinear.h>
This works but I'd like to improve it by providing derivatives to the solver instead of relying on numerical differentiation. I researched Autodiff tools and found that most require libraries which are difficult to build on windows. At work I use Ceres solver. I extracted the autodiff code (jet.h) from the source code and modified slightly so it works without futher dependencies.
Ceres is licenced under the 3clause BSD licence: http://ceressolver.org/license.html
May I include the modified source code in Inkscape?
Best Regards, Alexander
It seems to me that, from the license compatibility perspective that's ok.
I'm not sure, though, if bundling a derivative of a library is a good idea, since it can potentially be left without updates in sync with upstream in the long run.
Maybe your improvements to the library could be accepted upstream first?
20161130 10:27 GMT02:00 Alexander Brock <a.brock@...2965...>:
Hi,
TLDR: I want to include 3clause BSD licenced code in Inkscape.
I want to improve curve fitting in Inkscape. I was told that Inkscape uses the GSL for root finding etc. so I thought I might implement curve fitting using the headers <gsl/gsl_multifit_nlinear.h>
This works but I'd like to improve it by providing derivatives to the solver instead of relying on numerical differentiation. I researched Autodiff tools and found that most require libraries which are difficult to build on windows. At work I use Ceres solver. I extracted the autodiff code (jet.h) from the source code and modified slightly so it works without futher dependencies.
Ceres is licenced under the 3clause BSD licence: http://ceressolver.org/license.html
May I include the modified source code in Inkscape?
Best Regards, Alexander
Inkscapedevel mailing list Inkscapedevel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/inkscapedevel
On 11/30/2016 01:41 PM, Felipe Sanches wrote:
It seems to me that, from the license compatibility perspective that's ok.
I'm not sure, though, if bundling a derivative of a library is a good idea, since it can potentially be left without updates in sync with upstream in the long run.
I could use the original file if I copy two more (very small) headers from ceres, this would mean that Inkscape depends on Eigen (a headeronly library for linear algebra).
Making Inkscape depend on Ceres would make implementation of optimization more comfortable and make all that copying unnecessary but building on Windows seem complicated: http://ceressolver.org/building.html#windows
Maybe your improvements to the library could be accepted upstream first?
Unlikely, I simply stripped the Eigen dependency and removed the ability to calculate higherorder derivatives. The file itself is a very simple file, most parts were written 2012/2013 according to git blame, it's essentially an implementation of a vector with very special rules for operations +*/ and some functions like exp, tan etc.
Best Regards, Alexander
License wise (IANAL) the BSDNew license is compatible with the GPL2+/3+ we're currently using for Inkscape.
The code would then be distributed as GPL in the whole project.
Technical issues are the only ones that need discussion I think.
Best Regards, Martin Owens
On Wed, 20161130 at 13:27 +0100, Alexander Brock wrote:
Hi,
TLDR: I want to include 3clause BSD licenced code in Inkscape.
I want to improve curve fitting in Inkscape. I was told that Inkscape uses the GSL for root finding etc. so I thought I might implement curve fitting using the headers <gsl/gsl_multifit_nlinear.h>
This works but I'd like to improve it by providing derivatives to the solver instead of relying on numerical differentiation. I researched Autodiff tools and found that most require libraries which are difficult to build on windows. At work I use Ceres solver. I extracted the autodiff code (jet.h) from the source code and modified slightly so it works without futher dependencies.
Ceres is licenced under the 3clause BSD licence: http://ceressolver.org/license.html
May I include the modified source code in Inkscape?
Best Regards, Alexander
Inkscapedevel mailing list Inkscapedevel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/inkscapedevel
Hi,
I added a curve fitting algorithm to 2geom which takes a std::vector of Geom::Point and fits a Geom::CubicBezier to the points.
It fits (nondegenerate) cubic bezier curves to given points within half a millisecond up to an error of 1e9.
You can find it here: https://github.com/abrock/lib2geom
In src/test/bezierfittest.cpp I made three simple tests, one "normal" curve and two (nearly) degenerate curves with (nearly) colinear points. I create a Cubic Bezier, select 20 points and give these to the fitting function (which doesn't know the original curve).
Results:
Normal Curve: Speed: 2678 curves per second Worst error: 1.31799e10 at t=0.736842
Degenerate Curve: New method: 1567.89 curves per second Worst error: 6.84045e09 at t=0.110945
Nearly degenerate curve: New method: 534.738 curves per second Worst error: 0.0284499 at t=0.0958247
in src/2geom/bezierutils.cpp are the new functions:
 fit_bezier sets up the nonlinear least squares problem
Helper functions:  bezierfit_f calculates residuals  bezierfit_df calculates derivatives of residuals  bezier_distance helps calculating derivatives, it mainly contains a templated evaluation of Cubic Bezier functions.
src/2geom/jet.h contains the implementation of dual numbers I copied from the Ceres source code
Best Regards, Alexander
Hi Alexander,
Looks interesting.
As you are proposing this as an addition to lib2geom, the proper place to discuss this is on the lib2geomdevel list (lib2geom is a semi independent project):
lib2geomdevel@lists.sourceforge.net
Tav
Hi,
I added a curve fitting algorithm to 2geom which takes a std::vector of Geom::Point and fits a Geom::CubicBezier to the points.
It fits (nondegenerate) cubic bezier curves to given points within half a millisecond up to an error of 1e9.
You can find it here: https://github.com/abrock/lib2geom
In src/test/bezierfittest.cpp I made three simple tests, one "normal" curve and two (nearly) degenerate curves with (nearly) colinear points. I create a Cubic Bezier, select 20 points and give these to the fitting function (which doesn't know the original curve).
Results:
Normal Curve: Speed: 2678 curves per second Worst error: 1.31799e10 at t=0.736842
Degenerate Curve: New method: 1567.89 curves per second Worst error: 6.84045e09 at t=0.110945
Nearly degenerate curve: New method: 534.738 curves per second Worst error: 0.0284499 at t=0.0958247
in src/2geom/bezierutils.cpp are the new functions:
 fit_bezier sets up the nonlinear least squares problem
Helper functions:
 bezierfit_f calculates residuals
 bezierfit_df calculates derivatives of residuals
 bezier_distance helps calculating derivatives, it mainly contains a
templated evaluation of Cubic Bezier functions.
src/2geom/jet.h contains the implementation of dual numbers I copied from the Ceres source code
Best Regards, Alexander
Inkscapedevel mailing list Inkscapedevel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/inkscapedevel
If we can just constrain the code licence to match the 2geom one, I think everything is fine, otherwise I guess we could include separate licencing for just this piece of code.
I'm happy to do a code review if you remind me in a few weeks.
njh
On Thu, Dec 01, 2016 at 07:52:06AM +0100, Tavmjong Bah wrote:
Hi Alexander,
Looks interesting.
As you are proposing this as an addition to lib2geom, the proper place to discuss this is on the lib2geomdevel list (lib2geom is a semi independent project):
lib2geomdevel@lists.sourceforge.net
Tav
Hi,
I added a curve fitting algorithm to 2geom which takes a std::vector of Geom::Point and fits a Geom::CubicBezier to the points.
It fits (nondegenerate) cubic bezier curves to given points within half a millisecond up to an error of 1e9.
You can find it here: https://github.com/abrock/lib2geom
In src/test/bezierfittest.cpp I made three simple tests, one "normal" curve and two (nearly) degenerate curves with (nearly) colinear points. I create a Cubic Bezier, select 20 points and give these to the fitting function (which doesn't know the original curve).
Results:
Normal Curve: Speed: 2678 curves per second Worst error: 1.31799e10 at t=0.736842
Degenerate Curve: New method: 1567.89 curves per second Worst error: 6.84045e09 at t=0.110945
Nearly degenerate curve: New method: 534.738 curves per second Worst error: 0.0284499 at t=0.0958247
in src/2geom/bezierutils.cpp are the new functions:
 fit_bezier sets up the nonlinear least squares problem
Helper functions:
 bezierfit_f calculates residuals
 bezierfit_df calculates derivatives of residuals
 bezier_distance helps calculating derivatives, it mainly contains a
templated evaluation of Cubic Bezier functions.
src/2geom/jet.h contains the implementation of dual numbers I copied from the Ceres source code
Best Regards, Alexander
Inkscapedevel mailing list Inkscapedevel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/inkscapedevel
Inkscapedevel mailing list Inkscapedevel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/inkscapedevel
participants (5)

Alexander Brock

Felipe Sanches

Martin Owens

Nathan Hurst

Tavmjong Bah