Skip to main content
cancel
Showing results for 
Search instead for 
Did you mean: 

Microsoft is giving away 50,000 FREE Microsoft Certification exam vouchers. Get Fabric certified for FREE! Learn more

Reply
WishAskedSooner
Resolver III
Resolver III

Root-Finding Algorithm in DAX

Hi Experts!

 

I need to implement a fairly simple root finding algorithm in a DAX measure. E.g.

 

F[X(i+1)] = X(i) - F[X(i)] / F'[X(i)]

 

with the ability to loop until a convergence criteria is met e.g. ABS( F[X(i+1)] - F[X(i)] ) < 0.001. However, I am uncertain if DAX is capable if implementing loops.

 

Has anyone ever implemented such an algorithm and how did you go about doing so?

 

Thanks in advance!

1 ACCEPTED SOLUTION

Hi @Deku,

 

I did a little research and according to Russo and Ferrari, DAX does not support full recursion. It supports something called sideways recursion, but the details of that are unclear and based on what I can tell don't apply here anyway. Apparently, MDX supports full recursion, but MS left it out of DAX for performance reasons.

 

I also saw Greg Deckler's post on For Loops which is helpful, but again falls short when one requires full recursion. He has an example for the Fibonacci series, but it is hack versus an actual solution.

 

PowerQuery is not an option either because this is a user interaction requirement.

 

All this brings me to my final point.

 

I have been using PBI over a year now, and while DAX/Vertipaq are powerful tools, in my estimation, the lack of full recursion puts PBI plainly in the category of a reporting tool only which severely handicaps its potential applications. And, I think developers need to be aware of this before considering using PBI for anything other than reporting.

 

I believe I can still cook up a workaround that follows Greg Deckler's Fibonacci series example, but I am not 100% certain, and it will certainly be a compromise at the end of the day.

 

Anyway, I am marking this reply as the solution unless someone comes in with another.

View solution in original post

5 REPLIES 5
Deku
Community Champion
Community Champion

You can perform loops by using generateseries() to tuple of values which you can iterate with addcolumns(). I think you want to pass the value from each iteration into the next, which I don't think is possible


Did I answer your question?
Please help by clicking the thumbs up button and mark my post as a solution!

@Deku Thank you for your insightful reply.

 

If I understand correctly, this requirement isn't possible using DAX?

I believe so. Might be possible in powerquery


Did I answer your question?
Please help by clicking the thumbs up button and mark my post as a solution!

Hi @Deku,

 

I did a little research and according to Russo and Ferrari, DAX does not support full recursion. It supports something called sideways recursion, but the details of that are unclear and based on what I can tell don't apply here anyway. Apparently, MDX supports full recursion, but MS left it out of DAX for performance reasons.

 

I also saw Greg Deckler's post on For Loops which is helpful, but again falls short when one requires full recursion. He has an example for the Fibonacci series, but it is hack versus an actual solution.

 

PowerQuery is not an option either because this is a user interaction requirement.

 

All this brings me to my final point.

 

I have been using PBI over a year now, and while DAX/Vertipaq are powerful tools, in my estimation, the lack of full recursion puts PBI plainly in the category of a reporting tool only which severely handicaps its potential applications. And, I think developers need to be aware of this before considering using PBI for anything other than reporting.

 

I believe I can still cook up a workaround that follows Greg Deckler's Fibonacci series example, but I am not 100% certain, and it will certainly be a compromise at the end of the day.

 

Anyway, I am marking this reply as the solution unless someone comes in with another.

Sideways recursion is referencing calculation items from calaculation items in the same calculation group


Did I answer your question?
Please help by clicking the thumbs up button and mark my post as a solution!

Helpful resources

Announcements
Notebook Gallery Carousel1

NEW! Community Notebooks Gallery

Explore and share Fabric Notebooks to boost Power BI insights in the new community notebooks gallery.

April2025 Carousel

Fabric Community Update - April 2025

Find out what's new and trending in the Fabric community.

"); $(".slidesjs-pagination" ).prependTo(".pagination_sec"); $(".slidesjs-pagination" ).append("
"); $(".slidesjs-play.slidesjs-navigation").appendTo(".playpause_sec"); $(".slidesjs-stop.slidesjs-navigation").appendTo(".playpause_sec"); $(".slidesjs-pagination" ).append(""); $(".slidesjs-pagination" ).append(""); } catch(e){ } /* End: This code is added by iTalent as part of iTrack COMPL-455 */ $(".slidesjs-previous.slidesjs-navigation").attr('tabindex', '0'); $(".slidesjs-next.slidesjs-navigation").attr('tabindex', '0'); /* start: This code is added by iTalent as part of iTrack 1859082 */ $('.slidesjs-play.slidesjs-navigation').attr('id','playtitle'); $('.slidesjs-stop.slidesjs-navigation').attr('id','stoptitle'); $('.slidesjs-play.slidesjs-navigation').attr('role','tab'); $('.slidesjs-stop.slidesjs-navigation').attr('role','tab'); $('.slidesjs-play.slidesjs-navigation').attr('aria-describedby','tip1'); $('.slidesjs-stop.slidesjs-navigation').attr('aria-describedby','tip2'); /* End: This code is added by iTalent as part of iTrack 1859082 */ }); $(document).ready(function() { if($("#slides .item").length < 2 ) { /* Fixing Single Slide click issue (commented following code)*/ // $(".item").css("left","0px"); $(".item.slidesjs-slide").attr('style', 'left:0px !important'); $(".slidesjs-stop.slidesjs-navigation").trigger('click'); $(".slidesjs-previous").css("display", "none"); $(".slidesjs-next").css("display", "none"); } var items_length = $(".item.slidesjs-slide").length; $(".slidesjs-pagination-item > button").attr("aria-setsize",items_length); $(".slidesjs-next, .slidesjs-pagination-item button").attr("tabindex","-1"); $(".slidesjs-pagination-item button").attr("role", "tab"); $(".slidesjs-previous").attr("tabindex","-1"); $(".slidesjs-next").attr("aria-hidden","true"); $(".slidesjs-previous").attr("aria-hidden","true"); $(".slidesjs-next").attr("aria-label","Next"); $(".slidesjs-previous").attr("aria-label","Previous"); //$(".slidesjs-stop.slidesjs-navigation").attr("role","button"); //$(".slidesjs-play.slidesjs-navigation").attr("role","button"); $(".slidesjs-pagination").attr("role","tablist").attr("aria-busy","true"); $("li.slidesjs-pagination-item").attr("role","list"); $(".item.slidesjs-slide").attr("tabindex","-1"); $(".item.slidesjs-slide").attr("aria-label","item"); /*$(".slidesjs-stop.slidesjs-navigation").on('click', function() { var itemNumber = parseInt($('.slidesjs-pagination-item > a.active').attr('data-slidesjs-item')); $($('.item.slidesjs-slide')[itemNumber]).find('.c-call-to-action').attr('tabindex', '0'); });*/ $(".slidesjs-stop.slidesjs-navigation, .slidesjs-pagination-item > button").on('click keydown', function() { $.each($('.item.slidesjs-slide'),function(i,el){ $(el).find('.c-call-to-action').attr('tabindex', '-1'); }); var itemNumber = parseInt($('.slidesjs-pagination-item > button.active').attr('data-slidesjs-item')); $($('.item.slidesjs-slide')[itemNumber]).find('.c-call-to-action').attr('tabindex', '0'); }); $(".slidesjs-play.slidesjs-navigation").on('click', function() { $.each($('.item.slidesjs-slide'),function(i,el){ $(el).find('.c-call-to-action').attr('tabindex', '-1'); }); }); $(".slidesjs-pagination-item button").keyup(function(e){ var keyCode = e.keyCode || e.which; if (keyCode == 9) { e.preventDefault(); $(".slidesjs-stop.slidesjs-navigation").trigger('click').blur(); $("button.active").focus(); } }); $(".slidesjs-play").on("click",function (event) { if (event.handleObj.type === "click") { $(".slidesjs-stop").focus(); } else if(event.handleObj.type === "keydown"){ if (event.which === 13 && $(event.target).hasClass("slidesjs-play")) { $(".slidesjs-stop").focus(); } } }); $(".slidesjs-stop").on("click",function (event) { if (event.handleObj.type === "click") { $(".slidesjs-play").focus(); } else if(event.handleObj.type === "keydown"){ if (event.which === 13 && $(event.target).hasClass("slidesjs-stop")) { $(".slidesjs-play").focus(); } } }); $(".slidesjs-pagination-item").keydown(function(e){ switch (e.which){ case 37: //left arrow key $(".slidesjs-previous.slidesjs-navigation").trigger('click'); e.preventDefault(); break; case 39: //right arrow key $(".slidesjs-next.slidesjs-navigation").trigger('click'); e.preventDefault(); break; default: return; } $(".slidesjs-pagination-item button.active").focus(); }); }); // Start This code is added by iTalent as part of iTrack 1859082 $(document).ready(function(){ $("#tip1").attr("aria-hidden","true").addClass("hidden"); $("#tip2").attr("aria-hidden","true").addClass("hidden"); $(".slidesjs-stop.slidesjs-navigation, .slidesjs-play.slidesjs-navigation").attr('title', ''); $("a#playtitle").focus(function(){ $("#tip1").attr("aria-hidden","false").removeClass("hidden"); }); $("a#playtitle").mouseover(function(){ $("#tip1").attr("aria-hidden","false").removeClass("hidden"); }); $("a#playtitle").blur(function(){ $("#tip1").attr("aria-hidden","true").addClass("hidden"); }); $("a#playtitle").mouseleave(function(){ $("#tip1").attr("aria-hidden","true").addClass("hidden"); }); $("a#play").keydown(function(ev){ if (ev.which ==27) { $("#tip1").attr("aria-hidden","true").addClass("hidden"); ev.preventDefault(); return false; } }); $("a#stoptitle").focus(function(){ $("#tip2").attr("aria-hidden","false").removeClass("hidden"); }); $("a#stoptitle").mouseover(function(){ $("#tip2").attr("aria-hidden","false").removeClass("hidden"); }); $("a#stoptitle").blur(function(){ $("#tip2").attr("aria-hidden","true").addClass("hidden"); }); $("a#stoptitle").mouseleave(function(){ $("#tip2").attr("aria-hidden","true").addClass("hidden"); }); $("a#stoptitle").keydown(function(ev){ if (ev.which ==27) { $("#tip2").attr("aria-hidden","true").addClass("hidden"); ev.preventDefault(); return false; } }); }); // End This code is added by iTalent as part of iTrack 1859082
Top Solution Authors