Skip to content

Commit 8eb8386

Browse files
committed
Fix issue 205 and add prakriya tests
1 parent 3541b2d commit 8eb8386

File tree

4 files changed

+127
-34
lines changed

4 files changed

+127
-34
lines changed

vidyut-prakriya/src/angasya/abhyasasya.rs

Lines changed: 49 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -249,23 +249,59 @@ fn try_general_rules(p: &mut Prakriya, i: usize) -> Option<()> {
249249
p.run_at("7.4.68", i, op::text("viT"));
250250
}
251251

252-
let abhyasa = p.get(i)?;
253-
if abhyasa.has_adi(SHAR) && abhyasa.has_at(1, KHAY) {
254-
let abhyasa = &mut p.get_mut(i)?;
255-
let res = try_shar_purva(&abhyasa.text);
256-
if res != abhyasa.text {
257-
abhyasa.text = res;
258-
p.step("7.4.61");
252+
let mut abhyasa_has_changed = true;
253+
let mut current_abhyasa_text;
254+
255+
// The transformations prescribed in abhyasa angakarya
256+
// seem to be designed to converge on repetition. This may be the
257+
// vivakshA
258+
while abhyasa_has_changed {
259+
let abhyasa = p.get(i)?;
260+
current_abhyasa_text = abhyasa.text.clone();
261+
262+
if abhyasa.has_adi(SHAR) && abhyasa.has_at(1, KHAY) {
263+
let abhyasa = p.get_mut(i)?;
264+
let res = try_shar_purva(&abhyasa.text);
265+
if res != abhyasa.text {
266+
abhyasa.text = res;
267+
p.step("7.4.61");
268+
}
269+
} else {
270+
let abhyasa = p.get_mut(i)?;
271+
let res = try_haladi(&abhyasa.text);
272+
if res != abhyasa.text {
273+
abhyasa.text = res;
274+
p.step("7.4.60");
275+
}
259276
}
260-
} else {
261-
let abhyasa = &mut p.get_mut(i)?;
262-
let res = try_haladi(&abhyasa.text);
263-
if res != abhyasa.text {
264-
abhyasa.text = res;
265-
p.step("7.4.60");
277+
278+
if p.has(i, |t| t.has_antya('f') || t.has_antya('F')) {
279+
p.run_at("7.4.66", i, op::antya("a"));
280+
p.run_at("1.1.51", i, op::antya("ar"));
281+
}
282+
283+
// no-hrasva is for pA --> apIpyat.
284+
let abhyasa = p.get(i)?;
285+
if al::is_dirgha(abhyasa.antya()?) && !abhyasa.has_tag(T::FlagNoHrasva) {
286+
let val = al::to_hrasva(abhyasa.antya()?)?;
287+
p.run_at("7.4.59", i, op::antya_char(&val));
288+
}
289+
290+
let dhatu = p.get(i_dhatu)?;
291+
let last = p.terms().last()?;
292+
if dhatu.has_u("i\\R") && last.has_tag(T::kit) && last.has_lakara(Lit) {
293+
// IyatuH, IyuH
294+
p.run_at("7.4.69", i, op::adi("I"));
295+
}
296+
297+
let abhyasa = p.get_mut(i)?;
298+
if abhyasa.text == current_abhyasa_text {
299+
abhyasa_has_changed = false;
266300
}
267301
}
268302

303+
// Keeping this outside the loop as this needs to be done only once
304+
// after abhyasa has converged.
269305
let abhyasa = p.get(i)?;
270306
let dhatu = p.get(i_dhatu)?;
271307
if let Some(val) = KUH_CU
@@ -279,25 +315,6 @@ fn try_general_rules(p: &mut Prakriya, i: usize) -> Option<()> {
279315
p.run_at("7.4.62", i, |t| t.set_adi_char(val));
280316
}
281317
}
282-
283-
// no-hrasva is for pA --> apIpyat.
284-
let abhyasa = p.get(i)?;
285-
if al::is_dirgha(abhyasa.antya()?) && !abhyasa.has_tag(T::FlagNoHrasva) {
286-
let val = al::to_hrasva(abhyasa.antya()?)?;
287-
p.run_at("7.4.59", i, op::antya_char(&val));
288-
}
289-
290-
if p.has(i, |t| t.has_antya('f')) {
291-
p.run_at("7.4.66", i, op::antya("a"));
292-
}
293-
294-
let dhatu = p.get(i_dhatu)?;
295-
let last = p.terms().last()?;
296-
if dhatu.has_u("i\\R") && last.has_tag(T::kit) && last.has_lakara(Lit) {
297-
// IyatuH, IyuH
298-
p.run_at("7.4.69", i, op::adi("I"));
299-
}
300-
301318
Some(())
302319
}
303320

vidyut-prakriya/tests/integration/kashika_7_4.rs

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -694,7 +694,22 @@ fn sutra_7_4_66() {
694694
assert_has_lit(&[], &d("vftu~\\", Bhvadi), &["vavfte"]);
695695
assert_has_lit(&[], &d("vfDu~\\", Bhvadi), &["vavfDe"]);
696696
assert_has_lit(&[], &d("SfDu~\\", Bhvadi), &["SaSfDe"]);
697-
// TODO: yaNluk examples.
697+
698+
assert_has_lat(
699+
&[],
700+
&yan_luk(&d("nftI~", Divadi)),
701+
&[
702+
"narInarti",
703+
"narInartti",
704+
"narInftIti",
705+
"narinarti",
706+
"narinartti",
707+
"narinftIti",
708+
"narnarti",
709+
"narnartti",
710+
"narnftIti",
711+
],
712+
);
698713
}
699714

700715
#[test]

vidyut-prakriya/tests/integration/prakriyas.rs

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -235,3 +235,64 @@ fn edha() {
235235
let p = ps.iter().find(|p| p.text() == "eDA").unwrap();
236236
assert_matches_prakriya(p, &[(A("6.1.101"), vec!["eD", "A", "", ""])]);
237237
}
238+
239+
// Fixes https://github.com/ambuda-org/vidyut/issues/205
240+
//
241+
// Tests validate that the prakriya has 7.4.66 immediately followed by 1.1.51 as "nitya"
242+
// and that the resultant outputs are as expected for ऋकारान्त dhatus i.e. 'f' and 'F'
243+
#[test]
244+
#[allow(non_snake_case)]
245+
fn cakAra_etc() {
246+
use Rule::Ashtadhyayi as A;
247+
248+
let args = tip_args(d("qukf\\Y", Tanadi), Lit);
249+
let t = Tester::default();
250+
let ps = t.derive_tinantas(&args);
251+
let p = ps.iter().find(|p| p.text() == "cakAra").unwrap();
252+
253+
assert_matches_prakriya(
254+
p,
255+
&[
256+
(A("7.2.115"), vec!["kf", "kAr", "a"]),
257+
(A("7.4.66"), vec!["ka", "kAr", "a"]),
258+
(A("1.1.51"), vec!["kar", "kAr", "a"]),
259+
(A("7.4.60"), vec!["ka", "kAr", "a"]),
260+
(A("7.4.62"), vec!["ca", "kAr", "a"]),
261+
],
262+
);
263+
264+
// "f" is not in the end
265+
let args = tip_args(d("kfpa~\\", Bhvadi), Lit);
266+
let ps = t.derive_tinantas(&args);
267+
let p = ps.iter().find(|p| p.text() == "cakxpe").unwrap();
268+
269+
assert_matches_prakriya(
270+
p,
271+
&[
272+
(A("1.1.5"), vec!["kfp", "kfp", "e"]),
273+
(A("7.4.60"), vec!["kf", "kfp", "e"]),
274+
(A("7.4.66"), vec!["ka", "kfp", "e"]),
275+
(A("1.1.51"), vec!["kar", "kfp", "e"]),
276+
(A("7.4.60"), vec!["ka", "kfp", "e"]),
277+
(A("7.4.62"), vec!["ca", "kfp", "e"]),
278+
(A("8.2.18"), vec!["ca", "kxp", "e"]),
279+
],
280+
);
281+
282+
// Try with dhatu having "F"
283+
let args = tip_args(d("stFY", Kryadi), Lit);
284+
let ps = t.derive_tinantas(&args);
285+
let p = ps.iter().find(|p| p.text() == "tastare").unwrap();
286+
assert_matches_prakriya(
287+
p,
288+
&[
289+
(A("1.1.5"), vec!["stF", "stF", "e"]),
290+
(A("7.4.11"), vec!["stF", "star", "e"]),
291+
(A("7.4.61"), vec!["tF", "star", "e"]),
292+
(A("7.4.66"), vec!["ta", "star", "e"]),
293+
(A("1.1.51"), vec!["tar", "star", "e"]),
294+
(A("7.4.60"), vec!["ta", "star", "e"]),
295+
(A("6.4.126"), vec!["ta", "star", "e"]),
296+
],
297+
);
298+
}

vidyut-prakriya/www/static/vidyut-prakriya-app.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -467,7 +467,7 @@ const App = () => ({
467467

468468
stepClasses(step) {
469469
const code = step.rule.code;
470-
let minor = new Set(["1.3.1", "1.3.2", "1.3.3", "1.3.4", "1.3.5", "1.3.6", "1.3.7", "1.3.8", "1.3.9", "1.2.45", "3.4.114", "1.1.43",
470+
let minor = new Set(["1.1.51", "1.3.1", "1.3.2", "1.3.3", "1.3.4", "1.3.5", "1.3.6", "1.3.7", "1.3.8", "1.3.9", "1.2.45", "3.4.114", "1.1.43",
471471
"1.4.58", "1.4.59", "1.4.60", "1.4.80", "6.1.4", "6.1.5", "8.4.68", "3.4.113", "2.3.48", "1.4.17", "2.3.49", "1.4.7",
472472
]);
473473
let samjna = new Set (["1.2.46", "1.4.14", "3.1.32"]);

0 commit comments

Comments
 (0)